/* * 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; }
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); }