#ifndef __MCACHE_H__ #define __MCACHE_H__ #include #include #include #include #include #include #define _MCACHE_MAGIC 0xabcdbeef #define _MPG_SIZE 4096 #define _MCACHE_EMINSIZE sizeof(unsigned long) + 8 #define _MCACHE_EMAXSIZE sizeof(unsigned long) + 224 #define _MCACHE_PREALLOC (1 << 1) /* preallocate elements on initialization */ #define _MCACHE_ALLOCAHEAD (1 << 2) /* allocate more ahead */ #define _MCACHE_MEMFREE (1 << 3) /* free as possible */ /* this structure used to store info on page, and located * at the beginning of the allocated page */ struct _mpg { void *addr; unsigned int use; usrtc_node_t node; } __attribute__((packed)); typedef struct __sntl_mcache_ { unsigned int magic; /** < first 32bit to check it */ usrtc_t pg_tree; /** < pages tree */ size_t esize; /** < element size*/ pthread_rwlock_t lock; /** < thread safe cap */ usrtc_t allocated; /** < allocated elements to increase allocation */ usrtc_t used; /** < used ones */ unsigned int epc; /** < elements per cache page */ int flags; /** < flags of the cache */ } sntl_mcache_t; int sntl_mcache_init(sntl_mcache_t*, size_t, int); void* sntl_mcache_alloc(sntl_mcache_t*); void sntl_mcache_free(void*); void sntl_mcache_destroy(sntl_mcache_t*); #endif /* __MCACHE_H__ */