]>
jfr.im git - irc/quakenet/newserv.git/blob - core/nsmalloc.c
1 /* nsmalloc: Simple pooled malloc() thing. */
11 #include "../lib/valgrind.h"
12 #include "../lib/memcheck.h"
13 #include "../core/hooks.h"
14 #include "../core/error.h"
16 struct nsmpool nsmpools
[ MAXPOOL
];
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
);
30 VALGRIND_CREATE_MEMPOOL ( nsmp
, 0 , 0 );
33 nsmpools
[ poolid
]. size
+= size
;
34 nsmpools
[ poolid
]. count
++;
36 if ( nsmpools
[ poolid
]. blocks
) {
37 VALGRIND_MAKE_MEM_DEFINED ( nsmpools
[ poolid
]. blocks
, sizeof ( struct nsminfo
));
38 nsmpools
[ poolid
]. blocks
-> prev
= nsmp
;
39 VALGRIND_MAKE_MEM_UNDEFINED ( nsmpools
[ poolid
]. blocks
, sizeof ( struct nsminfo
));
41 nsmp
-> next
= nsmpools
[ poolid
]. blocks
;
43 nsmpools
[ poolid
]. blocks
= nsmp
;
45 VALGRIND_MEMPOOL_ALLOC ( nsmp
, nsmp
-> data
, nsmp
-> size
);
46 VALGRIND_MAKE_MEM_NOACCESS ( nsmp
, sizeof ( struct nsminfo
));
48 return ( void *) nsmp
-> data
;
51 void * nscalloc ( unsigned int poolid
, size_t nmemb
, size_t size
) {
52 size_t total
= nmemb
* size
;
55 m
= nsmalloc ( poolid
, total
);
64 void nsfree ( unsigned int poolid
, void * ptr
) {
67 if (! ptr
|| poolid
>= MAXPOOL
)
71 nsmp
=( struct nsminfo
*) ptr
- 1 ;
73 VALGRIND_MAKE_MEM_DEFINED ( nsmp
, sizeof ( struct nsminfo
));
76 VALGRIND_MAKE_MEM_DEFINED ( nsmp
-> prev
, sizeof ( struct nsminfo
));
77 nsmp
-> prev
-> next
= nsmp
-> next
;
78 VALGRIND_MAKE_MEM_UNDEFINED ( nsmp
-> prev
, sizeof ( struct nsminfo
));
80 nsmpools
[ poolid
]. blocks
= NULL
;
83 VALGRIND_MAKE_MEM_DEFINED ( nsmp
-> next
, sizeof ( struct nsminfo
));
84 nsmp
-> next
-> prev
= nsmp
-> prev
;
85 VALGRIND_MAKE_MEM_UNDEFINED ( nsmp
-> next
, sizeof ( struct nsminfo
));
88 nsmpools
[ poolid
]. size
-= nsmp
-> size
;
89 nsmpools
[ poolid
]. count
--;
91 VALGRIND_MEMPOOL_FREE ( nsmp
, nsmp
-> data
);
93 VALGRIND_DESTROY_MEMPOOL ( nsmp
);
98 void * nsrealloc ( unsigned int poolid
, void * ptr
, size_t size
) {
99 struct nsminfo
* nsmp
, * nsmpn
;
102 return nsmalloc ( poolid
, size
);
109 if ( poolid
>= MAXPOOL
)
113 nsmp
=( struct nsminfo
*) ptr
- 1 ;
115 VALGRIND_MAKE_MEM_DEFINED ( nsmp
, sizeof ( struct nsminfo
));
117 if ( size
== nsmp
-> size
) {
118 VALGRIND_MAKE_MEM_UNDEFINED ( nsmp
, sizeof ( struct nsminfo
));
119 return ( void *) nsmp
-> data
;
122 nsmpn
=( struct nsminfo
*) realloc ( nsmp
, sizeof ( struct nsminfo
)+ size
);
124 VALGRIND_MAKE_MEM_UNDEFINED ( nsmp
, sizeof ( struct nsminfo
));
128 VALGRIND_MOVE_MEMPOOL ( nsmp
, nsmpn
);
130 nsmpools
[ poolid
]. size
+= size
- nsmpn
-> size
;
134 VALGRIND_MAKE_MEM_DEFINED ( nsmpn
-> prev
, sizeof ( struct nsminfo
));
135 nsmpn
-> prev
-> next
= nsmpn
;
136 VALGRIND_MAKE_MEM_UNDEFINED ( nsmpn
-> prev
, sizeof ( struct nsminfo
));
138 nsmpools
[ poolid
]. blocks
= nsmpn
;
141 VALGRIND_MAKE_MEM_DEFINED ( nsmpn
-> next
, sizeof ( struct nsminfo
));
142 nsmpn
-> next
-> prev
= nsmpn
;
143 VALGRIND_MAKE_MEM_UNDEFINED ( nsmpn
-> next
, sizeof ( struct nsminfo
));
146 VALGRIND_MEMPOOL_CHANGE ( nsmpn
, nsmp
-> data
, nsmpn
-> data
, nsmpn
-> size
);
147 VALGRIND_MAKE_MEM_UNDEFINED ( nsmpn
, sizeof ( struct nsminfo
));
149 return ( void *) nsmpn
-> data
;
152 void nsfreeall ( unsigned int poolid
) {
153 struct nsminfo
* nsmp
, * nnsmp
;
155 if ( poolid
>= MAXPOOL
)
158 for ( nsmp
= nsmpools
[ poolid
]. blocks
; nsmp
; nsmp
= nnsmp
) {
159 VALGRIND_MAKE_MEM_DEFINED ( nsmp
, sizeof ( struct nsminfo
));
161 VALGRIND_MEMPOOL_FREE ( nsmp
, nsmp
-> data
);
163 VALGRIND_DESTROY_MEMPOOL ( nsmp
);
166 nsmpools
[ poolid
]. blocks
= NULL
;
167 nsmpools
[ poolid
]. size
= 0 ;
168 nsmpools
[ poolid
]. count
= 0 ;
171 void nscheckfreeall ( unsigned int poolid
) {
172 if ( poolid
>= MAXPOOL
)
175 if ( nsmpools
[ poolid
]. blocks
) {
176 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
);
182 memset ( nsmpools
, 0 , sizeof ( nsmpools
));
188 for ( i
= 0 ; i
< MAXPOOL
; i
++)