]>
jfr.im git - irc/quakenet/newserv.git/blob - core/nsmalloc.c
1 /* nsmalloc: Simple pooled malloc() thing. */
11 #include "../core/hooks.h"
12 #include "../core/error.h"
14 struct nsmpool nsmpools
[ MAXPOOL
];
16 #ifndef USE_NSMALLOC_VALGRIND
18 void * nsmalloc ( unsigned int poolid
, size_t size
) {
21 if ( poolid
>= MAXPOOL
)
24 /* Allocate enough for the structure and the required data */
25 nsmp
=( struct nsminfo
*) malloc ( sizeof ( struct nsminfo
)+ size
);
31 nsmpools
[ poolid
]. size
+= size
;
32 nsmpools
[ poolid
]. count
++;
34 nsmp
-> next
= nsmpools
[ poolid
]. first
. next
;
35 nsmp
-> prev
=& nsmpools
[ poolid
]. first
;
36 if ( nsmpools
[ poolid
]. first
. next
)
37 nsmpools
[ poolid
]. first
. next
-> prev
= nsmp
;
38 nsmpools
[ poolid
]. first
. next
= nsmp
;
40 return ( void *) nsmp
-> data
;
43 void * nscalloc ( unsigned int poolid
, size_t nmemb
, size_t size
) {
44 size_t total
= nmemb
* size
;
47 m
= nsmalloc ( poolid
, total
);
56 /* we dump core on ptr == NULL */
57 void nsfree ( unsigned int poolid
, void * ptr
) {
60 if (! ptr
|| poolid
>= MAXPOOL
)
64 nsmp
=( struct nsminfo
*) ptr
- 1 ;
66 /* always set as we have a sentinel */
67 nsmp
-> prev
-> next
= nsmp
-> next
;
69 nsmp
-> next
-> prev
= nsmp
-> prev
;
71 nsmpools
[ poolid
]. size
-= nsmp
-> size
;
72 nsmpools
[ poolid
]. count
--;
78 void * nsrealloc ( unsigned int poolid
, void * ptr
, size_t size
) {
79 struct nsminfo
* nsmp
, * nsmpn
;
82 return nsmalloc ( poolid
, size
);
89 if ( poolid
>= MAXPOOL
)
93 nsmp
=( struct nsminfo
*) ptr
- 1 ;
95 if ( size
== nsmp
-> size
)
96 return ( void *) nsmp
-> data
;
98 nsmpn
=( struct nsminfo
*) realloc ( nsmp
, sizeof ( struct nsminfo
)+ size
);
102 nsmpools
[ poolid
]. size
+= size
- nsmpn
-> size
;
105 /* always set as we have a sentinel */
106 nsmpn
-> prev
-> next
= nsmpn
;
109 nsmpn
-> next
-> prev
= nsmpn
;
111 return ( void *) nsmpn
-> data
;
114 void nsfreeall ( unsigned int poolid
) {
115 struct nsminfo
* nsmp
, * nnsmp
;
117 if ( poolid
>= MAXPOOL
)
120 for ( nsmp
= nsmpools
[ poolid
]. first
. next
; nsmp
; nsmp
= nnsmp
) {
125 nsmpools
[ poolid
]. first
. next
= NULL
;
126 nsmpools
[ poolid
]. size
= 0 ;
127 nsmpools
[ poolid
]. count
= 0 ;
130 void nscheckfreeall ( unsigned int poolid
) {
131 if ( poolid
>= MAXPOOL
)
134 if ( nsmpools
[ poolid
]. first
. next
) {
135 Error ( "core" , ERR_INFO
, "nsmalloc: Blocks still allocated in pool # %d ( %s ): %z ub, %l u items" , poolid
, nsmpoolnames
[ poolid
]? nsmpoolnames
[ poolid
]: "??" , nsmpools
[ poolid
]. size
, nsmpools
[ poolid
]. count
);
143 for ( i
= 0 ; i
< MAXPOOL
; i
++)
149 void * nsmalloc ( unsigned int poolid
, size_t size
) {
153 void * nscalloc ( unsigned int poolid
, size_t nmemb
, size_t size
) {
154 return calloc ( nmemb
, size
);
157 void * nsrealloc ( unsigned int poolid
, void * ptr
, size_t size
) {
158 return realloc ( ptr
, size
);
161 void nsfree ( unsigned int poolid
, void * ptr
) {
166 void nsfreeall ( unsigned int poolid
) {
172 void nscheckfreeall ( unsigned int poolid
) {