/* nsmalloc: Simple pooled malloc() thing. */
#include <stdlib.h>
+#include <string.h>
#include "nsmalloc.h"
#define __NSMALLOC_C
#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;
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;
}
+void *nscalloc(unsigned int poolid, size_t nmemb, size_t size) {
+ size_t total = nmemb * size;
+ void *m;
+
+ m = nsmalloc(poolid, total);
+ if(!m)
+ return NULL;
+
+ memset(m, 0, total);
+
+ return m;
+}
+
/* we dump core on ptr == NULL */
void nsfree(unsigned int poolid, void *ptr) {
struct nsminfo *nsmp;
- if (poolid >= MAXPOOL)
+ if (!ptr || poolid >= MAXPOOL)
return;
/* evil */
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;
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 */
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);
}
}
-void nsexit() {
+void nsexit(void) {
unsigned int i;
for (i=0;i<MAXPOOL;i++)
- nscheckfreeall(i);
+ nsfreeall(i);
}
-int nspoolstats(unsigned int poolid, size_t *size, unsigned long *count, char **poolname, size_t *realsize) {
- if (poolid >= MAXPOOL)
- return 0;
+#else
+
+void *nsmalloc(unsigned int poolid, size_t size) {
+ return malloc(size);
+}
- *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 *nscalloc(unsigned int poolid, size_t nmemb, size_t size) {
+ return calloc(nmemb, size);
+}
+
+void *nsrealloc(unsigned int poolid, void *ptr, size_t size) {
+ return realloc(ptr, size);
+}
- return 1;
+void nsfree(unsigned int poolid, void *ptr) {
+ if(ptr)
+ free(ptr);
+}
+
+void nsfreeall(unsigned int poolid) {
}
+
+void nsexit(void) {
+}
+
+void nscheckfreeall(unsigned int poolid) {
+}
+
+#endif
+