Index: /trunk/psLib/src/sys/psMemory.c
===================================================================
--- /trunk/psLib/src/sys/psMemory.c	(revision 1203)
+++ /trunk/psLib/src/sys/psMemory.c	(revision 1204)
@@ -8,6 +8,6 @@
  *  @author Robert Lupton, Princeton University
  *
- *  @version $Revision: 1.26 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-06-24 03:12:19 $
+ *  @version $Revision: 1.27 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-07-09 02:45:42 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -190,19 +190,26 @@
     if (m == NULL) {
         psError(funcName,"Memory Corruption: NULL memory block found.");
-        return(1);
+        return 1;
+    }
+
+    if (m->refCounter == 0) {
+        // using an unreferenced block of memory, are you?
+        psError(__func__,"Memory Corruption: memory block %ld was freed but still used.",
+                m->id);
+        return 1;
     }
 
     if (m->startblock != P_PS_MEMMAGIC || m->endblock != P_PS_MEMMAGIC) {
-        psError(funcName, "psMemCheckCorruption: memory block %ld is corrupted (buffer underflow)",
+        psError(funcName, "Memory Corruption: memory block %ld is corrupted (buffer underflow)",
                 m->id);
-        return(1);
+        return 1;
     }
     if (*(void**)((int8_t*)(m+1)+m->userMemorySize) != P_PS_MEMMAGIC) {
-        psError(funcName, "psMemCheckCorruption: memory block %ld is corrupted (buffer overflow)",
+        psError(funcName, "Memory Corruption: memory block %ld is corrupted (buffer overflow)",
                 m->id);
-        return(1);
-    }
-
-    return(0);
+        return 1;
+    }
+
+    return 0;
 }
 
@@ -292,4 +299,10 @@
         bool isBlockLast = false;
 
+        if (checkMemBlock(ptr, __func__) != 0) {
+            memProblemCallback(ptr, file, lineno);
+            psAbort(file,"Realloc detected a memory corruption (id %ld @ %s:%d).",
+                    ptr->id,ptr->file,ptr->lineno);
+        }
+
         pthread_mutex_lock(&memBlockListMutex);
 
@@ -331,20 +344,9 @@
 void p_psFree(void *vptr, const char *file, int lineno)
 {
-    if (vptr == NULL) {
-        return;
-    }
-
-    psMemBlock *ptr = ((psMemBlock *)vptr) - 1;
-
-    if (checkMemBlock(ptr, __func__) != 0) {
-        memProblemCallback(ptr, file, lineno); // we may not own this block; don't free it
-        return;
-    }
-
-    (void)psMemDecrRefCounter(vptr);   // this handles the free, if required.
-}
-
-/*
- * Check for memory leaks. Not production quality code
+    (void)p_psMemDecrRefCounter(vptr,file,lineno);   // this handles the free, if required.
+}
+
+/*
+ * Check for memory leaks.
  */
 int psMemCheckLeaks(psMemoryId id0,psMemBlock ***arr,FILE *fd)
@@ -419,5 +421,5 @@
 }
 // increment and return refCounter
-void *psMemIncrRefCounter(void *vptr)
+void* p_psMemIncrRefCounter(void *vptr, const char *file, int lineno)
 {
     psMemBlock *ptr;
@@ -430,5 +432,5 @@
 
     if (checkMemBlock(ptr, __func__)) {
-        memProblemCallback(ptr, __func__, __LINE__);
+        memProblemCallback(ptr, file,lineno);
     }
 
@@ -441,5 +443,5 @@
 
 // decrement and return refCounter
-void *psMemDecrRefCounter(void *vptr)
+void* p_psMemDecrRefCounter(void *vptr,const char *file, int lineno)
 {
     if (vptr == NULL) {
@@ -449,4 +451,8 @@
     psMemBlock *ptr = ((psMemBlock *)vptr) - 1;
 
+    if (checkMemBlock(ptr, __func__) != 0) {
+        memProblemCallback(ptr, file, lineno);
+        return NULL;
+    }
 
     pthread_mutex_lock(&ptr->refCounterMutex);
@@ -469,4 +475,10 @@
         }
 
+        #ifdef PS_MEM_DEBUG
+        // for debug mode, we should keep the memBlock around and mark as not referenced.
+        ptr->refCounter = 0;
+        (void)p_psRealloc(vptr,0,file,lineno);
+        #else
+
         pthread_mutex_lock(&memBlockListMutex);
 
@@ -487,4 +499,5 @@
 
         free(ptr);
+        #endif
 
         vptr = NULL;    // since we freed it, make sure we return NULL.
@@ -502,4 +515,8 @@
     psMemBlock *ptr = ((psMemBlock *)vptr) - 1;
 
+    if (checkMemBlock(ptr, __func__) != 0) {
+        memProblemCallback(ptr, __func__, __LINE__);
+    }
+
     ptr->freeFcn = freeFcn;
 
@@ -513,4 +530,8 @@
     psMemBlock *ptr = ((psMemBlock *)vptr) - 1;
 
+    if (checkMemBlock(ptr, __func__) != 0) {
+        memProblemCallback(ptr, __func__, __LINE__);
+    }
+
     return ptr->freeFcn;
 }
Index: /trunk/psLib/src/sys/psMemory.h
===================================================================
--- /trunk/psLib/src/sys/psMemory.h	(revision 1203)
+++ /trunk/psLib/src/sys/psMemory.h	(revision 1204)
@@ -14,6 +14,6 @@
  *  @ingroup MemoryManagement
  *
- *  @version $Revision: 1.19 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-06-23 23:00:15 $
+ *  @version $Revision: 1.20 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-07-09 02:45:42 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -223,7 +223,16 @@
  *  @ingroup memRefCount
  */
-void *psMemIncrRefCounter(
-    void *vptr                      ///< Pointer to increment refCounter, and return
-);
+#ifdef DOXYGEN
+void* psMemIncrRefCounter(
+    void *vptr                         ///< Pointer to increment refCounter, and return
+);
+#else
+void* p_psMemIncrRefCounter(
+    void *vptr,                        ///< Pointer to increment refCounter, and return
+    const char *file,                  ///< File of call
+    int lineno                         ///< Line number of call
+);
+#define psMemIncrRefCounter(vptr) p_psMemIncrRefCounter(vptr, __FILE__, __LINE__)
+#endif
 
 /** Decrement reference counter and return the pointer
@@ -231,7 +240,16 @@
  *  @ingroup memRefCount
  */
-void *psMemDecrRefCounter(
-    void *vptr                      ///< Pointer to decrement refCounter, and return
-);
+#ifdef DOXYGEN
+void* psMemDecrRefCounter(
+    void *vptr                         ///< Pointer to decrement refCounter, and return
+);
+#else
+void* p_psMemDecrRefCounter(
+    void *vptr,                        ///< Pointer to decrement refCounter, and return
+    const char *file,                  ///< File of call
+    int lineno                         ///< Line number of call
+);
+#define psMemDecrRefCounter(vptr) p_psMemDecrRefCounter(vptr, __FILE__, __LINE__)
+#endif
 
 /** Set callback for problems
Index: /trunk/psLib/src/sysUtils/psMemory.c
===================================================================
--- /trunk/psLib/src/sysUtils/psMemory.c	(revision 1203)
+++ /trunk/psLib/src/sysUtils/psMemory.c	(revision 1204)
@@ -8,6 +8,6 @@
  *  @author Robert Lupton, Princeton University
  *
- *  @version $Revision: 1.26 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-06-24 03:12:19 $
+ *  @version $Revision: 1.27 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-07-09 02:45:42 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -190,19 +190,26 @@
     if (m == NULL) {
         psError(funcName,"Memory Corruption: NULL memory block found.");
-        return(1);
+        return 1;
+    }
+
+    if (m->refCounter == 0) {
+        // using an unreferenced block of memory, are you?
+        psError(__func__,"Memory Corruption: memory block %ld was freed but still used.",
+                m->id);
+        return 1;
     }
 
     if (m->startblock != P_PS_MEMMAGIC || m->endblock != P_PS_MEMMAGIC) {
-        psError(funcName, "psMemCheckCorruption: memory block %ld is corrupted (buffer underflow)",
+        psError(funcName, "Memory Corruption: memory block %ld is corrupted (buffer underflow)",
                 m->id);
-        return(1);
+        return 1;
     }
     if (*(void**)((int8_t*)(m+1)+m->userMemorySize) != P_PS_MEMMAGIC) {
-        psError(funcName, "psMemCheckCorruption: memory block %ld is corrupted (buffer overflow)",
+        psError(funcName, "Memory Corruption: memory block %ld is corrupted (buffer overflow)",
                 m->id);
-        return(1);
-    }
-
-    return(0);
+        return 1;
+    }
+
+    return 0;
 }
 
@@ -292,4 +299,10 @@
         bool isBlockLast = false;
 
+        if (checkMemBlock(ptr, __func__) != 0) {
+            memProblemCallback(ptr, file, lineno);
+            psAbort(file,"Realloc detected a memory corruption (id %ld @ %s:%d).",
+                    ptr->id,ptr->file,ptr->lineno);
+        }
+
         pthread_mutex_lock(&memBlockListMutex);
 
@@ -331,20 +344,9 @@
 void p_psFree(void *vptr, const char *file, int lineno)
 {
-    if (vptr == NULL) {
-        return;
-    }
-
-    psMemBlock *ptr = ((psMemBlock *)vptr) - 1;
-
-    if (checkMemBlock(ptr, __func__) != 0) {
-        memProblemCallback(ptr, file, lineno); // we may not own this block; don't free it
-        return;
-    }
-
-    (void)psMemDecrRefCounter(vptr);   // this handles the free, if required.
-}
-
-/*
- * Check for memory leaks. Not production quality code
+    (void)p_psMemDecrRefCounter(vptr,file,lineno);   // this handles the free, if required.
+}
+
+/*
+ * Check for memory leaks.
  */
 int psMemCheckLeaks(psMemoryId id0,psMemBlock ***arr,FILE *fd)
@@ -419,5 +421,5 @@
 }
 // increment and return refCounter
-void *psMemIncrRefCounter(void *vptr)
+void* p_psMemIncrRefCounter(void *vptr, const char *file, int lineno)
 {
     psMemBlock *ptr;
@@ -430,5 +432,5 @@
 
     if (checkMemBlock(ptr, __func__)) {
-        memProblemCallback(ptr, __func__, __LINE__);
+        memProblemCallback(ptr, file,lineno);
     }
 
@@ -441,5 +443,5 @@
 
 // decrement and return refCounter
-void *psMemDecrRefCounter(void *vptr)
+void* p_psMemDecrRefCounter(void *vptr,const char *file, int lineno)
 {
     if (vptr == NULL) {
@@ -449,4 +451,8 @@
     psMemBlock *ptr = ((psMemBlock *)vptr) - 1;
 
+    if (checkMemBlock(ptr, __func__) != 0) {
+        memProblemCallback(ptr, file, lineno);
+        return NULL;
+    }
 
     pthread_mutex_lock(&ptr->refCounterMutex);
@@ -469,4 +475,10 @@
         }
 
+        #ifdef PS_MEM_DEBUG
+        // for debug mode, we should keep the memBlock around and mark as not referenced.
+        ptr->refCounter = 0;
+        (void)p_psRealloc(vptr,0,file,lineno);
+        #else
+
         pthread_mutex_lock(&memBlockListMutex);
 
@@ -487,4 +499,5 @@
 
         free(ptr);
+        #endif
 
         vptr = NULL;    // since we freed it, make sure we return NULL.
@@ -502,4 +515,8 @@
     psMemBlock *ptr = ((psMemBlock *)vptr) - 1;
 
+    if (checkMemBlock(ptr, __func__) != 0) {
+        memProblemCallback(ptr, __func__, __LINE__);
+    }
+
     ptr->freeFcn = freeFcn;
 
@@ -513,4 +530,8 @@
     psMemBlock *ptr = ((psMemBlock *)vptr) - 1;
 
+    if (checkMemBlock(ptr, __func__) != 0) {
+        memProblemCallback(ptr, __func__, __LINE__);
+    }
+
     return ptr->freeFcn;
 }
Index: /trunk/psLib/src/sysUtils/psMemory.h
===================================================================
--- /trunk/psLib/src/sysUtils/psMemory.h	(revision 1203)
+++ /trunk/psLib/src/sysUtils/psMemory.h	(revision 1204)
@@ -14,6 +14,6 @@
  *  @ingroup MemoryManagement
  *
- *  @version $Revision: 1.19 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-06-23 23:00:15 $
+ *  @version $Revision: 1.20 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-07-09 02:45:42 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -223,7 +223,16 @@
  *  @ingroup memRefCount
  */
-void *psMemIncrRefCounter(
-    void *vptr                      ///< Pointer to increment refCounter, and return
-);
+#ifdef DOXYGEN
+void* psMemIncrRefCounter(
+    void *vptr                         ///< Pointer to increment refCounter, and return
+);
+#else
+void* p_psMemIncrRefCounter(
+    void *vptr,                        ///< Pointer to increment refCounter, and return
+    const char *file,                  ///< File of call
+    int lineno                         ///< Line number of call
+);
+#define psMemIncrRefCounter(vptr) p_psMemIncrRefCounter(vptr, __FILE__, __LINE__)
+#endif
 
 /** Decrement reference counter and return the pointer
@@ -231,7 +240,16 @@
  *  @ingroup memRefCount
  */
-void *psMemDecrRefCounter(
-    void *vptr                      ///< Pointer to decrement refCounter, and return
-);
+#ifdef DOXYGEN
+void* psMemDecrRefCounter(
+    void *vptr                         ///< Pointer to decrement refCounter, and return
+);
+#else
+void* p_psMemDecrRefCounter(
+    void *vptr,                        ///< Pointer to decrement refCounter, and return
+    const char *file,                  ///< File of call
+    int lineno                         ///< Line number of call
+);
+#define psMemDecrRefCounter(vptr) p_psMemDecrRefCounter(vptr, __FILE__, __LINE__)
+#endif
 
 /** Set callback for problems
Index: /trunk/psLib/test/sysUtils/verified/tst_psMemory.stderr
===================================================================
--- /trunk/psLib/test/sysUtils/verified/tst_psMemory.stderr	(revision 1203)
+++ /trunk/psLib/test/sysUtils/verified/tst_psMemory.stderr	(revision 1204)
@@ -91,6 +91,6 @@
  <DATE> <TIME> |<HOST>|I|TPmemCorruption|psMemCheckCorruption shall detect memory corruptions
  <DATE> <TIME> |<HOST>|I|TPmemCorruption|psMemCheckCorruption should output an error message and memProblemCallback callback should be called.
- <DATE> <TIME> |<HOST>|E|psMemCheckCorru|psMemCheckCorruption: memory block 1 is corrupted (buffer underflow)
- <DATE> <TIME> |<HOST>|I|memProblemCallb|memory callback called for id 1 (psMemCheckCorruption:220).
+ <DATE> <TIME> |<HOST>|E|psMemCheckCorru|Memory Corruption: memory block 1 is corrupted (buffer underflow)
+ <DATE> <TIME> |<HOST>|I|memProblemCallb|memory callback called for id 1 (psMemCheckCorruption:227).
 
 ---> TESTPOINT PASSED (psMemory{psMemCorruption} | tst_psMemory.c)
