Changeset 3784 for trunk/psLib/src/sysUtils/psMemory.c
- Timestamp:
- Apr 28, 2005, 2:39:22 PM (21 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/sysUtils/psMemory.c (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/sysUtils/psMemory.c
r3682 r3784 8 8 * @author Robert Lupton, Princeton University 9 9 * 10 * @version $Revision: 1.5 0$ $Name: not supported by cvs2svn $11 * @date $Date: 2005-04- 07 20:27:41$10 * @version $Revision: 1.51 $ $Name: not supported by cvs2svn $ 11 * @date $Date: 2005-04-29 00:39:22 $ 12 12 * 13 13 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 80 80 81 81 return ptr; 82 }83 84 static psMemExhaustedCallback memExhaustedCallback = memExhaustedCallbackDefault;85 86 psMemExhaustedCallback psMemExhaustedCallbackSet(psMemExhaustedCallback func)87 {88 psMemExhaustedCallback old = memExhaustedCallback;89 90 if (func != NULL) {91 memExhaustedCallback = func;92 } else {93 memExhaustedCallback = memExhaustedCallbackDefault;94 }95 96 return old;97 }98 99 static void memProblemCallbackDefault(const psMemBlock* ptr, const char *file, psS32 lineno)100 {101 if (ptr->refCounter < 1) {102 psError(PS_ERR_MEMORY_CORRUPTION, false,103 PS_ERRORTEXT_psMemory_MULTIPLE_FREE,104 ptr->id, ptr->file, ptr->lineno, file, lineno);105 }106 107 if (lineno > 0) {108 psAbort(__func__, "Detected a problem in the memory system at %s:%d", file, lineno);109 }110 }111 static psMemProblemCallback memProblemCallback = memProblemCallbackDefault;112 113 psMemProblemCallback psMemProblemCallbackSet(psMemProblemCallback func)114 {115 psMemProblemCallback old = memProblemCallback;116 117 if (func != NULL) {118 memProblemCallback = func;119 } else {120 memProblemCallback = memProblemCallbackDefault;121 }122 123 return old;124 }125 126 /*127 * And now the I-want-to-be-informed callbacks128 *129 * Call the callbacks when these IDs are allocated/freed130 */131 psMemoryId p_psMemAllocateID = 0; // notify user this block is allocated132 psMemoryId p_psMemFreeID = 0; // notify user this block is freed133 134 psMemoryId psMemAllocateCallbackSetID(psMemoryId id)135 {136 psMemoryId old = p_psMemAllocateID;137 138 p_psMemAllocateID = id;139 140 return old;141 }142 143 psMemoryId psMemFreeCallbackSetID(psMemoryId id)144 {145 psMemoryId old = p_psMemFreeID;146 147 p_psMemFreeID = id;148 149 return old;150 82 } 151 83 … … 170 102 } 171 103 172 /* 173 * The default callbacks, and the routines to change them 174 */ 175 static psMemAllocateCallback memAllocateCallback = memAllocateCallbackDefault; 176 static psMemFreeCallback memFreeCallback = memFreeCallbackDefault; 177 178 psMemAllocateCallback psMemAllocateCallbackSet(psMemAllocateCallback func) 179 { 180 psMemFreeCallback old = memAllocateCallback; 181 182 if (func != NULL) { 183 memAllocateCallback = func; 184 } else { 185 memAllocateCallback = memAllocateCallbackDefault; 186 } 187 188 return old; 189 } 190 191 psMemFreeCallback psMemFreeCallbackSet(psMemFreeCallback func) 192 { 193 psMemFreeCallback old = memFreeCallback; 194 195 if (func != NULL) { 196 memFreeCallback = func; 197 } else { 198 memFreeCallback = memFreeCallbackDefault; 199 } 200 201 return old; 202 } 203 204 /* 205 * Return memory ID counter for next block to be allocated 206 */ 207 psMemoryId psMemGetId(void) 208 { 209 psMemoryId id; 210 211 pthread_mutex_lock(&memIdMutex); 212 id = memid + 1; 213 pthread_mutex_unlock(&memIdMutex); 214 215 return id; 104 static void memProblemCallbackDefault(const psMemBlock* ptr, const char *file, psS32 lineno) 105 { 106 if (ptr->refCounter < 1) { 107 psError(PS_ERR_MEMORY_CORRUPTION, false, 108 PS_ERRORTEXT_psMemory_MULTIPLE_FREE, 109 ptr->id, ptr->file, ptr->lineno, file, lineno); 110 } 111 112 if (lineno > 0) { 113 psAbort(__func__, "Detected a problem in the memory system at %s:%d", file, lineno); 114 } 216 115 } 217 116 … … 221 120 * N.b. If the block wasn't allocated by psAlloc, it will appear corrupted 222 121 */ 223 224 122 static psS32 checkMemBlock(const psMemBlock* m, const char *funcName) 225 123 { … … 255 153 256 154 return 0; 155 } 156 157 /* 158 * The default callbacks 159 */ 160 static psMemAllocateCallback memAllocateCallback = memAllocateCallbackDefault; 161 static psMemFreeCallback memFreeCallback = memFreeCallbackDefault; 162 static psMemProblemCallback memProblemCallback = memProblemCallbackDefault; 163 static psMemExhaustedCallback memExhaustedCallback = memExhaustedCallbackDefault; 164 165 psMemExhaustedCallback psMemExhaustedCallbackSet(psMemExhaustedCallback func) 166 { 167 psMemExhaustedCallback old = memExhaustedCallback; 168 169 if (func != NULL) { 170 memExhaustedCallback = func; 171 } else { 172 memExhaustedCallback = memExhaustedCallbackDefault; 173 } 174 175 return old; 176 } 177 178 psMemProblemCallback psMemProblemCallbackSet(psMemProblemCallback func) 179 { 180 psMemProblemCallback old = memProblemCallback; 181 182 if (func != NULL) { 183 memProblemCallback = func; 184 } else { 185 memProblemCallback = memProblemCallbackDefault; 186 } 187 188 return old; 189 } 190 191 /* 192 * And now the I-want-to-be-informed callbacks 193 * 194 * Call the callbacks when these IDs are allocated/freed 195 */ 196 psMemoryId p_psMemAllocateID = 0; // notify user this block is allocated 197 psMemoryId p_psMemFreeID = 0; // notify user this block is freed 198 199 psMemoryId psMemAllocateCallbackSetID(psMemoryId id) 200 { 201 psMemoryId old = p_psMemAllocateID; 202 203 p_psMemAllocateID = id; 204 205 return old; 206 } 207 208 psMemoryId psMemFreeCallbackSetID(psMemoryId id) 209 { 210 psMemoryId old = p_psMemFreeID; 211 212 p_psMemFreeID = id; 213 214 return old; 215 } 216 217 psMemAllocateCallback psMemAllocateCallbackSet(psMemAllocateCallback func) 218 { 219 psMemFreeCallback old = memAllocateCallback; 220 221 if (func != NULL) { 222 memAllocateCallback = func; 223 } else { 224 memAllocateCallback = memAllocateCallbackDefault; 225 } 226 227 return old; 228 } 229 230 psMemFreeCallback psMemFreeCallbackSet(psMemFreeCallback func) 231 { 232 psMemFreeCallback old = memFreeCallback; 233 234 if (func != NULL) { 235 memFreeCallback = func; 236 } else { 237 memFreeCallback = memFreeCallbackDefault; 238 } 239 240 return old; 241 } 242 243 /* 244 * Return memory ID counter for next block to be allocated 245 */ 246 psMemoryId psMemGetId(void) 247 { 248 psMemoryId id; 249 250 pthread_mutex_lock(&memIdMutex); 251 id = memid + 1; 252 pthread_mutex_unlock(&memIdMutex); 253 254 return id; 257 255 } 258 256 … … 504 502 * Reference counting APIs 505 503 */ 504 506 505 // return refCounter 507 506 psReferenceCount psMemGetRefCounter(psPtr vptr) … … 563 562 } 564 563 564 // Did the user ask to be informed about this deallocation? 565 if (ptr->id == p_psMemFreeID) { 566 p_psMemFreeID += memFreeCallback(ptr); 567 } 568 565 569 pthread_mutex_lock(&ptr->refCounterMutex); 566 570 … … 571 575 } else { 572 576 pthread_mutex_unlock(&ptr->refCounterMutex); 573 574 // Did the user ask to be informed about this deallocation?575 if (ptr->id == p_psMemFreeID) {576 p_psMemFreeID += memFreeCallback(ptr);577 }578 577 579 578 if (ptr->freeFcn != NULL) {
Note:
See TracChangeset
for help on using the changeset viewer.
