/* * libvmmalloc_clone - (internal) clone the entire pool */ static void * libvmmalloc_clone(void) { LOG(3, NULL); Fd_clone = util_tmpfile(Dir, Vmp->size); if (Fd_clone == -1) return NULL; void *addr = mmap(NULL, Vmp->size, PROT_READ|PROT_WRITE, MAP_SHARED, Fd_clone, 0); if (addr == MAP_FAILED) { LOG(1, "!mmap"); (void) close(Fd_clone); return NULL; } LOG(3, "copy the entire pool file: dst %p src %p size %zu", addr, Vmp->addr, Vmp->size); util_range_rw(Vmp->addr, sizeof (struct pool_hdr)); /* * Part of vmem pool was probably freed at some point, so Valgrind * marked it as undefined/inaccessible. We need to duplicate the whole * pool, so as a workaround temporarily disable error reporting. */ VALGRIND_DO_DISABLE_ERROR_REPORTING; memcpy(addr, Vmp->addr, Vmp->size); VALGRIND_DO_ENABLE_ERROR_REPORTING; util_range_none(Vmp->addr, sizeof (struct pool_hdr)); return addr; }
/* * vmem_delete -- delete a memory pool */ void vmem_delete(VMEM *vmp) { LOG(3, "vmp %p", vmp); int ret = je_vmem_pool_delete((pool_t *)((uintptr_t)vmp + Header_size)); if (ret != 0) { ERR("invalid pool handle: %p", vmp); errno = EINVAL; return; } util_range_rw(vmp->addr, sizeof (struct pool_hdr)); if (vmp->caller_mapped == 0) util_unmap(vmp->addr, vmp->size); }