return b;
}
+/* Obtains and returns a new block of at least SIZE bytes.
+ Panics if memory is not available. It is unacceptable for the
+ kernel to panic in normal operation, so this function should
+ only be used during kernel initialization. */
+void *
+xmalloc (size_t size)
+{
+ void *p = malloc (size);
+ if (p == NULL && size > 0)
+ PANIC ("memory exhausted");
+ return p;
+}
+
/* Allocates and return A times B bytes initialized to zeroes.
Returns a null pointer if memory is not available. */
void *
void *p;
size_t size;
- /* Calculate block size. */
+ /* Calculate block size and make sure it fits in size_t. */
size = a * b;
if (size < a || size < b)
return NULL;
return p;
}
+/* Allocates and return A times B bytes initialized to zeroes.
+ Panics if memory is not available. It is unacceptable for the
+ kernel to panic in normal operation, so this function should
+ only be used during kernel initialization. */
+void *
+xcalloc (size_t a, size_t b)
+{
+ void *p = calloc (a, b);
+ if (p == NULL && a > 0 && b > 0)
+ PANIC ("memory exhausted");
+ return p;
+}
+
/* Frees block P, which must have been previously allocated with
malloc() or calloc(). */
void
}
#ifndef NDEBUG
- memset (b, 0xcd, d->block_size);
+ memset (b, 0xcc, d->block_size);
#endif
lock_acquire (&d->lock);
block_to_arena (struct block *b)
{
struct arena *a = pg_round_down (b);
+
+ /* Check that the arena is valid. */
ASSERT (a != NULL);
ASSERT (a->magic == ARENA_MAGIC);
+
+ /* Check that the block is properly aligned for the arena. */
+ ASSERT (a->desc == NULL
+ || (pg_ofs (b) - sizeof *a) % a->desc->block_size == 0);
+ ASSERT (a->desc != NULL || pg_ofs (b) == sizeof *a);
+
return a;
}