| 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 |