]>
jfr.im git - irc/quakenet/newserv.git/blob - core/nsmalloc.c
1 /* nsmalloc: Simple pooled malloc() thing. */
10 #include "../core/error.h"
12 void * nsmalloc ( unsigned int poolid
, size_t size
);
13 void nsfree ( unsigned int poolid
, void * ptr
);
14 void nsfreeall ( unsigned int poolid
);
31 struct nsmpool pools
[ MAXPOOL
];
33 void * nsmalloc ( unsigned int poolid
, size_t size
) {
36 if ( poolid
>= MAXPOOL
)
39 /* Allocate enough for the structure and the required data */
40 nsmp
=( struct nsminfo
*) malloc ( sizeof ( struct nsminfo
)+ size
);
46 pools
[ poolid
]. size
+= size
;
47 pools
[ poolid
]. count
++;
49 nsmp
-> next
= pools
[ poolid
]. first
. next
;
50 nsmp
-> prev
=& pools
[ poolid
]. first
;
51 if ( pools
[ poolid
]. first
. next
)
52 pools
[ poolid
]. first
. next
-> prev
= nsmp
;
53 pools
[ poolid
]. first
. next
= nsmp
;
55 return ( void *) nsmp
-> data
;
58 /* we dump core on ptr == NULL */
59 void nsfree ( unsigned int poolid
, void * ptr
) {
62 if ( poolid
>= MAXPOOL
)
66 nsmp
=( struct nsminfo
*) ptr
- 1 ;
68 /* always set as we have a sentinel */
69 nsmp
-> prev
-> next
= nsmp
-> next
;
71 nsmp
-> next
-> prev
= nsmp
-> prev
;
73 pools
[ poolid
]. size
-= nsmp
-> size
;
74 pools
[ poolid
]. count
--;
80 void * nsrealloc ( unsigned int poolid
, void * ptr
, size_t size
) {
81 struct nsminfo
* nsmp
, * nsmpn
;
84 return nsmalloc ( poolid
, size
);
91 if ( poolid
>= MAXPOOL
)
95 nsmp
=( struct nsminfo
*) ptr
- 1 ;
97 if ( size
== nsmp
-> size
)
98 return ( void *) nsmp
-> data
;
100 nsmpn
=( struct nsminfo
*) realloc ( nsmp
, sizeof ( struct nsminfo
)+ size
);
104 pools
[ poolid
]. size
+= size
- nsmpn
-> size
;
107 /* always set as we have a sentinel */
108 nsmpn
-> prev
-> next
= nsmpn
;
111 nsmpn
-> next
-> prev
= nsmpn
;
113 return ( void *) nsmpn
-> data
;
116 void nsfreeall ( unsigned int poolid
) {
117 struct nsminfo
* nsmp
, * nnsmp
;
119 if ( poolid
>= MAXPOOL
)
122 for ( nsmp
= pools
[ poolid
]. first
. next
; nsmp
; nsmp
= nnsmp
) {
127 pools
[ poolid
]. first
. next
= NULL
;
128 pools
[ poolid
]. size
= 0 ;
129 pools
[ poolid
]. count
= 0 ;
132 void nscheckfreeall ( unsigned int poolid
) {
133 if ( poolid
>= MAXPOOL
)
136 if ( pools
[ poolid
]. first
. next
) {
137 Error ( "core" , ERR_INFO
, "nsmalloc: Blocks still allocated in pool # %d ( %s ): %l ub, %l u items" , poolid
, poolnames
[ poolid
]? poolnames
[ poolid
]: "??" , pools
[ poolid
]. size
, pools
[ poolid
]. count
);
145 for ( i
= 0 ; i
< MAXPOOL
; i
++)
149 int nspoolstats ( unsigned int poolid
, size_t * size
, unsigned long * count
, char ** poolname
, size_t * realsize
) {
150 if ( poolid
>= MAXPOOL
)
153 * size
= pools
[ poolid
]. size
;
154 * realsize
= pools
[ poolid
]. size
+ pools
[ poolid
]. count
* sizeof ( struct nsminfo
) + sizeof ( struct nsmpool
);
155 * count
= pools
[ poolid
]. count
;
156 * poolname
= poolnames
[ poolid
];