Exemple #1
0
/*
 * 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;
}
Exemple #2
0
/*
 * 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);
}