modules/ut/memwrap.c
/* [<][>][^][v][top][bottom][index][help] */
FUNCTIONS
This source file includes following functions.
- wr_log_set
- wr_alloc_log
- wr_free_log
- wr_free_list_log
- wr_real_malloc
- wr_real_calloc
- wr_real_realloc
- wr_real_free
- wr_string
- wr_free_list_element
- 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 }