X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/52842a126c4c26d34b117c698660c8eecb1fe962..a05832ea10a61d2db9acbb5a8914a34b72e6f841:/core/nsmalloc.c diff --git a/core/nsmalloc.c b/core/nsmalloc.c index 761faf70..901987cc 100644 --- a/core/nsmalloc.c +++ b/core/nsmalloc.c @@ -1,8 +1,6 @@ /* nsmalloc: Simple pooled malloc() thing. */ #include -#include -#include #include "nsmalloc.h" #define __NSMALLOC_C @@ -12,32 +10,9 @@ #include "../core/hooks.h" #include "../core/error.h" -void *nsmalloc(unsigned int poolid, size_t size); -void nsfree(unsigned int poolid, void *ptr); -void nsfreeall(unsigned int poolid); +struct nsmpool nsmpools[MAXPOOL]; -struct nsminfo { - struct nsminfo *next; - struct nsminfo *prev; - - size_t size; - char data[]; -}; - -struct nsmpool { - struct nsminfo first; - - unsigned long count; - size_t size; -}; - -struct nsmpool pools[MAXPOOL]; - -void nsmstats(int hookhum, void *arg); - -void initnsmalloc(void) { - registerhook(HOOK_CORE_STATSREQUEST, &nsmstats); -} +#ifndef USE_NSMALLOC_VALGRIND void *nsmalloc(unsigned int poolid, size_t size) { struct nsminfo *nsmp; @@ -52,14 +27,14 @@ void *nsmalloc(unsigned int poolid, size_t size) { return NULL; nsmp->size=size; - pools[poolid].size+=size; - pools[poolid].count++; + nsmpools[poolid].size+=size; + nsmpools[poolid].count++; - nsmp->next=pools[poolid].first.next; - nsmp->prev=&pools[poolid].first; - if (pools[poolid].first.next) - pools[poolid].first.next->prev=nsmp; - pools[poolid].first.next=nsmp; + nsmp->next=nsmpools[poolid].first.next; + nsmp->prev=&nsmpools[poolid].first; + if (nsmpools[poolid].first.next) + nsmpools[poolid].first.next->prev=nsmp; + nsmpools[poolid].first.next=nsmp; return (void *)nsmp->data; } @@ -68,7 +43,7 @@ void *nsmalloc(unsigned int poolid, size_t size) { void nsfree(unsigned int poolid, void *ptr) { struct nsminfo *nsmp; - if (poolid >= MAXPOOL) + if (!ptr || poolid >= MAXPOOL) return; /* evil */ @@ -79,8 +54,8 @@ void nsfree(unsigned int poolid, void *ptr) { if (nsmp->next) nsmp->next->prev=nsmp->prev; - pools[poolid].size-=nsmp->size; - pools[poolid].count--; + nsmpools[poolid].size-=nsmp->size; + nsmpools[poolid].count--; free(nsmp); return; @@ -110,7 +85,7 @@ void *nsrealloc(unsigned int poolid, void *ptr, size_t size) { if (!nsmpn) return NULL; - pools[poolid].size+=size-nsmpn->size; + nsmpools[poolid].size+=size-nsmpn->size; nsmpn->size=size; /* always set as we have a sentinel */ @@ -128,22 +103,22 @@ void nsfreeall(unsigned int poolid) { if (poolid >= MAXPOOL) return; - for (nsmp=pools[poolid].first.next;nsmp;nsmp=nnsmp) { + for (nsmp=nsmpools[poolid].first.next;nsmp;nsmp=nnsmp) { nnsmp=nsmp->next; free(nsmp); } - pools[poolid].first.next=NULL; - pools[poolid].size=0; - pools[poolid].count=0; + nsmpools[poolid].first.next=NULL; + nsmpools[poolid].size=0; + nsmpools[poolid].count=0; } void nscheckfreeall(unsigned int poolid) { if (poolid >= MAXPOOL) return; - if (pools[poolid].first.next) { - Error("core",ERR_INFO,"nsmalloc: Blocks still allocated in pool #%d (%s): %lub, %lu items",poolid,poolnames[poolid]?poolnames[poolid]:"??",pools[poolid].size,pools[poolid].count); + if (nsmpools[poolid].first.next) { + Error("core",ERR_INFO,"nsmalloc: Blocks still allocated in pool #%d (%s): %zub, %lu items",poolid,nsmpoolnames[poolid]?nsmpoolnames[poolid]:"??",nsmpools[poolid].size,nsmpools[poolid].count); nsfreeall(poolid); } } @@ -152,58 +127,32 @@ void nsexit(void) { unsigned int i; for (i=0;icount) - continue; - - realsize=pool->size + pool->count * sizeof(struct nsminfo) + sizeof(struct nsmpool); - - snprintf(header, sizeof(header), "NSMalloc: pool %2d (%s): ", i, poolnames[i]?poolnames[i]:"??"); - - if(level > 10) { - snprintf(buf, sizeof(buf), "%s %s", header, formatmbuf(pool->count, pool->size, realsize)); - triggerhook(HOOK_CORE_STATSREPLY, buf); - } +void *nsrealloc(unsigned int poolid, void *ptr, size_t size) { + return realloc(ptr, size); +} - totalsize+=pool->size; - totalrealsize+=realsize; - totalcount+=pool->count; +void nsfree(unsigned int poolid, void *ptr) { + if(ptr) + free(ptr); +} - if(level > 100) { - struct nsminfo *np = pool->first.next; - double mean = (double)pool->size / pool->count, variance; - unsigned long long int sumsq = 0; +void nsfreeall(unsigned int poolid) { +} - for (np=pool->first.next;np;np=np->next) - sumsq+=np->size * np->size; +void nsexit(void) { +} - variance=(double)sumsq / pool->count - mean * mean; +void nscheckfreeall(unsigned int poolid) { +} - snprintf(buf, sizeof(buf), "%s allocation sumsq: %llu mean: %.2f variance: %.2f stddev: %.2f", header, sumsq, mean, variance, sqrtf(variance)); - triggerhook(HOOK_CORE_STATSREPLY, buf); - } - } +#endif - snprintf(buf, sizeof(buf), "NSMalloc: pool totals: %s", formatmbuf(totalcount, totalsize, totalrealsize)); - triggerhook(HOOK_CORE_STATSREPLY, buf); -}