IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Apr 28, 2005, 2:39:22 PM (21 years ago)
Author:
desonia
Message:

made the free callback to be involved on all psFree calls, not just calls
that actually free the memory.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/sysUtils/psMemory.c

    r3682 r3784  
    88*  @author Robert Lupton, Princeton University
    99*
    10 *  @version $Revision: 1.50 $ $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 $
    1212*
    1313*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    8080
    8181    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 callbacks
    128  *
    129  * Call the callbacks when these IDs are allocated/freed
    130  */
    131 psMemoryId p_psMemAllocateID = 0;       // notify user this block is allocated
    132 psMemoryId p_psMemFreeID = 0;   // notify user this block is freed
    133 
    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;
    15082}
    15183
     
    170102}
    171103
    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;
     104static 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    }
    216115}
    217116
     
    221120 * N.b. If the block wasn't allocated by psAlloc, it will appear corrupted
    222121 */
    223 
    224122static psS32 checkMemBlock(const psMemBlock* m, const char *funcName)
    225123{
     
    255153
    256154    return 0;
     155}
     156
     157/*
     158 * The default callbacks
     159 */
     160static psMemAllocateCallback memAllocateCallback = memAllocateCallbackDefault;
     161static psMemFreeCallback memFreeCallback = memFreeCallbackDefault;
     162static psMemProblemCallback memProblemCallback = memProblemCallbackDefault;
     163static psMemExhaustedCallback memExhaustedCallback = memExhaustedCallbackDefault;
     164
     165psMemExhaustedCallback 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
     178psMemProblemCallback 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 */
     196psMemoryId p_psMemAllocateID = 0;       // notify user this block is allocated
     197psMemoryId p_psMemFreeID = 0;   // notify user this block is freed
     198
     199psMemoryId psMemAllocateCallbackSetID(psMemoryId id)
     200{
     201    psMemoryId old = p_psMemAllocateID;
     202
     203    p_psMemAllocateID = id;
     204
     205    return old;
     206}
     207
     208psMemoryId psMemFreeCallbackSetID(psMemoryId id)
     209{
     210    psMemoryId old = p_psMemFreeID;
     211
     212    p_psMemFreeID = id;
     213
     214    return old;
     215}
     216
     217psMemAllocateCallback 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
     230psMemFreeCallback 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 */
     246psMemoryId 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;
    257255}
    258256
     
    504502 * Reference counting APIs
    505503 */
     504
    506505// return refCounter
    507506psReferenceCount psMemGetRefCounter(psPtr vptr)
     
    563562    }
    564563
     564    // Did the user ask to be informed about this deallocation?
     565    if (ptr->id == p_psMemFreeID) {
     566        p_psMemFreeID += memFreeCallback(ptr);
     567    }
     568
    565569    pthread_mutex_lock(&ptr->refCounterMutex);
    566570
     
    571575    } else {
    572576        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         }
    578577
    579578        if (ptr->freeFcn != NULL) {
Note: See TracChangeset for help on using the changeset viewer.