@@ -25,7 +25,8 @@ typedef struct block Block;
2525
2626
2727struct buffer {
28- void * memory ;
28+ void * start ;
29+ void * current ;
2930 void * end ;
3031 Buffer * next ;
3132};
@@ -48,9 +49,10 @@ struct mem_pool {
4849static Buffer * new_buffer (MemPool * pool )
4950{
5051 Buffer * buff = malloc (sizeof (Buffer ));
51- buff -> memory = malloc (pool -> buff_size );
52+ buff -> start = malloc (pool -> buff_size );
53+ buff -> current = buff -> start ;
5254 buff -> next = NULL ;
53- buff -> end = buff -> memory + pool -> buff_size ;
55+ buff -> end = buff -> current + pool -> buff_size ;
5456
5557 return buff ;
5658}
@@ -93,8 +95,8 @@ static void *from_free_list(MemPool *pool)
9395
9496static void * from_buffer (MemPool * pool , Buffer * buff )
9597{
96- void * ptr = buff -> memory ;
97- buff -> memory += pool -> memb_size ;
98+ void * ptr = buff -> current ;
99+ buff -> current += pool -> memb_size ;
98100 unlock (pool );
99101
100102 return ptr ;
@@ -109,7 +111,7 @@ void *pool_alloc(MemPool *pool)
109111 }
110112 Buffer * buff = pool -> buff_last ;
111113
112- if (buff -> memory == buff -> end ) {
114+ if (buff -> current == buff -> end ) {
113115 buff = new_buffer (pool );
114116 pool -> buff_last -> next = buff ;
115117 pool -> buff_last = buff ;
@@ -140,6 +142,21 @@ bool pool_has_ptr(MemPool *pool, void *ptr)
140142 return false;
141143}
142144
145+ void pool_foreach (MemPool * pool , PoolForeach callback )
146+ {
147+ lock (pool );
148+
149+ Buffer * buff = pool -> buff_head ;
150+
151+ while (buff ) {
152+ for (void * block = buff -> start ; block < buff -> current ; block += pool -> memb_size ) {
153+ callback (block );
154+ }
155+ buff = buff -> next ;
156+ }
157+ unlock (pool );
158+ }
159+
143160int pool_free (MemPool * pool , void * ptr )
144161{
145162 if (!pool_has_ptr (pool , ptr )) {
0 commit comments