{
size_t slot_size;
- for (slot_size = 16; slot_size < NBPG; slot_size *= 2)
+ for (slot_size = 16; slot_size < PGSIZE; slot_size *= 2)
{
struct desc *d = &descs[desc_cnt++];
ASSERT (desc_cnt <= sizeof descs / sizeof *descs);
static struct arena *
slot_to_arena (struct slot *s)
{
- return (struct arena *) ((uint32_t) s & (NBPG - 1));
+ return (struct arena *) ((uint32_t) s & ~(PGSIZE - 1));
}
static void *
break;
if (d == descs + desc_cnt)
{
- printk ("can't malloc %zu byte object\n", size);
+ printk ("malloc: %zu byte allocation too big\n", size);
return NULL;
}
a->next = d->arenas;
if (d->arenas != NULL)
d->arenas->prev = a;
- for (ofs = sizeof *a; ofs + d->slot_size <= NBPG; ofs += d->slot_size)
+ for (ofs = sizeof *a; ofs + d->slot_size <= PGSIZE; ofs += d->slot_size)
{
struct slot *s = (struct slot *) ((uint8_t *) a + ofs);
s->next = d->free_list;
return get_free_slot (d);
}
+void *
+calloc (size_t a, size_t b)
+{
+ void *p;
+ size_t size;
+
+ size = a * b;
+ if (size < a || size < b)
+ return NULL;
+
+ p = malloc (size);
+ if (p != NULL)
+ memset (p, 0, size);
+
+ return p;
+}
+
void
free (void *p)
{