IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 38504


Ignore:
Timestamp:
Jun 20, 2015, 1:27:10 PM (11 years ago)
Author:
eugene
Message:

expose OhanaMemblocks globally; turn off mem testing options; allow checks of realloc and free blocks if all memory is freed

Location:
branches/eam_branches/ipp-20150616/Ohana/src/libohana
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/ipp-20150616/Ohana/src/libohana/include/ohana_allocate.h

    r38491 r38504  
    11# ifndef OHANA_ALLOCATE
    22# define OHANA_ALLOCATE
     3
     4# define OHANA_MEMMAGIC (uint32_t) 0xdeadbeef
     5
     6typedef struct OhanaMemblock {
     7  uint32_t startblock;        // endpost marker
     8  struct OhanaMemblock *prevBlock; // previously allocated memory
     9  struct OhanaMemblock *nextBlock; // next allocated memory
     10  size_t size;                // size of memory
     11  const char *file;           // file (re)allocated
     12  const char *func;           // func (re)allocated
     13  int line;                   // line (re)allocated
     14  int freed;                  // memory has been freed
     15  int dummy;                  // need to put endblock on the endpost
     16  uint32_t endblock;          // endpost marker
     17} OhanaMemblock;
    318
    419typedef struct {
  • branches/eam_branches/ipp-20150616/Ohana/src/libohana/src/ohana_allocate.c

    r38491 r38504  
    66# include <string.h>
    77
    8 # define TEST_SAVE_FREE_BLOCKS 1
    9 # define TEST_SAVE_DROP_BLOCKS 1
     8# define TEST_SAVE_FREE_BLOCKS 0
     9# define TEST_SAVE_DROP_BLOCKS 0
    1010
    1111# undef OHANA_MEMORY
     
    1717# define MAX(X,Y) ((X) > (Y) ? (X) : (Y))
    1818
    19 # define OHANA_MEMMAGIC (uint32_t) 0xdeadbeef
    20 
    21 typedef struct Memblock {
    22   uint32_t startblock;        // endpost marker
    23   struct Memblock *prevBlock; // previously allocated memory
    24   struct Memblock *nextBlock; // next allocated memory
    25   size_t size;                // size of memory
    26   const char *file;           // file (re)allocated
    27   const char *func;           // func (re)allocated
    28   int line;                   // line (re)allocated
    29   int freed;                  // memory has been freed
    30   int dummy;                  // need to put endblock on the endpost
    31   uint32_t endblock;          // endpost marker
    32 } Memblock;
    33 
    34 static Memblock *lastBlock = NULL;
     19static OhanaMemblock *lastBlock = NULL;
    3520
    3621# if (TEST_SAVE_FREE_BLOCKS)
    37 static Memblock *freeBlock = NULL;
     22static OhanaMemblock *freeBlock = NULL;
    3823# endif
    3924
    4025# if (TEST_SAVE_DROP_BLOCKS)
    41 static Memblock *dropBlock = NULL;
     26static OhanaMemblock *dropBlock = NULL;
    4227# endif
    4328
     
    6045
    6146  void *ptr;                  // actual user memory allocated
    62   Memblock *new;              // new memblock created to track the user memory
     47  OhanaMemblock *new;         // new memblock created to track the user memory
    6348  size_t size;                // total number of bytes requested (not items)
    6449
     
    6752
    6853  // total size is : memblock + data + endpost
    69   new = (Memblock *) malloc (sizeof(Memblock) + size + sizeof(void *));
     54  new = (OhanaMemblock *) malloc (sizeof(OhanaMemblock) + size + sizeof(void *));
    7055  if (new == NULL) ohana_memabort ("failed to allocate memory (%s, %d, %s)\n", file, line, func);
    7156
     
    117102void *ohana_realloc (const char *file, int line, const char *func, void *in, size_t Nelem, size_t esize) {
    118103
    119   Memblock *old;              // original memblock associated with user memory
    120   Memblock *new;              // new memblock associated with user memory
     104  OhanaMemblock *old;         // original memblock associated with user memory
     105  OhanaMemblock *new;         // new memblock associated with user memory
    121106  size_t size;
    122107
     
    128113
    129114  // memblock of supplied pointer
    130   old = (Memblock *) in - 1;
     115  old = (OhanaMemblock *) in - 1;
    131116
    132117  if (old->startblock != OHANA_MEMMAGIC) ohana_memabort ("corrupt memory (%s, %d, %s)\n", file, line, func);
     
    143128  pthread_mutex_lock(&memBlockListMutex);
    144129
    145   Memblock *nextBlock = old->nextBlock;
    146   Memblock *prevBlock = old->prevBlock;
     130  OhanaMemblock *nextBlock = old->nextBlock;
     131  OhanaMemblock *prevBlock = old->prevBlock;
    147132
    148133  int isLast = (old == lastBlock);
     
    153138  // XXX for a test, we are going to always alloc a new block, copy the old data to the new block
    154139  // poison the old block, then free it
    155   new = (Memblock *) malloc (sizeof(Memblock) + size + sizeof(void *));
     140  new = (OhanaMemblock *) malloc (sizeof(OhanaMemblock) + size + sizeof(void *));
    156141  if (new == NULL) ohana_memabort ("failed to reallocate memory (%s, %d, %s)\n", file, line, func);
    157142  void *ptr_new = (char *) (new + 1);
     
    165150  // ask for new memory
    166151  // total size is : memblock + data + endpost
    167   new = (Memblock *) realloc (old, sizeof(Memblock) + size + sizeof(void *));
     152  new = (OhanaMemblock *) realloc (old, sizeof(OhanaMemblock) + size + sizeof(void *));
    168153  if (new == NULL) ohana_memabort ("failed to reallocate memory (%s, %d, %s)\n", file, line, func);
    169154  void *ptr_new = (char *) (new + 1);
     
    223208void ohana_free (const char *file, int line, const char *func, void *in) {
    224209
    225   Memblock *ref;
     210  OhanaMemblock *ref;
    226211
    227212  if (!in) return;
     
    229214  // fprintf (stderr, "free %zx\n", (size_t) in);
    230215
    231   ref = (Memblock *) in - 1;
     216  ref = (OhanaMemblock *) in - 1;
    232217
    233218  if (ref->freed) ohana_memabort ("memory already freed (%s, %d, %s [%d bytes])\n", ref->file, ref->line, ref->func, ref->size);
     
    239224  pthread_mutex_lock(&memBlockListMutex);
    240225 
    241   Memblock *nextBlock = ref->nextBlock;
    242   Memblock *prevBlock = ref->prevBlock;
     226  OhanaMemblock *nextBlock = ref->nextBlock;
     227  OhanaMemblock *prevBlock = ref->prevBlock;
    243228
    244229  // remove this memBlock from the list
     
    284269  if (!lastBlock) {
    285270    fprintf (stderr, "no memory allocated\n");
    286     return TRUE;
    287   }
    288 
    289   Memblock *thisBlock = lastBlock;
     271  }
     272
     273  OhanaMemblock *thisBlock = lastBlock;
    290274
    291275  size_t Ngood  = 0;
     
    435419  }
    436420
    437   Memblock *thisBlock = lastBlock;
     421  OhanaMemblock *thisBlock = lastBlock;
    438422
    439423  size_t Ntotal = 0;
     
    483467  memstats.Nbad = 0;
    484468 
    485   Memblock *thisBlock = lastBlock;
     469  OhanaMemblock *thisBlock = lastBlock;
    486470
    487471  while (thisBlock) {
Note: See TracChangeset for help on using the changeset viewer.