123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371 |
- struct pool_header {
- struct pool_header *next;
- };
- typedef struct {
- struct pool_header *next;
- size_t object_size;
- unsigned align;
- memgetfunc_t provider;
- } memory_pool_t;
- typedef struct {
- semaphore_t sem;
- memory_pool_t pool;
- } guarded_memory_pool_t;
- {NULL, size, align, provider}
- memory_pool_t name = _MEMORYPOOL_DATA(name, size, align, provider)
- _SEMAPHORE_DATA(name.sem, (cnt_t)0), \
- _MEMORYPOOL_DATA(NULL, size, align, NULL) \
- }
- guarded_memory_pool_t name = _GUARDEDMEMORYPOOL_DATA(name, size, align)
- extern "C" {
- void chPoolObjectInitAligned(memory_pool_t *mp, size_t size,
- unsigned align, memgetfunc_t provider);
- void chPoolLoadArray(memory_pool_t *mp, void *p, size_t n);
- void *chPoolAllocI(memory_pool_t *mp);
- void *chPoolAlloc(memory_pool_t *mp);
- void chPoolFreeI(memory_pool_t *mp, void *objp);
- void chPoolFree(memory_pool_t *mp, void *objp);
- void chGuardedPoolObjectInitAligned(guarded_memory_pool_t *gmp,
- size_t size,
- unsigned align);
- void chGuardedPoolLoadArray(guarded_memory_pool_t *gmp, void *p, size_t n);
- void *chGuardedPoolAllocTimeoutS(guarded_memory_pool_t *gmp,
- sysinterval_t timeout);
- void *chGuardedPoolAllocTimeout(guarded_memory_pool_t *gmp,
- sysinterval_t timeout);
- void chGuardedPoolFree(guarded_memory_pool_t *gmp, void *objp);
- }
- static inline void chPoolObjectInit(memory_pool_t *mp,
- size_t size,
- memgetfunc_t provider) {
- chPoolObjectInitAligned(mp, size, PORT_NATURAL_ALIGN, provider);
- }
- static inline void chPoolAdd(memory_pool_t *mp, void *objp) {
- chPoolFree(mp, objp);
- }
- static inline void chPoolAddI(memory_pool_t *mp, void *objp) {
- chPoolFreeI(mp, objp);
- }
- static inline void chGuardedPoolObjectInit(guarded_memory_pool_t *gmp,
- size_t size) {
- chGuardedPoolObjectInitAligned(gmp, size, PORT_NATURAL_ALIGN);
- }
- static inline void *chGuardedPoolAllocI(guarded_memory_pool_t *gmp) {
- void *p;
- p = chPoolAllocI(&gmp->pool);
- if (p != NULL) {
- chSemFastWaitI(&gmp->sem);
- chDbgAssert(chSemGetCounterI(&gmp->sem) >= (cnt_t)0,
- "semaphore out of sync");
- }
- return p;
- }
- static inline void chGuardedPoolFreeI(guarded_memory_pool_t *gmp, void *objp) {
- chPoolFreeI(&gmp->pool, objp);
- chSemSignalI(&gmp->sem);
- }
- static inline void chGuardedPoolFreeS(guarded_memory_pool_t *gmp, void *objp) {
- chGuardedPoolFreeI(gmp, objp);
- chSchRescheduleS();
- }
- static inline void chGuardedPoolAdd(guarded_memory_pool_t *gmp, void *objp) {
- chGuardedPoolFree(gmp, objp);
- }
- static inline void chGuardedPoolAddI(guarded_memory_pool_t *gmp, void *objp) {
- chGuardedPoolFreeI(gmp, objp);
- }
- static inline void chGuardedPoolAddS(guarded_memory_pool_t *gmp, void *objp) {
- chGuardedPoolFreeS(gmp, objp);
- }
|