/* * 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_check -- verifies if the heap is consistent and can be opened properly * * If successful function returns zero. Otherwise an error number is returned. */ int heap_check(PMEMobjpool *pop) { if (pop->heap_size < HEAP_MIN_SIZE) { ERR("heap: invalid heap size"); return -1; } struct heap_layout *layout = heap_get_layout(pop); if (pop->heap_size != layout->header.size) { ERR("heap: heap size missmatch"); return -1; } if (heap_verify_header(&layout->header)) return -1; for (int i = 0; i < heap_max_zone(layout->header.size); ++i) { if (heap_verify_zone(&layout->zones[i])) return -1; } return 0; }
/* * heap_boot -- opens the heap region of the pmemobj pool * * If successful function returns zero. Otherwise an error number is returned. */ int heap_boot(PMEMobjpool *pop) { struct pmalloc_heap *h = Malloc(sizeof (*h)); int err; if (h == NULL) { err = ENOMEM; goto error_heap_malloc; } h->max_zone = heap_max_zone(pop->heap_size); h->zones_exhausted = 0; h->layout = heap_get_layout(pop); for (int i = 0; i < MAX_RUN_LOCKS; ++i) if ((err = pthread_mutex_init(&h->run_locks[i], NULL)) != 0) goto error_run_lock_init; pop->heap = h; if ((err = heap_buckets_init(pop)) != 0) goto error_buckets_init; return 0; error_buckets_init: /* there's really no point in destroying the locks */ error_run_lock_init: Free(h); pop->heap = NULL; error_heap_malloc: return err; }
/* * 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; }