void dm_pool_destroy(struct dm_pool *p) { struct chunk *c, *pr; _free_chunk(p->spare_chunk); c = p->chunk; while (c) { pr = c->prev; _free_chunk(c); c = pr; } dm_list_del(&p->list); dm_free(p); }
void dm_pool_free(struct dm_pool *p, void *ptr) { struct chunk *c = p->chunk; while (c) { if (((char *) c < (char *) ptr) && ((char *) c->end > (char *) ptr)) { c->begin = ptr; #ifdef VALGRIND_POOL VALGRIND_MAKE_MEM_NOACCESS(c->begin, c->end - c->begin); #endif break; } if (p->spare_chunk) _free_chunk(p->spare_chunk); c->begin = (char *) (c + 1); #ifdef VALGRIND_POOL VALGRIND_MAKE_MEM_NOACCESS(c->begin, c->end - c->begin); #endif p->spare_chunk = c; c = c->prev; } if (!c) log_error(INTERNAL_ERROR "pool_free asked to free pointer " "not in pool"); else p->chunk = c; }
void dm_pool_destroy(struct dm_pool *p) { struct chunk *c, *pr; _free_chunk(p->spare_chunk); c = p->chunk; while (c) { pr = c->prev; _free_chunk(c); c = pr; } pthread_mutex_lock(&_dm_pools_mutex); dm_list_del(&p->list); pthread_mutex_unlock(&_dm_pools_mutex); dm_free(p); }