/* * heap_cleanup -- cleanups the volatile heap state */ void heap_cleanup(struct palloc_heap *heap) { struct heap_rt *rt = heap->rt; alloc_class_collection_delete(rt->alloc_classes); bucket_delete(rt->default_bucket); for (unsigned i = 0; i < rt->ncaches; ++i) bucket_group_destroy(rt->caches[i].buckets); for (int i = 0; i < MAX_RUN_LOCKS; ++i) util_mutex_destroy(&rt->run_locks[i]); Free(rt->caches); for (int i = 0; i < MAX_ALLOCATION_CLASSES; ++i) { recycler_delete(rt->recyclers[i]); } VALGRIND_DO_DESTROY_MEMPOOL(heap->layout); Free(rt); heap->rt = NULL; }
/* * pmemobj_cleanup -- (internal) cleanup the pool and unmap */ static void pmemobj_cleanup(PMEMobjpool *pop) { LOG(3, "pop %p", pop); if ((errno = heap_cleanup(pop)) != 0) ERR("!heap_cleanup"); if ((errno = lane_cleanup(pop)) != 0) ERR("!lane_cleanup"); VALGRIND_DO_DESTROY_MEMPOOL(pop); /* unmap all the replicas */ PMEMobjpool *rep; do { rep = pop->replica; VALGRIND_REMOVE_PMEM_MAPPING(pop->addr, pop->size); util_unmap(pop->addr, pop->size); pop = rep; } while (pop); }