#include #include #include #include #include #include static void *(*real_malloc)(size_t); static void *initial_brk; static pthread_once_t once_control[1]; static void once_func() { real_malloc = dlsym(RTLD_NEXT, "malloc"); initial_brk = sbrk(0); } static int cmp(const void *a, const void *b) { void *aa = *(void **)a, *bb = *(void **)b; return aa < bb ? -1 : aa > bb ? 1 : 0; } void *malloc(size_t n) { size_t i, j, k; pthread_once(once_control, once_func); if (n < 100000 || n > (size_t)-1/2) { void *p; do p = real_malloc(n); while (p > sbrk(0) || (p && p < initial_brk)); return p; } size_t cnt = n/16384; void **list = real_malloc(sizeof *list * cnt); if (!list) return 0; for (i=0; i 65536) { base = j+1; continue; } if (z-p < n+64) { continue; } for (k=0; k