IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 640


Ignore:
Timestamp:
May 11, 2004, 10:52:33 AM (22 years ago)
Author:
desonia
Message:

* empty log message *

Location:
trunk/psLib/test/sysUtils
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/test/sysUtils/tst_psMemory.c

    r637 r640  
    66 *  @author Robert DeSonia, MHPCC
    77 *
    8  *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
    9  *  @date $Date: 2004-05-11 03:14:49 $
     8 *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
     9 *  @date $Date: 2004-05-11 20:52:33 $
    1010 *
    1111 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    3434static long memAllocateCallback(const psMemBlock *ptr);
    3535static long memFreeCallback(const psMemBlock *ptr);
     36int TPcheckLeaks(void);
     37int TPmemCorruption(void);
     38void memProblemCallback(const psMemBlock *ptr, const char *file, int lineno);
     39
     40static int problemCallbackCalled = 0;
    3641static int allocCallbackCalled = 0;
    3742static int freeCallbackCalled = 0;
     
    4348                              {TPOutOfMemory,"450-TPOutOfMemory",0},
    4449                              {TPrealloc,"451-TPrealloc",0},
    45                               {TPallocCallback,"452-TPallocCallback",0},
    46                               {TPFreeReferencedMemory,"TPFreeReferencedMemory",6},
     50                              {TPallocCallback,"452/453-TPallocCallback",0},
     51                              {TPcheckLeaks,"454-TPcheckLeaks",0},
     52                              {TPmemCorruption,"455-TPmemCorruption",0},
     53                              {TPFreeReferencedMemory,"456-TPFreeReferencedMemory",0},
    4754                              {NULL}
    4855                          };
     
    95102    int* mem;
    96103    int currentId = psMemGetId();
    97 
    98     fprintf(stderr,"Allocating buffer.\n");
     104    int ref = 0;
     105    psMemProblemCallback cb;
     106
     107    psLogMsg(__func__,PS_LOG_INFO,"memory reference count shall be incrementable/decrementable");
     108
    99109    mem = (int*) psAlloc(100*sizeof(int));
    100110
     111    ref = psMemGetRefCounter(mem);
     112    if (ref != 1) {
     113        psError(__func__,"Expected to buffer reference count to be initially 1, but it was %d.",ref);
     114        return 1;
     115    }
     116
    101117    psMemIncrRefCounter(mem);
    102     fprintf(stderr,"Freeing buffer after incrementing reference count.\n");
     118    psMemIncrRefCounter(mem);
     119    psMemIncrRefCounter(mem);
     120
     121    ref = psMemGetRefCounter(mem);
     122    if (ref != 4) {
     123        psError(__func__,"Expected to find buffer reference count to be 4, but it was %d.",ref);
     124        return 1;
     125    }
     126
     127    psMemDecrRefCounter(mem);
     128    psMemDecrRefCounter(mem);
     129
     130    ref = psMemGetRefCounter(mem);
     131    if (ref != 2) {
     132        psError(__func__,"Expected to find buffer reference count to be 2, but it was %d.",ref);
     133        return 1;
     134    }
     135
     136    psLogMsg(__func__,PS_LOG_INFO,"expect error from free as multiple referenced buffer is freed.");
     137
     138    problemCallbackCalled = 0;
     139    cb = psMemProblemCallbackSet(memProblemCallback);
     140
     141    psFree(mem);
     142
     143    psMemProblemCallbackSet(cb);
     144
     145    if (problemCallbackCalled != 1) {
     146        psError(__func__,"Expected memProblemCallback to be called once, but was called %d times.",
     147                problemCallbackCalled);
     148        return 1;
     149    }
     150
    103151    psFree(mem);
    104152
     
    267315        return 1;
    268316    }
    269     return 0;
    270 
     317
     318    psMemCheckLeaks(currentId,NULL,NULL);
     319    psMemCheckCorruption(1);
     320
     321    return 0;
     322
     323}
     324
     325int TPcheckLeaks(void)
     326{
     327    const int numBuffers = 5;
     328    int* buffers[5];
     329    int lcv;
     330    int currentId = psMemGetId();
     331    psMemBlock** blks;
     332    int nLeaks = 0;
     333    int lineMark = 0;
     334
     335    psLogMsg(__func__,PS_LOG_INFO,"psMemCheckLeaks shall return the number of blocks above an ID "
     336             "that are still allocated");
     337
     338    for (lcv=0;lcv<numBuffers;lcv++) {
     339        lineMark = __LINE__+1;
     340        buffers[lcv] = psAlloc(sizeof(int));
     341    }
     342
     343    for (lcv=1;lcv<numBuffers;lcv++) {
     344        psFree(buffers[lcv]);
     345    }
     346
     347    psLogMsg(__func__,PS_LOG_INFO,"following psMemCheckLeaks call should produce one instance.");
     348
     349    nLeaks = psMemCheckLeaks(currentId, &blks, stderr);
     350
     351    if (nLeaks != 1) {
     352        psError(__FILE__,"psMemCheckLeaks should have found 1 leak, but found %d in %s.",nLeaks,__func__);
     353        return 1;
     354    }
     355
     356    if (blks[0]->lineno != lineMark) {
     357        psError(__FILE__,"psMemCheckLeaks found a leak other than the expected one (line %d vs %d) in %s.",
     358                lineMark, blks[0]->lineno, __func__);
     359        return 1;
     360    }
     361
     362    psFree(buffers[0]);
     363    psFree(blks);
     364
     365    psLogMsg(__func__,PS_LOG_INFO,"Testing psMemCheckLeaks again with a different leak location");
     366    psMemCheckLeaks(currentId,NULL,stderr);
     367
     368    for (lcv=0;lcv<numBuffers;lcv++) {
     369        lineMark = __LINE__+1;
     370        buffers[lcv] = psAlloc(sizeof(int));
     371    }
     372
     373    for (lcv=0;lcv<numBuffers-1;lcv++) {
     374        psFree(buffers[lcv]);
     375    }
     376
     377    psLogMsg(__func__,PS_LOG_INFO,"following psMemCheckLeaks call should produce one error.");
     378
     379    nLeaks = psMemCheckLeaks(currentId, &blks, stderr);
     380
     381    if (nLeaks != 1) {
     382        psError(__FILE__,"psMemCheckLeaks should have found 1 leak, but found %d in %s.",nLeaks,__func__);
     383        return 1;
     384    }
     385
     386    if (blks[0]->lineno != lineMark) {
     387        psError(__FILE__,"psMemCheckLeaks found a leak other than the expected one in %s.",__func__);
     388        return 1;
     389    }
     390
     391    psFree(buffers[4]);
     392    psFree(blks);
     393
     394    psLogMsg(__func__,PS_LOG_INFO,"Testing psMemCheckLeaks again with multiple leak locations.");
     395
     396    for (lcv=0;lcv<numBuffers;lcv++) {
     397        lineMark = __LINE__+1;
     398        buffers[lcv] = psAlloc(sizeof(int));
     399    }
     400
     401    for (lcv=0;lcv<numBuffers;lcv++) {
     402        if (lcv%2 == 0) {
     403            psFree(buffers[lcv]);
     404        }
     405    }
     406
     407    psLogMsg(__func__,PS_LOG_INFO,"following psMemCheckLeaks call should produce two errors.");
     408
     409    nLeaks = psMemCheckLeaks(currentId, &blks, stderr);
     410
     411    if (nLeaks != 2) {
     412        psError(__FILE__,"psMemCheckLeaks should have found 1 leak, but found %d in %s.",nLeaks,__func__);
     413        return 1;
     414    }
     415
     416    if (blks[0]->lineno != lineMark) {
     417        psError(__FILE__,"psMemCheckLeaks found a leak other than the expected one in %s.",__func__);
     418        return 1;
     419    }
     420
     421    psFree(blks);
     422    psFree(buffers[1]);
     423    psFree(buffers[3]);
     424
     425    psMemCheckLeaks(currentId,NULL,NULL);
     426    psMemCheckCorruption(1);
     427
     428    return 0;
     429}
     430
     431int TPmemCorruption(void)
     432{
     433    int* buffer = NULL;
     434    int oldValue = 0;
     435    int corruptions = 0;
     436    psMemProblemCallback cb;
     437
     438    psLogMsg(__func__,PS_LOG_INFO,"psMemCheckCorruption shall detect memory corruptions");
     439
     440    buffer = psAlloc(sizeof(int));
     441
     442    // cause memory corruption via buffer underflow
     443    *buffer = 1;
     444    buffer--;
     445    oldValue = *buffer;
     446    *buffer = 2;
     447
     448    problemCallbackCalled = 0;
     449    cb = psMemProblemCallbackSet(memProblemCallback);
     450
     451    psLogMsg(__func__,PS_LOG_INFO,"psMemCheckCorruption should output an error message and "
     452             "memProblemCallback callback should be called.");
     453
     454    corruptions = psMemCheckCorruption(0);
     455
     456    // restore the memory problem callback
     457    psMemProblemCallbackSet(cb);
     458
     459    // restore the value, 'uncorrupting' the buffer
     460    *buffer = oldValue;
     461    buffer++;
     462
     463    psFree(buffer);
     464
     465    if (corruptions != 1) {
     466        psError(__FILE__,"Expected one memory corruption but found %d in %s.",
     467                corruptions, __func__);
     468        return 1;
     469    }
     470
     471    if (problemCallbackCalled != 1) {
     472        psError(__FILE__,"The memProblemCallback was not invoked but should have been in %s",
     473                __func__);
     474        return 1;
     475    }
     476
     477    return 0;
     478
     479}
     480
     481void memProblemCallback(const psMemBlock *ptr, const char *file, int lineno)
     482{
     483    psLogMsg(__func__,PS_LOG_INFO,"memory callback called for id %d (%s:%d).",
     484             ptr->id, file, lineno);
     485    problemCallbackCalled++;
     486    return;
    271487}
    272488
  • trunk/psLib/test/sysUtils/verified/tst_psMemory.stderr

    r637 r640  
    3434/----------------------------- TESTPOINT ------------------------------------------\
    3535|             TestFile: tst_psMemory.c                                             |
    36 |            TestPoint: psMemory{452-TPallocCallback}                              |
     36|            TestPoint: psMemory{452/453-TPallocCallback}                          |
    3737|             TestType: Positive                                                   |
    3838\----------------------------------------------------------------------------------/
     
    4747 <DATE> <TIME> <HOST> |I|memFreeCallback|block 4 was freed
    4848
    49 ---> TESTPOINT PASSED (psMemory{452-TPallocCallback} | tst_psMemory.c)
     49---> TESTPOINT PASSED (psMemory{452/453-TPallocCallback} | tst_psMemory.c)
    5050
    5151/----------------------------- TESTPOINT ------------------------------------------\
    5252|             TestFile: tst_psMemory.c                                             |
    53 |            TestPoint: psMemory{TPFreeReferencedMemory}                           |
     53|            TestPoint: psMemory{454-TPcheckLeaks}                                 |
    5454|             TestType: Positive                                                   |
    5555\----------------------------------------------------------------------------------/
    5656
    57 Allocating buffer.
    58 Freeing buffer after incrementing reference count.
     57 <DATE> <TIME> <HOST> |I|TPcheckLeaks   |psMemCheckLeaks shall return the number of blocks above an ID that are still allocated
     58 <DATE> <TIME> <HOST> |I|TPcheckLeaks   |following psMemCheckLeaks call should produce one instance.
     59                   file:line ID
     60         tst_psMemory.c:340  1
     61 <DATE> <TIME> <HOST> |I|TPcheckLeaks   |Testing psMemCheckLeaks again with a different leak location
     62 <DATE> <TIME> <HOST> |I|TPcheckLeaks   |following psMemCheckLeaks call should produce one error.
     63                   file:line ID
     64         tst_psMemory.c:370  11
     65 <DATE> <TIME> <HOST> |I|TPcheckLeaks   |Testing psMemCheckLeaks again with multiple leak locations.
     66 <DATE> <TIME> <HOST> |I|TPcheckLeaks   |following psMemCheckLeaks call should produce two errors.
     67                   file:line ID
     68         tst_psMemory.c:398  16
     69         tst_psMemory.c:398  14
     70
     71---> TESTPOINT PASSED (psMemory{454-TPcheckLeaks} | tst_psMemory.c)
     72
     73/----------------------------- TESTPOINT ------------------------------------------\
     74|             TestFile: tst_psMemory.c                                             |
     75|            TestPoint: psMemory{455-TPmemCorruption}                              |
     76|             TestType: Positive                                                   |
     77\----------------------------------------------------------------------------------/
     78
     79 <DATE> <TIME> <HOST> |I|TPmemCorruption|psMemCheckCorruption shall detect memory corruptions
     80 <DATE> <TIME> <HOST> |I|TPmemCorruption|psMemCheckCorruption should output an error message and memProblemCallback callback should be called.
     81 <DATE> <TIME> <HOST> |E|psMemCheckCorruption|psMemCheckCorruption: memory block 1 is corrupted (0xdeadbeef 0x2deadbeef)
     82 <DATE> <TIME> <HOST> |I|memProblemCallback|memory callback called for id 1 (psMemCheckCorruption:220).
     83
     84---> TESTPOINT PASSED (psMemory{455-TPmemCorruption} | tst_psMemory.c)
     85
     86/----------------------------- TESTPOINT ------------------------------------------\
     87|             TestFile: tst_psMemory.c                                             |
     88|            TestPoint: psMemory{456-TPFreeReferencedMemory}                       |
     89|             TestType: Positive                                                   |
     90\----------------------------------------------------------------------------------/
     91
     92 <DATE> <TIME> <HOST> |I|TPFreeReferencedMemory|memory reference count shall be incrementable/decrementable
     93 <DATE> <TIME> <HOST> |I|TPFreeReferencedMemory|expect error from free as multiple referenced buffer is freed.
    5994 <DATE> <TIME> <HOST> |E|p_psFree       |The buffer being freed is referenced elsewhere. Buffer's reference count was decremented instead.
    60  <DATE> <TIME> <HOST> |A|memProblemCallbackDefault|Detected a problem in the memory system at tst_psMemory.c:103
     95 <DATE> <TIME> <HOST> |I|memProblemCallback|memory callback called for id 1 (tst_psMemory.c:141).
    6196
    62 ---> TESTPOINT PASSED (psMemory{TPFreeReferencedMemory} | tst_psMemory.c)
     97---> TESTPOINT PASSED (psMemory{456-TPFreeReferencedMemory} | tst_psMemory.c)
    6398
Note: See TracChangeset for help on using the changeset viewer.