X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/271ef2d2665fa40ca39f4b65fc4c2936b59549f7..a05832ea10a61d2db9acbb5a8914a34b72e6f841:/core/nsmalloc.c diff --git a/core/nsmalloc.c b/core/nsmalloc.c index e4b03334..901987cc 100644 --- a/core/nsmalloc.c +++ b/core/nsmalloc.c @@ -7,28 +7,12 @@ #undef __NSMALLOC_H #include "nsmalloc.h" +#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]; +#ifndef USE_NSMALLOC_VALGRIND void *nsmalloc(unsigned int poolid, size_t size) { struct nsminfo *nsmp; @@ -43,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; } @@ -59,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 */ @@ -70,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; @@ -101,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 */ @@ -119,35 +103,56 @@ 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 (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); + } } -void nsexit() { +void nsexit(void) { unsigned int i; - for (i=0;i= MAXPOOL) - return 0; +#else + +void *nsmalloc(unsigned int poolid, size_t size) { + return malloc(size); +} + +void *nsrealloc(unsigned int poolid, void *ptr, size_t size) { + return realloc(ptr, size); +} + +void nsfree(unsigned int poolid, void *ptr) { + if(ptr) + free(ptr); +} - *size = pools[poolid].size; - *realsize = pools[poolid].size + pools[poolid].count * sizeof(struct nsminfo) + sizeof(struct nsmpool); - *count = pools[poolid].count; - *poolname = poolnames[poolid]; +void nsfreeall(unsigned int poolid) { +} - return 1; +void nsexit(void) { } + +void nscheckfreeall(unsigned int poolid) { +} + +#endif +