2  * alloc.c  - specialized allocator for internal objects
 
   4  * Copyright (C) 2006 Linus Torvalds
 
   6  * The standard malloc/free wastes too much space for objects, partly because
 
   7  * it maintains all the allocation infrastructure (which isn't needed, since
 
   8  * we never free an object descriptor anyway), but even more because it ends
 
   9  * up with maximal alignment because it doesn't know what the object alignment
 
  10  * for the new allocation is.
 
  21 #define DEFINE_ALLOCATOR(name, type)                            \
 
  22 static unsigned int name##_allocs;                              \
 
  23 void *alloc_##name##_node(void)                                 \
 
  31                 block = xmalloc(BLOCKING * sizeof(type));       \
 
  36         memset(ret, 0, sizeof(type));                           \
 
  48 DEFINE_ALLOCATOR(blob, struct blob)
 
  49 DEFINE_ALLOCATOR(tree, struct tree)
 
  50 DEFINE_ALLOCATOR(commit, struct commit)
 
  51 DEFINE_ALLOCATOR(tag, struct tag)
 
  52 DEFINE_ALLOCATOR(object, union any_object)
 
  54 static void report(const char *name, unsigned int count, size_t size)
 
  56         fprintf(stderr, "%10s: %8u (%"PRIuMAX" kB)\n",
 
  57                         name, count, (uintmax_t) size);
 
  60 #define REPORT(name)    \
 
  61     report(#name, name##_allocs, name##_allocs*sizeof(struct name) >> 10)
 
  63 void alloc_report(void)