/* * lane_init -- (internal) initializes a single lane runtime variables */ static int lane_init(PMEMobjpool *pop, struct lane *lane, struct lane_layout *layout, pthread_mutex_t *mtx, pthread_mutexattr_t *attr) { ASSERTne(lane, NULL); ASSERTne(mtx, NULL); ASSERTne(attr, NULL); int err; util_mutex_init(mtx, attr); lane->lock = mtx; int i; for (i = 0; i < MAX_LANE_SECTION; ++i) { lane->sections[i].runtime = NULL; lane->sections[i].layout = &layout->sections[i]; err = Section_ops[i]->construct(pop, &lane->sections[i]); if (err != 0) { ERR("!lane_construct_ops %d", i); goto error_section_construct; } } return 0; error_section_construct: for (i = i - 1; i >= 0; --i) Section_ops[i]->destruct(pop, &lane->sections[i]); util_mutex_destroy(lane->lock); return err; }
/* * 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; }
/* * lane_destroy -- cleanups a single lane runtime variables */ static void lane_destroy(PMEMobjpool *pop, struct lane *lane) { for (int i = 0; i < MAX_LANE_SECTION; ++i) Section_ops[i]->destruct(pop, &lane->sections[i]); util_mutex_destroy(lane->lock); }