/* * 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; }
/* * pvector_array_constr -- (internal) constructor of a new vector array. * * The vectors MUST be zeroed because non-zero array elements are treated as * vector values. */ static int pvector_array_constr(void *ctx, void *ptr, size_t usable_size, void *arg) { PMEMobjpool *pop = ctx; /* * Vectors are used as transaction logs, valgrind shouldn't warn about * storing things inside of them. * This memory range is removed from tx when the array is freed as a * result of pop_back or when the transaction itself ends. */ VALGRIND_ADD_TO_TX(ptr, usable_size); pmemops_memset_persist(&pop->p_ops, ptr, 0, usable_size); return 0; }