Home | History | Annotate | Download | only in tests
      1 #include <stdlib.h>
      2 #include <stdio.h>
      3 #include "../../config.h"
      4 #if defined(HAVE_MALLINFO)
      5 #include <malloc.h>
      6 #endif
      7 
      8 #define BIGINCREASE 32000
      9 int debug = 0;
     10 
     11 void stats(char *msg)
     12 {
     13 #if defined(HAVE_MALLINFO)
     14   struct mallinfo mallinfo_result;
     15   mallinfo_result = mallinfo();
     16 #endif
     17 
     18   /* from /usr/include/malloc.h */
     19   printf("%s\n", msg);
     20 
     21 #if defined(HAVE_MALLINFO)
     22   printf("%10d int arena;    /* non-mmapped space allocated from system */\n", mallinfo_result.arena);
     23   printf("%10d int ordblks;  /* number of free chunks */\n", mallinfo_result.ordblks);
     24   printf("%10d int smblks;   /* number of fastbin blocks */\n", mallinfo_result.smblks);
     25   printf("%10d int hblks;    /* number of mmapped regions */\n", mallinfo_result.hblks);
     26   printf("%10d int hblkhd;   /* space in mmapped regions */\n", mallinfo_result.hblkhd);
     27   printf("%10d int usmblks;  /* maximum total allocated space */\n", mallinfo_result.usmblks);
     28   printf("%10d int fsmblks;  /* space available in freed fastbin blocks */\n", mallinfo_result.fsmblks);
     29   printf("%10d int uordblks; /* total allocated space */\n", mallinfo_result.uordblks);
     30   printf("%10d int fordblks; /* total free space */\n", mallinfo_result.fordblks);
     31   printf("%10d int keepcost; /* top-most, releasable (via malloc_trim) space */\n", mallinfo_result.keepcost);
     32   printf("\n");
     33 #endif
     34 }
     35 
     36 int main(int argc, char *argv[])
     37 {
     38 
     39   char *big = NULL;
     40 
     41   char *newbig;
     42   int malloc_failure = 0;
     43   unsigned long bigsize = 8; // current size of the (reallocated) big block.
     44   int i;
     45   int loop;
     46 
     47   // two optional arguments: [nr of loop] [debug]
     48   if (argc > 1)
     49      loop = atoi(argv[1]);
     50   else
     51      loop = 3000;
     52 
     53   if (argc > 2)
     54      debug = 1;
     55 
     56   bigsize += BIGINCREASE;
     57   big = malloc (bigsize);
     58   if (big == NULL)
     59      printf ("failure %d could not allocate size %lu\n",
     60              ++malloc_failure, bigsize);
     61   if (debug)
     62      printf("big 0x%p\n", big);
     63 
     64   for (i = 0; i < loop; i++)
     65     {
     66       bigsize += BIGINCREASE;
     67       newbig = malloc(bigsize);
     68       if (newbig == NULL)
     69          printf ("failure %d could not allocate size %lu\n",
     70                  ++malloc_failure, bigsize);
     71       free (big);
     72       big = newbig;
     73       if (debug)
     74          printf("big 0x%p\n", big);
     75     }
     76 
     77   printf ("after %d loops, last size block requested %lu\n", loop, bigsize);
     78   // verify if superblock fragmentation occured
     79   // We consider that an arena of up to 3 times more than bigsize is ok.
     80   {
     81 #if defined(HAVE_MALLINFO)
     82      struct mallinfo mallinfo_result;
     83      mallinfo_result = mallinfo();
     84      // Under valgrind, hblkhd is 0 : all the space is in arena.
     85      // Under native linux, some space is counted hblkhd.
     86      if (malloc_failure > 0)
     87         printf ("%d mallocs failed, below output is doubful\n", malloc_failure);
     88      if (mallinfo_result.arena + mallinfo_result.hblkhd > 3 * bigsize)
     89         printf("unexpected heap fragmentation %lu\n",
     90                (unsigned long) mallinfo_result.arena
     91                + (unsigned long) mallinfo_result.hblkhd);
     92      else
     93 #endif
     94         printf("reasonable heap usage\n");
     95   }
     96 
     97   if (debug)
     98      stats ("before freeing last block");
     99   free (big);
    100   if (debug)
    101      stats ("after freeing last block");
    102 
    103   return 0;
    104 }
    105