Lines Matching refs:region
55 struct region struct
185 region_destroy(region_type *region) in region_destroy() argument
188 if (!region) in region_destroy()
191 deallocator = region->deallocator; in region_destroy()
193 region_free_all(region); in region_destroy()
194 deallocator(region->cleanups); in region_destroy()
195 deallocator(region->initial_data); in region_destroy()
196 if(region->recycle_bin) in region_destroy()
197 deallocator(region->recycle_bin); in region_destroy()
198 if(region->large_list) { in region_destroy()
199 struct large_elem* p = region->large_list, *np; in region_destroy()
206 deallocator(region); in region_destroy()
211 region_add_cleanup(region_type *region, void (*action)(void *), void *data) in region_add_cleanup() argument
215 if (region->cleanup_count >= region->maximum_cleanup_count) { in region_add_cleanup()
216 cleanup_type *cleanups = (cleanup_type *) region->allocator( in region_add_cleanup()
217 2 * region->maximum_cleanup_count * sizeof(cleanup_type)); in region_add_cleanup()
221 memcpy(cleanups, region->cleanups, in region_add_cleanup()
222 region->cleanup_count * sizeof(cleanup_type)); in region_add_cleanup()
223 region->deallocator(region->cleanups); in region_add_cleanup()
225 region->cleanups = cleanups; in region_add_cleanup()
226 region->maximum_cleanup_count *= 2; in region_add_cleanup()
229 region->cleanups[region->cleanup_count].action = action; in region_add_cleanup()
230 region->cleanups[region->cleanup_count].data = data; in region_add_cleanup()
232 ++region->cleanup_count; in region_add_cleanup()
233 return region->cleanup_count; in region_add_cleanup()
237 region_remove_cleanup(region_type *region, void (*action)(void *), void *data) in region_remove_cleanup() argument
240 for(i=0; i<region->cleanup_count; i++) { in region_remove_cleanup()
241 if(region->cleanups[i].action == action && in region_remove_cleanup()
242 region->cleanups[i].data == data) { in region_remove_cleanup()
243 region->cleanup_count--; in region_remove_cleanup()
244 region->cleanups[i] = in region_remove_cleanup()
245 region->cleanups[region->cleanup_count]; in region_remove_cleanup()
252 region_alloc(region_type *region, size_t size) in region_alloc() argument
262 if (aligned_size >= region->large_object_size) { in region_alloc()
263 result = region->allocator(size + sizeof(struct large_elem)); in region_alloc()
267 ((struct large_elem*)result)->next = region->large_list; in region_alloc()
268 if(region->large_list) in region_alloc()
269 region->large_list->prev = (struct large_elem*)result; in region_alloc()
270 region->large_list = (struct large_elem*)result; in region_alloc()
272 region->total_allocated += size; in region_alloc()
273 ++region->large_objects; in region_alloc()
278 if (region->recycle_bin && region->recycle_bin[aligned_size]) { in region_alloc()
279 result = (void*)region->recycle_bin[aligned_size]; in region_alloc()
280 region->recycle_bin[aligned_size] = region->recycle_bin[aligned_size]->next; in region_alloc()
281 region->recycle_size -= aligned_size; in region_alloc()
282 region->unused_space += aligned_size - size; in region_alloc()
286 if (region->allocated + aligned_size > region->chunk_size) { in region_alloc()
287 void *chunk = region->allocator(region->chunk_size); in region_alloc()
292 wasted = (region->chunk_size - region->allocated) & (~(ALIGNMENT-1)); in region_alloc()
301 region->total_allocated += wasted; in region_alloc()
302 ++region->small_objects; in region_alloc()
303 region_recycle(region, region->data+region->allocated, wasted); in region_alloc()
304 region->allocated += wasted; in region_alloc()
306 ++region->chunk_count; in region_alloc()
307 region->unused_space += region->chunk_size - region->allocated; in region_alloc()
309 if(!region_add_cleanup(region, region->deallocator, chunk)) { in region_alloc()
310 region->deallocator(chunk); in region_alloc()
311 region->chunk_count--; in region_alloc()
312 region->unused_space -= in region_alloc()
313 region->chunk_size - region->allocated; in region_alloc()
316 region->allocated = 0; in region_alloc()
317 region->data = (char *) chunk; in region_alloc()
320 result = region->data + region->allocated; in region_alloc()
321 region->allocated += aligned_size; in region_alloc()
323 region->total_allocated += aligned_size; in region_alloc()
324 region->unused_space += aligned_size - size; in region_alloc()
325 ++region->small_objects; in region_alloc()
331 region_alloc_init(region_type *region, const void *init, size_t size) in region_alloc_init() argument
333 void *result = region_alloc(region, size); in region_alloc_init()
340 region_alloc_zero(region_type *region, size_t size) in region_alloc_zero() argument
342 void *result = region_alloc(region, size); in region_alloc_zero()
349 region_alloc_array_init(region_type *region, const void *init, size_t num, in region_alloc_array_init() argument
357 return region_alloc_init(region, init, num*size); in region_alloc_array_init()
361 region_alloc_array_zero(region_type *region, size_t num, size_t size) in region_alloc_array_zero() argument
368 return region_alloc_zero(region, num*size); in region_alloc_array_zero()
372 region_alloc_array(region_type *region, size_t num, size_t size) in region_alloc_array() argument
379 return region_alloc(region, num*size); in region_alloc_array()
383 region_free_all(region_type *region) in region_free_all() argument
386 assert(region); in region_free_all()
387 assert(region->cleanups); in region_free_all()
389 i = region->cleanup_count; in region_free_all()
392 assert(region->cleanups[i].action); in region_free_all()
393 region->cleanups[i].action(region->cleanups[i].data); in region_free_all()
396 if(region->recycle_bin) { in region_free_all()
397 memset(region->recycle_bin, 0, sizeof(struct recycle_elem*) in region_free_all()
398 * region->large_object_size); in region_free_all()
399 region->recycle_size = 0; in region_free_all()
402 if(region->large_list) { in region_free_all()
403 struct large_elem* p = region->large_list, *np; in region_free_all()
404 void (*deallocator)(void *) = region->deallocator; in region_free_all()
410 region->large_list = NULL; in region_free_all()
413 region->data = region->initial_data; in region_free_all()
414 region->cleanup_count = 0; in region_free_all()
415 region->allocated = 0; in region_free_all()
417 region->total_allocated = 0; in region_free_all()
418 region->small_objects = 0; in region_free_all()
419 region->large_objects = 0; in region_free_all()
420 region->chunk_count = 1; in region_free_all()
421 region->unused_space = 0; in region_free_all()
426 region_strdup(region_type *region, const char *string) in region_strdup() argument
428 return (char *) region_alloc_init(region, string, strlen(string) + 1); in region_strdup()
432 region_recycle(region_type *region, void *block, size_t size) in region_recycle() argument
436 if(!block || !region->recycle_bin) in region_recycle()
444 if(aligned_size < region->large_object_size) { in region_recycle()
452 struct recycle_elem *p = region->recycle_bin[aligned_size]; in region_recycle()
460 elem->next = region->recycle_bin[aligned_size]; in region_recycle()
461 region->recycle_bin[aligned_size] = elem; in region_recycle()
462 region->recycle_size += aligned_size; in region_recycle()
463 region->unused_space -= aligned_size - size; in region_recycle()
469 region->total_allocated -= size; in region_recycle()
470 --region->large_objects; in region_recycle()
475 else region->large_list = l->next; in region_recycle()
478 region->deallocator(l); in region_recycle()
483 region_dump_stats(region_type *region, FILE *out) in region_dump_stats() argument
486 (unsigned long) (region->small_objects + region->large_objects), in region_dump_stats()
487 (unsigned long) region->small_objects, in region_dump_stats()
488 (unsigned long) region->large_objects, in region_dump_stats()
489 (unsigned long) region->total_allocated, in region_dump_stats()
490 (unsigned long) region->unused_space, in region_dump_stats()
491 (unsigned long) region->chunk_count, in region_dump_stats()
492 (unsigned long) region->cleanup_count, in region_dump_stats()
493 (unsigned long) region->recycle_size); in region_dump_stats()
494 if(region->recycle_bin) { in region_dump_stats()
497 for(i=0; i<region->large_object_size; i++) { in region_dump_stats()
499 struct recycle_elem* el = region->recycle_bin[i]; in region_dump_stats()
510 size_t region_get_recycle_size(region_type* region) in region_get_recycle_size() argument
512 return region->recycle_size; in region_get_recycle_size()
515 size_t region_get_mem(region_type* region) in region_get_mem() argument
517 return region->total_allocated; in region_get_mem()
520 size_t region_get_mem_unused(region_type* region) in region_get_mem_unused() argument
522 return region->unused_space; in region_get_mem_unused()
527 region_log_stats(region_type *region) in region_log_stats() argument
533 (unsigned long) (region->small_objects + region->large_objects), in region_log_stats()
534 (unsigned long) region->small_objects, in region_log_stats()
535 (unsigned long) region->large_objects, in region_log_stats()
536 (unsigned long) region->total_allocated, in region_log_stats()
537 (unsigned long) region->unused_space, in region_log_stats()
538 (unsigned long) region->chunk_count, in region_log_stats()
539 (unsigned long) region->cleanup_count, in region_log_stats()
540 (unsigned long) region->recycle_size); in region_log_stats()
544 if(region->recycle_bin) { in region_log_stats()
547 for(i=0; i<region->large_object_size; i++) { in region_log_stats()
549 struct recycle_elem* el = region->recycle_bin[i]; in region_log_stats()