|
|
|
#ifndef __MCACHE_H__
|
|
|
|
#define __MCACHE_H__
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <time.h>
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <pthread.h>
|
|
|
|
|
|
|
|
#include <tdata/usrtc.h>
|
|
|
|
#include <tdata/idx_allocator.h>
|
|
|
|
|
|
|
|
#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__ */
|