Salome HOME
PAL16631 (SALOME crash after a mesh computation failed due to lack of memory) T_reliquat_2007
authoreap <eap@opencascade.com>
Mon, 24 Sep 2007 13:37:26 +0000 (13:37 +0000)
committereap <eap@opencascade.com>
Mon, 24 Sep 2007 13:37:26 +0000 (13:37 +0000)
src/SMDS/SMDS_MemoryLimit.cxx [new file with mode: 0644]

diff --git a/src/SMDS/SMDS_MemoryLimit.cxx b/src/SMDS/SMDS_MemoryLimit.cxx
new file mode 100644 (file)
index 0000000..e31a9a4
--- /dev/null
@@ -0,0 +1,47 @@
+// File      : SMDS_MemoryLimit.cxx
+// Created   : Fri Sep 21 17:16:42 2007
+// Author    : Edward AGAPOV (eap)
+
+// Executable to find out a lower RAM limit (MB), i.e. at what size of freeRAM
+// reported by sysinfo, no more memory can be allocated.
+// This is not done inside a function of SALOME because allocated memory is not returned
+// to the system
+
+#ifndef WIN32
+#include <sys/sysinfo.h>
+#endif
+
+#ifdef _DEBUG_
+#include <iostream>
+#endif
+
+int main (int argc, char ** argv) {
+#ifndef WIN32
+  struct sysinfo si;
+  int err = sysinfo( &si );
+  if ( err )
+    return -1;
+  unsigned long freeRamKb = ( si.freeram  * si.mem_unit ) / 1024;
+
+  const unsigned long stepKb = 8; // less nb leads to hung up on Mandriva2006 without swap
+  // (other platforms not tested w/o swap) 
+
+  unsigned long nbSteps = freeRamKb / stepKb * 2;
+  try {
+    while ( nbSteps-- ) {
+      new char[stepKb*1024];
+      err = sysinfo( &si );
+      if ( !err )
+        freeRamKb = ( si.freeram  * si.mem_unit ) / 1024;
+    }
+  } catch (...) {}
+
+// #ifdef _DEBUG_
+//   std::cout << freeRamKb / 1024 << std::endl;
+// #endif
+  return freeRamKb / 1024;
+
+#endif
+
+  return -1;
+}