]>
jfr.im git - irc/quakenet/newserv.git/blob - core/nsmalloc.c
1 /* nsmalloc: Simple pooled malloc() thing. */
6 #include "../core/error.h"
8 void *nsmalloc(unsigned int poolid
, size_t size
);
9 void nsfree(unsigned int poolid
, void *ptr
);
10 void nsfreeall(unsigned int poolid
);
23 struct nsminfo pools
[MAXPOOL
];
25 void *nsmalloc(unsigned int poolid
, size_t size
) {
28 if (poolid
>= MAXPOOL
)
31 /* Allocate enough for the structure and the required data */
32 nsmp
=(struct nsminfo
*)malloc(sizeof(struct nsminfo
)+size
);
38 pools
[poolid
].size
+=size
;
39 pools
[poolid
].p
.count
++;
41 nsmp
->next
=pools
[poolid
].next
;
42 nsmp
->p
.prev
=&pools
[poolid
];
43 if (pools
[poolid
].next
)
44 pools
[poolid
].next
->p
.prev
=nsmp
;
45 pools
[poolid
].next
=nsmp
;
47 return (void *)nsmp
->data
;
50 /* we dump core on ptr == NULL */
51 void nsfree(unsigned int poolid
, void *ptr
) {
54 if (poolid
>= MAXPOOL
)
58 nsmp
=(struct nsminfo
*)ptr
- 1;
60 /* always set as we have a sentinel */
61 nsmp
->p
.prev
->next
=nsmp
->next
;
63 nsmp
->next
->p
.prev
=nsmp
->p
.prev
;
65 pools
[poolid
].size
-=nsmp
->size
;
66 pools
[poolid
].p
.count
--;
72 void *nsrealloc(unsigned int poolid
, void *ptr
, size_t size
) {
73 struct nsminfo
*nsmp
, *nsmpn
;
76 return nsmalloc(poolid
, size
);
83 if (poolid
>= MAXPOOL
)
87 nsmp
=(struct nsminfo
*)ptr
- 1;
89 if (size
== nsmp
->size
)
90 return (void *)nsmp
->data
;
92 nsmpn
=(struct nsminfo
*)realloc(nsmp
, sizeof(struct nsminfo
)+size
);
96 pools
[poolid
].size
+=size
-nsmpn
->size
;
99 /* always set as we have a sentinel */
100 nsmpn
->p
.prev
->next
=nsmpn
;
103 nsmpn
->next
->p
.prev
=nsmpn
;
105 return (void *)nsmpn
->data
;
108 void nsfreeall(unsigned int poolid
) {
109 struct nsminfo
*nsmp
, *nnsmp
;
111 if (poolid
>= MAXPOOL
)
114 for (nsmp
=pools
[poolid
].next
;nsmp
;nsmp
=nnsmp
) {
119 pools
[poolid
].next
=NULL
;
120 pools
[poolid
].size
=0;
121 pools
[poolid
].p
.count
=0;
127 for (i
=0;i
<MAXPOOL
;i
++) {
129 Error("core",ERR_INFO
,"nsmalloc: Blocks still allocated in pool #%d (%lub, %lu items)\n",i
,pools
[i
].size
, pools
[i
].p
.count
);
135 int nspoolstats(unsigned int poolid
, size_t *size
, unsigned long *count
) {
136 if (poolid
>= MAXPOOL
)
139 *size
= pools
[poolid
].size
;
140 *count
= pools
[poolid
].p
.count
;