117 ) { |
116 ) { |
118 of_chk_(n); |
117 of_chk_(n); |
119 struct cx_basic_mempool_s *pool = data; |
118 struct cx_basic_mempool_s *pool = data; |
120 |
119 |
121 char *mem = ((char *) ptr) - sizeof(cx_destructor_func); |
120 char *mem = ((char *) ptr) - sizeof(cx_destructor_func); |
122 char *newm = (char *) cxRealloc(pool->allocator, mem, |
121 char *newm = (char *) realloc(mem, n + sizeof(cx_destructor_func)); |
123 n + sizeof(cx_destructor_func)); |
|
124 if (newm == NULL) { |
122 if (newm == NULL) { |
125 return NULL; |
123 return NULL; |
126 } |
124 } |
127 if (mem != newm) { |
125 if (mem != newm) { |
128 cx_for_n(i, pool->ndata) { |
126 cx_for_n(i, pool->ndata) { |
148 cx_for_n(i, pool->ndata) { |
146 cx_for_n(i, pool->ndata) { |
149 if (mem == pool->data[i]) { |
147 if (mem == pool->data[i]) { |
150 if (mem->destructor != NULL) { |
148 if (mem->destructor != NULL) { |
151 mem->destructor(&(mem->c)); |
149 mem->destructor(&(mem->c)); |
152 } |
150 } |
153 cxFree(pool->allocator, mem); |
151 free(mem); |
154 size_t last_index = pool->ndata - 1; |
152 size_t last_index = pool->ndata - 1; |
155 if (i != last_index) { |
153 if (i != last_index) { |
156 pool->data[i] = pool->data[last_index]; |
154 pool->data[i] = pool->data[last_index]; |
157 pool->data[last_index] = NULL; |
155 pool->data[last_index] = NULL; |
158 } |
156 } |
198 static cx_mempool_class cx_basic_mempool_class = { |
196 static cx_mempool_class cx_basic_mempool_class = { |
199 cx_basic_mempool_destroy, |
197 cx_basic_mempool_destroy, |
200 cx_basic_mempool_set_destr, |
198 cx_basic_mempool_set_destr, |
201 }; |
199 }; |
202 |
200 |
203 CxMempool *cxBasicMempoolCreate( |
201 CxMempool *cxBasicMempoolCreate(size_t capacity) { |
204 size_t capacity, |
|
205 CxAllocator *allocator |
|
206 ) { |
|
207 size_t poolsize; |
202 size_t poolsize; |
208 if (cx_szmul(capacity, sizeof(void *), &poolsize)) { |
203 if (cx_szmul(capacity, sizeof(void *), &poolsize)) { |
209 return NULL; |
204 return NULL; |
210 } |
205 } |
211 |
206 |