modules/ut/memwrap.c

/* [<][>]
[^][v][top][bottom][index][help] */

FUNCTIONS

This source file includes following functions.
  1. wr_log_set
  2. wr_alloc_log
  3. wr_free_log
  4. wr_free_list_log
  5. wr_real_malloc
  6. wr_real_calloc
  7. wr_real_realloc
  8. wr_real_free
  9. wr_string
  10. wr_free_list_element
  11. wr_real_clear_list

   1 /***************************************
   2   $Revision: 1.8 $
   3 
   4   Utilities (ut). memwrap.c - memory allocation wrappers. 
   5                               Facilitate easy changing a memory allocation
   6                               library and provide uniform error codes.
   7 
   8   Status: NOT REVUED, TESTED, 
   9 
  10   Design and implementation by: Marek Bukowy
  11 
  12   ******************/ /******************
  13   Copyright (c) 1999                              RIPE NCC
  14  
  15   All Rights Reserved
  16   
  17   Permission to use, copy, modify, and distribute this software and its
  18   documentation for any purpose and without fee is hereby granted,
  19   provided that the above copyright notice appear in all copies and that
  20   both that copyright notice and this permission notice appear in
  21   supporting documentation, and that the name of the author not be
  22   used in advertising or publicity pertaining to distribution of the
  23   software without specific, written prior permission.
  24   
  25   THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
  26   ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL
  27   AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
  28   DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
  29   AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  30   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  31   ***************************************/
  32 
  33 #include <stdlib.h>
  34 #include <erroutines.h>
  35 #include <stubs.h>
  36 #include <glib.h>
  37 
  38 
  39   #define USE_LOGGING
  40 /* */ 
  41 
  42 /* global variable!! */
  43 int wr_logging = 0;
  44 
  45 void wr_log_set(int value) {
     /* [<][>][^][v][top][bottom][index][help] */
  46   wr_logging = (value != 0); 
  47 }
  48 
  49 static void
  50 wr_alloc_log(void *ptr, int len, char* comment, int line) 
     /* [<][>][^][v][top][bottom][index][help] */
  51 {
  52   if(wr_logging) {
  53     fprintf(stderr,"allocated %7d bytes at address %p in %s/%d\n",
  54             len, ptr, comment, line);
  55   }
  56 }
  57 
  58 static void
  59 wr_free_log(void *ptr, char* comment, int line) 
     /* [<][>][^][v][top][bottom][index][help] */
  60 {
  61   if(wr_logging) {
  62     fprintf(stderr,"freed some memory space at address %p in %s/%d\n", 
  63             ptr, comment, line); 
  64   }
  65 }
  66 
  67 static void
  68 wr_free_list_log(void *ptr, char* comment, int line) 
     /* [<][>][^][v][top][bottom][index][help] */
  69 {
  70   if(wr_logging) {
  71     fprintf(stderr,"freeing list + elements at address %p in %s/%d\n", 
  72             ptr, comment, line); 
  73   }
  74 }
  75 
  76 er_ret_t 
  77 wr_real_malloc(void **ptr, size_t size, char* comment, int line) 
     /* [<][>][^][v][top][bottom][index][help] */
  78 {
  79   if( (*ptr = malloc(size)) == NULL ) {
  80     /* die; */ /* this should return an appropriate error number */
  81     return UT_OUTMEM;
  82   }
  83   else {
  84 #ifdef USE_LOGGING
  85     wr_alloc_log(*ptr, size, comment, line); 
  86 #endif
  87     return UT_OK;
  88   }
  89 }
  90 
  91 er_ret_t 
  92 wr_real_calloc(void **ptr, size_t num, size_t size, char* comment, int line) 
     /* [<][>][^][v][top][bottom][index][help] */
  93 {
  94 void *newalloc;
  95 
  96   newalloc = calloc(num, size);
  97 
  98   if( newalloc == NULL ) {
  99     /*die; */ /* this should return an appropriate error number */
 100     return UT_OUTMEM;
 101   }
 102   else {
 103     *ptr=newalloc;
 104 #ifdef USE_LOGGING
 105     wr_alloc_log(*ptr, size*num, comment, line);
 106 #endif
 107     return UT_OK;
 108   }
 109 }
 110 
 111 
 112 er_ret_t  
 113 wr_real_realloc(void **ptr, void *oldptr, size_t size, char* comment, int line) 
     /* [<][>][^][v][top][bottom][index][help] */
 114 {
 115   if( (*ptr = realloc(oldptr, size)) == NULL ) {
 116     /* die;  */ /* this should return an appropriate error number */
 117    return UT_OUTMEM;
 118   } 
 119   else {
 120 #ifdef USE_LOGGING  
 121     wr_free_log(oldptr, comment, line);
 122     wr_alloc_log(*ptr, size, comment, line);
 123 #endif
 124     return UT_OK;
 125   }
 126 }
 127 
 128 er_ret_t 
 129 wr_real_free(void *ptr, char* comment, int line) 
     /* [<][>][^][v][top][bottom][index][help] */
 130 {
 131   if( ptr == NULL ) {
 132     die;
 133   }
 134 #ifdef USE_LOGGING
 135   wr_free_log(ptr, comment, line); 
 136 #endif
 137   free(ptr);
 138   /* if we're tired of those dies, we can set the pointer to NULL after free */
 139   return UT_OK;
 140 }
 141 
 142 
 143 /* make a copy and return the pointer to the allocated area */
 144 char *
 145 wr_string(const char *text)
     /* [<][>][^][v][top][bottom][index][help] */
 146 {
 147   char *area;
 148   int len =  strlen(text);
 149 
 150   wr_real_malloc( (void **) &area, len+1, "wr_string", len );
 151   
 152   strcpy( area, text );
 153 
 154   return area;
 155 }
 156 
 157 /* for GList's foreach */
 158 static
 159 void
 160 wr_free_list_element(void *cpy, void *trash)
     /* [<][>][^][v][top][bottom][index][help] */
 161 {
 162     wr_real_free(cpy,  "wr_free_list_element", 0 );
 163 }
 164 
 165 /* for GList's foreach */
 166 void
 167 wr_real_clear_list(GList **list, char* comment, int line)
     /* [<][>][^][v][top][bottom][index][help] */
 168 {
 169     /* allow NULL argument */
 170     if( *list != NULL ) {
 171         
 172 #ifdef USE_LOGGING
 173         wr_free_list_log(*list, comment, line); 
 174 #endif
 175         g_list_foreach(*list, wr_free_list_element, NULL);
 176         g_list_free(*list);
 177         *list = NULL;
 178     }
 179 }

/* [<][>][^][v][top][bottom][index][help] */