/* * heap_populate_buckets -- (internal) creates volatile state of memory blocks */ static int heap_populate_buckets(struct palloc_heap *heap) { struct heap_rt *h = heap->rt; if (h->zones_exhausted == h->max_zone) return ENOMEM; uint32_t zone_id = h->zones_exhausted++; struct zone *z = ZID_TO_ZONE(heap->layout, zone_id); /* ignore zone and chunk headers */ VALGRIND_ADD_TO_GLOBAL_TX_IGNORE(z, sizeof(z->header) + sizeof(z->chunk_headers)); if (z->header.magic != ZONE_HEADER_MAGIC) heap_zone_init(heap, zone_id); return heap_reclaim_zone_garbage(heap, zone_id, 1 /* init */); }
/* * heap_populate_buckets -- (internal) creates volatile state of memory blocks */ static void heap_populate_buckets(PMEMobjpool *pop) { struct pmalloc_heap *h = pop->heap; if (h->zones_exhausted == h->max_zone) return; uint32_t zone_id = h->zones_exhausted++; struct zone *z = &h->layout->zones[zone_id]; /* ignore zone and chunk headers */ VALGRIND_ADD_TO_GLOBAL_TX_IGNORE(z, sizeof (z->header) + sizeof (z->chunk_headers)); if (z->header.magic != ZONE_HEADER_MAGIC) heap_zone_init(pop, zone_id); struct bucket *def_bucket = h->buckets[DEFAULT_BUCKET]; for (uint32_t i = 0; i < z->header.size_idx; ) { struct chunk_header *hdr = &z->chunk_headers[i]; heap_chunk_write_footer(hdr, hdr->size_idx); if (hdr->type == CHUNK_TYPE_RUN) { struct chunk_run *run = (struct chunk_run *)&z->chunks[i]; heap_populate_run_bucket(pop, h->bucket_map[run->block_size], i, zone_id); } else if (hdr->type == CHUNK_TYPE_FREE) { struct memory_block m = {i, zone_id, hdr->size_idx, 0}; bucket_insert_block(def_bucket, m); } i += hdr->size_idx; } }