From 00406e054c0968a3f3c96bb0ed0fcc0bc9b7aa06 Mon Sep 17 00:00:00 2001 From: Alexander Vdolainen Date: Fri, 26 Dec 2014 17:25:33 +0200 Subject: [PATCH] initial commit; --- include/sntl/mcache.h | 4 ++-- lib/mcache.c | 47 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/include/sntl/mcache.h b/include/sntl/mcache.h index 90b0527..6eed963 100644 --- a/include/sntl/mcache.h +++ b/include/sntl/mcache.h @@ -26,7 +26,7 @@ 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 */ @@ -37,7 +37,7 @@ typedef struct __sntl_mcache_ { usrtc_t used; /** < used ones */ unsigned int epc; /** < elements per cache page */ int flags; /** < flags of the cache */ -} cntl_mcache_t; +} sntl_mcache_t; int sntl_mcache_init(sntl_mcache_t*, size_t, int); diff --git a/lib/mcache.c b/lib/mcache.c index ba7a3f5..0ac2814 100644 --- a/lib/mcache.c +++ b/lib/mcache.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -21,9 +22,53 @@ #include +static long __cmp_longs(const void *a, const void *b) +{ + return (long)(*(unsigned long*)a - *(unsigned long*)b); +} + int sntl_mcache_init(sntl_mcache_t *mc, size_t esize, int flags) { - return EINVAL; + int r = 0, i; + usrtc_t *tree; + void *pt; + struct _mpg *pg; + + /* check it */ + if((esize < _MCACHE_EMINSIZE) || (esize > _MCACHE_EMAXSIZE)) return EINVAL; + + /* yep, nil it */ + memset(mc, 0, sizeof(sntl_mcache_t)); + + mc->magic = _MCACHE_MAGIC; /* let it be */ + + if((r = pthread_rwlock_init(&(mc->lock), NULL))) return -r; + + /* init trees */ + for(i = 0; i < 3; i ++) { + switch(i) { + case 0: tree = &(mc->pg_tree); break; + case 1: tree = &(mc->allocated); break; + case 2: tree = &(mc->used); break; + } + usrtc_init(tree, USRTC_REDBLACK, 129038, __cmp_longs); + } + + /* deal with flags */ + mc->flags = flags; + /* sizes */ + mc->esize = esize + sizeof(unsigned long); + mc->epc = (_MPG_SIZE - sizeof(struct _mpg)) / mc->esize; + + if((flags & _MCACHE_PREALLOC)) { + pt = mmap(NULL, _MPG_SIZE, PROT_READ|PROT_WRITE, MAP_ANONYMOUS, -1, 0); + if(pt == MAP_FAILED) { + pthread_rwlock_destroy(&(mc->lock)); + return ENOMEM; + } else pg = (struct _mpg *)pt; + } + + return r; } void* sntl_mcache_alloc(sntl_mcache_t *mc)