/*
 * don't do any of "storage compaction" nonsense, "just" the three modes:
 *   + cp == NULL ==> malloc
 *   + nbytes == 0 ==> free
 *   + else ==> realloc
 */
void *
bmk_memrealloc(void *cp, size_t nbytes)
{   
	union overhead *op;
  	size_t size;
	size_t alignpad;
	void *np;

	if (cp == NULL)
		return bmk_memalloc(nbytes, 8);

	if (nbytes == 0) {
		bmk_memfree(cp);
		return NULL;
	}

	op = ((union overhead *)cp)-1;
  	size = op->ov_index;
	alignpad = op->ov_alignpad;

	/* don't bother "compacting".  don't like it?  don't use realloc! */
	if (((1<<(size+MINSHIFT)) - (alignpad+sizeof(*op))) >= nbytes)
		return cp;

	/* we're gonna need a bigger bucket */
	np = bmk_memalloc(nbytes, 8);
	if (np == NULL)
		return NULL;

	memcpy(np, cp, (1<<(size+MINSHIFT)) - (alignpad+sizeof(*op)));
	bmk_memfree(cp);
	return np;
}
static void *
testalloc(void)
{
	void *v, *nv;
	size_t size1, size2, align;

	/* doesn't give an even bucket distribution, but ... */
	size1 = random() % ((TEST_MAXALLOC-TEST_MINALLOC)+1) + TEST_MINALLOC;
	align = random() % ((TEST_MAXALIGN-TEST_MINALIGN)+1) + TEST_MINALIGN;

	v = bmk_memalloc(size1, 1<<align);
	if (!v)
		return NULL;
	ASSERT(((uintptr_t)v & (align-1)) == 0);
	memset(v, UNMAGIC, size1);

	size2 = random() % ((TEST_MAXALLOC-TEST_MINALLOC)+1) + TEST_MINALLOC;
	nv = memrealloc(v, size2);
	if (nv) {
		memset(nv, UNMAGIC2, size2);
		return nv;
	}

	return size2 ? v : NULL;
}
void *
bmk_xmalloc(size_t howmuch)
{
	void *rv;

	rv = bmk_memalloc(howmuch, 0);
	if (rv == NULL)
		panic("xmalloc failed");
	return rv;
}
int
posix_memalign(void **rv, size_t nbytes, size_t align)
{
	void *v;
	int error = 10; /* XXX */

	if ((v = bmk_memalloc(nbytes, align)) != NULL) {
		*rv = v;
		error = 0;
	}

	return error;
}
Exemple #5
0
void *
rumpcomp_pci_irq_establish(unsigned cookie, int (*handler)(void *), void *data)
{
	struct ihandler *ihan;
	evtchn_port_t prt;
	int pirq;

	if (cookie != mycookie)
		return NULL;
	pirq = myintr;

	ihan = bmk_memalloc(sizeof(*ihan), 0, BMK_MEMWHO_WIREDBMK);
	if (!ihan)
		return NULL;
	ihan->i_handler = handler;
	ihan->i_data = data;

	prt = minios_bind_pirq(pirq, 1, hyperhandler, ihan);
	minios_unmask_evtchn(prt);
	ihan->i_prt = prt;

	return ihan;
}
void *
malloc(size_t size)
{

	return bmk_memalloc(size, 8);
}