]> OCCT Git - occt-copy.git/commitdiff
0023818: Extend OSD_MemInfo to report C heap statistics
authoromy <omy@opencascade.com>
Fri, 12 Apr 2013 09:21:13 +0000 (13:21 +0400)
committeromy <omy@opencascade.com>
Fri, 12 Apr 2013 09:21:13 +0000 (13:21 +0400)
A new counter MemHeapUsage was added to OSD_MemInfo class to examine program heap size
DRAW command meminfo got new option -h (--heap ) to use new counter data
The following testcases were changed to use new option -h of DRAW command meminfo
myCounters[MemHeapUsage] now will always be refilled every time the OSD_MemInfo::Update() function is called.
Fixed testcases to use meminfo -h instead of meminfo -w to detect memory leaks more properly.

21 files changed:
src/Draw/Draw_BasicCommands.cxx
src/OSD/OSD_MemInfo.cxx
src/OSD/OSD_MemInfo.hxx
tests/bugs/begin
tests/bugs/caf/buc60921
tests/bugs/caf/bug114
tests/bugs/caf/bug23489
tests/bugs/fclasses/bug22611
tests/bugs/fclasses/bug7287_1
tests/bugs/fclasses/bug7287_2
tests/bugs/fclasses/bug7287_3
tests/bugs/fclasses/bug7287_4
tests/bugs/fclasses/bug7287_5
tests/bugs/fclasses/bug7287_6
tests/bugs/moddata_1/bug145
tests/bugs/moddata_1/bug20627
tests/bugs/moddata_2/bug277
tests/bugs/moddata_3/bug162
tests/bugs/vis/bug172
tests/bugs/vis/bug5682
tests/bugs/vis/bug79

index 012af7f198d3786d57a53f0f9ae141e9829b95ce..a7355b228443468c5f348f86fe5bb2bc4b94c62c 100755 (executable)
@@ -664,6 +664,10 @@ static int dmeminfo (Draw_Interpretor& theDI,
     {
       theDI << Standard_Real (aMemInfo.Value (OSD_MemInfo::MemVirtual)) << " ";
     }
+    else if (anArg == "heap" || anArg == "h")
+    {
+      theDI << Standard_Real (aMemInfo.Value (OSD_MemInfo::MemHeapUsage)) << " ";
+    }
     else if (anArg == "wset" || anArg == "w")
     {
       theDI << Standard_Real (aMemInfo.Value (OSD_MemInfo::MemWorkingSet)) << " ";
@@ -719,7 +723,7 @@ void Draw::BasicCommands(Draw_Interpretor& theCommands)
                   "debug memory allocation/deallocation, w/o args for help",
                   __FILE__, mallochook, g);
   theCommands.Add ("meminfo",
-    "meminfo [virt|v] [wset|w] [wsetpeak] [swap] [swappeak] [private]"
+    "meminfo [virt|v] [heap|h] [wset|w] [wsetpeak] [swap] [swappeak] [private]"
     " : memory counters for this process",
          __FILE__, dmeminfo, g);
 
index f03a0377861106348284abf34706ecb76cdc76d4..09687b023fb94fabda8cc27c9a962b99e6971921 100644 (file)
@@ -21,6 +21,7 @@
   #include <windows.h>
   #include <winbase.h>
   #include <process.h>
+  #include <malloc.h>
   #include <Psapi.h>
   #ifdef _MSC_VER
     #pragma comment(lib, "Psapi.lib")
 #elif (defined(__APPLE__))
   #include <mach/task.h>
   #include <mach/mach.h>
+  #include <malloc/malloc.h>
 #else
   #include <unistd.h>
+  #include <malloc.h>
 #endif
 
 #include <string>
@@ -83,6 +86,17 @@ void OSD_MemInfo::Update()
     myCounters[MemSwapUsagePeak]  = aProcMemCnts.PeakPagefileUsage;
   }
 
+  _HEAPINFO hinfo;
+  int heapstatus;
+  hinfo._pentry = NULL;
+
+  myCounters[MemHeapUsage] = 0;
+  while((heapstatus = _heapwalk(&hinfo)) == _HEAPOK)
+  {
+    if(hinfo._useflag == _USEDENTRY)
+      myCounters[MemHeapUsage] += hinfo._size;
+  }
+
 #elif (defined(__linux__) || defined(__linux))
   // use procfs on Linux
   char aBuff[4096];
@@ -129,6 +143,10 @@ void OSD_MemInfo::Update()
     }
   }
   aFile.close();
+
+  struct mallinfo aMI = mallinfo();
+  myCounters[MemHeapUsage] = aMI.uordblks;
+
 #elif (defined(__APPLE__))
   struct task_basic_info aTaskInfo;
   mach_msg_type_number_t aTaskInfoCount = TASK_BASIC_INFO_COUNT;
@@ -138,6 +156,12 @@ void OSD_MemInfo::Update()
     // On Mac OS X, these values in bytes, not pages!
     myCounters[MemVirtual]    = aTaskInfo.virtual_size;
     myCounters[MemWorkingSet] = aTaskInfo.resident_size;
+
+    //Getting malloc statistics
+    malloc_statistics_t aStats;
+    malloc_zone_statistics (NULL, &aStats);
+
+    myCounters[MemHeapUsage] = aStats.size_in_use;
   }
 #endif
 }
@@ -175,6 +199,10 @@ TCollection_AsciiString OSD_MemInfo::ToString() const
   {
     anInfo += TCollection_AsciiString("  Virtual memory:     ") +  Standard_Integer (ValueMiB (MemVirtual)) + " MiB\n";
   }
+  if (myCounters[MemHeapUsage] != Standard_Size(-1))
+  {
+    anInfo += TCollection_AsciiString("  Heap memory:     ") +  Standard_Integer (ValueMiB (MemHeapUsage)) + " MiB\n";
+  }
   return anInfo;
 }
 
index 5e2e3c824cc6de7cacf400e0a4acd8ec1035215d..7b3e6f43ad650ca97c159ef2158fd67e13b06cc7 100644 (file)
@@ -64,6 +64,7 @@ public:
     MemWorkingSetPeak, //!< Peak working set size
     MemSwapUsage,      //!< Space allocated for the pagefile
     MemSwapUsagePeak,  //!< Peak space allocated for the pagefile
+    MemHeapUsage,      //!< Total space allocated from the heap
     MemCounter_NB      //!< Indicates total counters number
   };
 
index 18e568238c694d7805747c7e591c993815dfab43..4ebd4de2cccb4d030e999c588925a51cdc877330 100755 (executable)
@@ -234,7 +234,7 @@ proc checktrend {listval delta tolerance message} {
     # check if deviation is definitely too big
     if { abs ($mean - $delta) > 2. * $sigma } {
         puts "Checking trend failed: mean delta per step = $mean, sigma = $sigma, expected delta = $delta"
-        puts "Error : $message"
+        error "$message"
     }
 
     # check if deviation is clearly within a range
index 18579f5d06f175633634435bc037646269d8f35a..6b0c05fcc98efe15693132bcdd6062581c5e3950 100755 (executable)
@@ -44,7 +44,7 @@ for {set i 1} {$i <= ${i_max}} {incr i} {
     Undo D
 
     # check memory usage (with tolerance equal to half page size)
-    lappend listmem [expr [meminfo w] / 1024]
+    lappend listmem [meminfo h]
     if { [checktrend $listmem 0 512 "Memory leak detected"] } {
         puts "No memory leak, $i iterations"
         break
index 9373fe9470e52308b0e5cf477b710db63e1dec3d..4372783e696509c9132471cf83838b87b66b7cf1 100755 (executable)
@@ -19,7 +19,7 @@ for {set i 1} {${i} <= ${i_max}} {incr i} {
     AbortCommand D
 
     # check memory usage (with tolerance equal to half page size)
-    lappend listmem [expr [meminfo w] / 1024]
+    lappend listmem [meminfo h]
     if { [checktrend $listmem 0 1 "Memory leak detected"] } {
         puts "No memory leak, $i iterations"
         break
index 4ca3a4da99e41f5c838b6c3653e7384f7007842a..a566ba3db75b92c7de8af7ee2a6c25faf28bcdd8 100755 (executable)
@@ -27,7 +27,7 @@ for {set i 1} {$i < 10} {incr i} {
     vertex a 0 0 0
 
     # check memory usage (with tolerance equal to half page size)
-    lappend listmem [expr [meminfo w] / 1024]
+    lappend listmem [meminfo h]
     if { [checktrend $listmem 0 256 "Memory leak detected"] } {
         puts "No memory leak, $i iterations"
         break
index 081ebb1e81353d13f4999d811d54bbaf52b5aac7..518bd2d3d9214180ba1261a719690dda6b182087 100755 (executable)
@@ -16,7 +16,7 @@ set listmem {}
 set i_max 1000000
 OCC22611 "0.1214343" ${i_max}
 
-lappend listmem [expr [meminfo w] / 1024]
+lappend listmem [meminfo h]
 if { [checktrend $listmem 0 1 "Memory leak detected"] } {
     puts "No memory leak"
     break
index 2fed9a9debca8e39547d73fd8dba6d611b6c58fa..eb277742052ddbab46bcf5aabf7d8b9a5f3917d7 100755 (executable)
@@ -21,9 +21,9 @@ set listmem {}
 for {set i 1} {${i} <= ${NCycles}} {incr i } {
     bopcut r
     
-    lappend listmem [expr [meminfo w] / 1024]
+    lappend listmem [meminfo h]
     if { [checktrend $listmem 0 1 "Memory leak detected"] } {
-       puts "No memory leak, $i iterations"
-       break
+        puts "No memory leak, $i iterations"
+        break
     }
 }
index 4dc4f3918e92133f74bf8b8c86f5487a81e7b823..8bbc9ba079e783c7d7fb3caab32d3cc9e73f0f3a 100755 (executable)
@@ -20,9 +20,9 @@ bop b1 b2
 set listmem {}
 for {set i 1} {${i} <= ${NCycles}} {incr i } {
     bopcut r
-    lappend listmem [expr [meminfo w] / 1024]
+    lappend listmem [meminfo h]
     if { [checktrend $listmem 0 1 "Memory leak detected"] } {
-       puts "No memory leak, $i iterations"
-       break
+        puts "No memory leak, $i iterations"
+        break
     }
 }
index b97a709c0dc1467efa3caed577b204755475cd92..b529d2458417ca1b1c6fc603fd0e4415a02533db 100755 (executable)
@@ -22,10 +22,10 @@ set listmem {}
 for {set i 1} {${i} <= ${NCycles}} {incr i } {
     boptuc r
 
-    lappend listmem [expr [meminfo w] / 1024]
+    lappend listmem [meminfo h]
     if { [checktrend $listmem 0 1 "Memory leak detected"] } {
-       puts "No memory leak, $i iterations"
-       break
+        puts "No memory leak, $i iterations"
+        break
     }
 }
 
index 413e15969f91e065638155f40c092a5f8557104f..827dede2b5af4b634544d35a4ced39ff173a8423 100755 (executable)
@@ -21,9 +21,9 @@ set listmem {}
 for {set i 1} {${i} <= ${NCycles}} {incr i } {
     bopcommon r
 
-    lappend listmem [expr [meminfo w] / 1024]
+    lappend listmem [meminfo h]
     if { [checktrend $listmem 0 1 "Memory leak detected"] } {
-       puts "No memory leak, $i iterations"
-       break
+        puts "No memory leak, $i iterations"
+        break
     }
 }
index 61140a44906f24b22bb15c6b20d205e7f03473a0..c8ec59503ac217b81f31b6a131a6f65853dec245 100755 (executable)
@@ -20,9 +20,9 @@ bop b1 b2
 for {set i 1} {${i} <= ${NCycles}} {incr i } {
     bopfuse r
 
-    lappend listmem [expr [meminfo w] / 1024]
+    lappend listmem [meminfo h]
     if { [checktrend $listmem 0 1 "Memory leak detected"] } {
-       puts "No memory leak, $i iterations"
-       break
+        puts "No memory leak, $i iterations"
+        break
     }
 }
index 4b409a1fccf09e6075eaa78622b99d340d3ac92b..ac32a9c39ae60c6e52e25d5afda8403d286499ab 100755 (executable)
@@ -20,10 +20,10 @@ bop b1 b2
 for {set i 1} {${i} <= ${NCycles}} {incr i } {
     bopsection r
 
-    lappend listmem [expr [meminfo w] / 1024]
+    lappend listmem [meminfo h]
     if { [checktrend $listmem 0 1 "Memory leak detected"] } {
-       puts "No memory leak, $i iterations"
-       break
+        puts "No memory leak, $i iterations"
+        break
     }
 }
 
index 6992d661d98f8232e25e65b6b9dbc0bddb5ab188..54af3ca84111860e133d7d6abcbb0ed07f64104c 100755 (executable)
@@ -10,7 +10,7 @@ set listmem {}
 set i_max 10000
 OCC145 [locate_data_file OCC145.brep] ${i_max}
 
-lappend listmem [expr [meminfo w] / 1024]
+lappend listmem [meminfo h]
 if { [checktrend $listmem 0 1 "Memory leak detected"] } {
     puts "No memory leak, $i iterations"
     break
index a4fdba0ec95b1eef7360e946a81b17c6dfe0ad0b..edbf38ed32f2ccb238069b2f3abbdd2e29585e16 100755 (executable)
@@ -16,7 +16,7 @@ set listmem {}
 set i_max 10000
 OCC20627 ${i_max}
 
-lappend listmem [expr [meminfo w] / 1024]
+lappend listmem [meminfo h]
 if { [checktrend $listmem 0 1 "Memory leak detected"] } {
     puts "No memory leak"
     break
index 5a0aa435ba32f089a6f733d23f98edce251463f8..c35cdcb4b31bbb88b1013542619359a372519a86 100755 (executable)
@@ -12,9 +12,9 @@ set i_max 10
 for {set i 1} {${i} <= ${i_max}} {incr i} {
     OCC277
 
-    lappend listmem [expr [meminfo w] / 1024]
+    lappend listmem [meminfo h]
     if { [checktrend $listmem 0 1 "Memory leak detected"] } {
-       puts "No memory leak, $i iterations"
-       break
+        puts "No memory leak, $i iterations"
+        break
     }
 }
index 34815905ad71fb845bc9ce29c939a490d01aba23..1ef01619eaf444e522140b488005d28a246e3d45 100644 (file)
@@ -11,11 +11,11 @@ OCC162 s
 
 set i_max 5
 for {set i 1} {${i} <= ${i_max}} {incr i} {
-   OCC162 s
-   lappend listmem [expr [meminfo w] / 1024]
-   if { [checktrend $listmem 0 1 "Memory leak detected"] } {
-       puts "No memory leak, $i iterations"
-       break
-   }
+    OCC162 s
+    lappend listmem [meminfo h]
+    if { [checktrend $listmem 0 1 "Memory leak detected"] } {
+        puts "No memory leak, $i iterations"
+        break
+    }
 }
 
index f9ae2e59830ac84c1e49b27c2bba32b758a231e1..1fe24310d678667e8c5f20e69f69bdd2ee93901d 100755 (executable)
@@ -16,10 +16,10 @@ for {set i 1} {${i} <= ${i_max}} {incr i} {
     # deselect shape
     OCC172
     
-    lappend listmem [expr [meminfo w] / 1024]
+    lappend listmem [meminfo h]
     if { [checktrend $listmem 0 1 "Memory leak detected"] } {
-       puts "No memory leak, $i iterations"
-       break
+        puts "No memory leak, $i iterations"
+        break
     }
 }
 
index 608a8a001c69eedad7e9bb1b84229610c97b70de..b656cce07fe643bb381a53cf077a3cb27d9a7c72 100755 (executable)
@@ -18,8 +18,8 @@ vfit
 catch {vselmode 4 1}
 vclear
 
-lappend listmem [expr [meminfo w] / 1024]
+lappend listmem [meminfo h]
 if { [checktrend $listmem 0 1 "Memory leak detected"] } {
-   puts "No memory leak"
-   break
+    puts "No memory leak"
+    break
 }
index 0f9520ef701db482c2eef72a87da2746c83e4194..ced3b00c85e5f8fb6e8170fa75265153fc59e8c4 100644 (file)
@@ -12,12 +12,12 @@ vdisplay s
 set listmem {}
 set i_max 10
 for {set i 1} {${i} <= ${i_max}} {incr i} {
-   verase s
-   vdisplay s
+    verase s
+    vdisplay s
 
-   lappend listmem [expr [meminfo w] / 1024]
-   if { [checktrend $listmem 0 1 "Memory leak detected"] } {
-      puts "No memory leak, $i iterations"
-      break
-   }
+    lappend listmem [meminfo h]
+    if { [checktrend $listmem 0 1 "Memory leak detected"] } {
+        puts "No memory leak, $i iterations"
+        break
+    }
 }