/* BEGIN_ICS_COPYRIGHT3 **************************************** Copyright (c) 2015, Intel Corporation Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Intel Corporation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** END_ICS_COPYRIGHT3 ****************************************/ /* [ICS VERSION STRING: unknown] */ #ifndef _IBA_PUBLIC_IRESMGR_H_ #define _IBA_PUBLIC_IRESMGR_H_ #include "iba/public/ilist.h" #include "iba/public/ireqmgr.h" #include "iba/public/iobjmgr.h" #ifdef __cplusplus extern "C" { #endif /* * The free pool object provides an asynchronous free pool of available objects. * If no objects are available, it queues a request. A free pool manages * resources but does not create them. */ /* * Free pool object definition. */ typedef struct _FREE_POOL { /* Available elements in free pool. */ STACK m_Stack; /* DO NOT USE!! */ /* Pending requests for elements. */ QUEUE m_RequestQueue; /* DO NOT USE!! */ /* Requests are dynamically allocated and added to the stack. */ STACK m_FreeRequestStack; /* DO NOT USE!! */ boolean m_Initialized; /* DO NOT USE!! */ } FREE_POOL; /* * Function declarations. */ /* Create a new free pool. */ void FreePoolInitState( IN FREE_POOL* const pFreePool ); boolean FreePoolInit( IN FREE_POOL* const pFreePool, IN const uint32 MinItems ); void FreePoolDestroy( IN FREE_POOL* const pFreePool ); /* Get/free resources. */ boolean FreePoolPut( IN FREE_POOL* const pFreePool, IN void* const pObject ); boolean FreePoolPutArray( IN FREE_POOL* const pFreePool, IN void* const pArray, IN const uint32 ItemCount, IN const uint32 ItemSize ); void* FreePoolGet( IN FREE_POOL* const pFreePool); /* Check the free pool to see if a request can be completed, queue * a request, or get a request that can be completed. */ uint32 FreePoolCheck( IN const FREE_POOL* const pFreePool, IN const uint32 Count, IN const boolean PartialOk ); boolean FreePoolQueueRequest( IN FREE_POOL* const pFreePool, IN const uint32 Count, IN const boolean PartialOk, IN REQ_CALLBACK pfnCallback, IN void* const Context1, IN void* const Context2 ); boolean FreePoolDequeueRequest( IN FREE_POOL* const pFreePool, OUT REQUEST_OBJECT* const pRequest ); /* Return number of objects in the free pool. */ uint32 FreePoolFreeCount( IN const FREE_POOL* const pFreePool ); /* Initialize every object in the resource manager with the specified * function. */ void FreePoolApplyFunc( IN const FREE_POOL* const pFreePool, IN LIST_APPLY_FUNC pfnFunc, IN void* const Context ); /* * The resource manager object manages the allocation, deallocation, and * distribution of objects. */ /* * Resource manager object definition. */ typedef struct _RES_MGR { /* Private data structure used by the resource manager object. */ /* Users should not access these variables directly. */ FREE_POOL m_FreePool; /* DO NOT USE!! */ /* These variables are exposed to the user to allow the memory to be */ /* pinned, registered, etc. */ uint32 m_ItemCount; /* DO NOT USE!! */ void *m_pArray; /* DO NOT USE!! */ uint32 m_ArraySize; /* DO NOT USE!! */ } RES_MGR; /* * Function declarations. */ /* Create a new resource manager. */ /* Initializes, Allocates/frees the resources dynamically. */ void ResMgrInitState( IN RES_MGR* const pResMgr ); boolean ResMgrInit( IN RES_MGR* const pResMgr, IN const uint32 ObjectCount, IN uint32 ObjectSize, IN const uint32 ByteAlignment, IN const uint32 AlignmentOffset ); void ResMgrDestroy( IN RES_MGR* const pResMgr ); /* Get/free resources. */ boolean ResMgrPut( IN RES_MGR* const pResMgr, IN void* const pObject ); boolean ResMgrPutArray( IN RES_MGR* const pResMgr, IN void* const pArray, IN const uint32 ItemCount, IN const uint32 ItemSize ); void* ResMgrGet( IN RES_MGR* const pResMgr ); /* Check the free pool to see if a request can be completed, queue * a request, or get a request that can be completed. */ uint32 ResMgrCheck( IN const RES_MGR* const pResMgr, IN const uint32 Count, IN const boolean PartialOk ); boolean ResMgrQueueRequest( IN RES_MGR* const pResMgr, IN const uint32 Count, IN const boolean PartialOk, IN REQ_CALLBACK Callback, IN void* const Context1, IN void* const Context2 ); boolean ResMgrDequeueRequest( IN RES_MGR* const pResMgr, OUT REQUEST_OBJECT* const pRequest ); /* Return number of objects in the free pool. */ uint32 ResMgrFreeCount( IN const RES_MGR* const pResMgr ); /* Initialize every object in the resource manager with the specified * function. */ void ResMgrApplyFunc( IN const RES_MGR* const pResMgr, IN LIST_APPLY_FUNC Func, IN void* const Context ); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* _IBA_PUBLIC_IRESMGR_H_ */