/* * heap_init -- initializes the heap * * If successful function returns zero. Otherwise an error number is returned. */ int heap_init(PMEMobjpool *pop) { if (pop->heap_size < HEAP_MIN_SIZE) return EINVAL; struct heap_layout *layout = heap_get_layout(pop); heap_write_header(&layout->header, pop->heap_size); pmem_msync(&layout->header, sizeof (struct heap_header)); int zones = heap_max_zone(pop->heap_size); for (int i = 0; i < zones; ++i) { memset(&layout->zones[i].header, 0, sizeof (layout->zones[i].header)); memset(&layout->zones[i].chunk_headers, 0, sizeof (layout->zones[i].chunk_headers)); pmem_msync(&layout->zones[i].header, sizeof (layout->zones[i].header)); pmem_msync(&layout->zones[i].chunk_headers, sizeof (layout->zones[i].chunk_headers)); } return 0; }
/* * heap_init -- initializes the heap * * If successful function returns zero. Otherwise an error number is returned. */ int heap_init(void *heap_start, uint64_t heap_size, struct pmem_ops *p_ops) { if (heap_size < HEAP_MIN_SIZE) return EINVAL; VALGRIND_DO_MAKE_MEM_UNDEFINED(heap_start, heap_size); struct heap_layout *layout = heap_start; heap_write_header(&layout->header, heap_size); pmemops_persist(p_ops, &layout->header, sizeof(struct heap_header)); unsigned zones = heap_max_zone(heap_size); for (unsigned i = 0; i < zones; ++i) { pmemops_memset_persist(p_ops, &ZID_TO_ZONE(layout, i)->header, 0, sizeof(struct zone_header)); pmemops_memset_persist(p_ops, &ZID_TO_ZONE(layout, i)->chunk_headers, 0, sizeof(struct chunk_header)); /* only explicitly allocated chunks should be accessible */ VALGRIND_DO_MAKE_MEM_NOACCESS( &ZID_TO_ZONE(layout, i)->chunk_headers, sizeof(struct chunk_header)); } return 0; }
/* * heap_init -- initializes the heap * * If successful function returns zero. Otherwise an error number is returned. */ int heap_init(PMEMobjpool *pop) { if (pop->heap_size < HEAP_MIN_SIZE) return EINVAL; struct heap_layout *layout = heap_get_layout(pop); heap_write_header(&layout->header, pop->heap_size); pmem_msync(&layout->header, sizeof (struct heap_header)); return 0; }