Refs #221. Set stack limit to 16MB to prevent a SEGFAULT bug on Mac OS X with DYNAMIC...
authorZhang Xianyi <traits.zhang@gmail.com>
Tue, 2 Jul 2013 06:17:55 +0000 (14:17 +0800)
committerZhang Xianyi <traits.zhang@gmail.com>
Tue, 2 Jul 2013 06:17:55 +0000 (14:17 +0800)
driver/others/memory.c

index 2070adf..21ee93d 100644 (file)
@@ -105,6 +105,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 #if defined(OS_FREEBSD) || defined(OS_DARWIN)
 #include <sys/sysctl.h>
+#include <sys/resource.h>
 #endif
 
 #if defined(OS_WINDOWS) && (defined(__MINGW32__) || defined(__MINGW64__))
@@ -216,6 +217,24 @@ int get_num_procs(void) {
   }
   return nums;
 }
+
+void set_stack_limit(int limitMB){
+  int result=0;
+  struct rlimit rl;
+  rlim_t StackSize;
+
+  StackSize=limitMB*1024*1024;
+  result=getrlimit(RLIMIT_STACK, &rl);
+  if(result==0){
+    if(rl.rlim_cur < StackSize){
+      rl.rlim_cur=StackSize;
+      result=setrlimit(RLIMIT_STACK, &rl);
+      if(result !=0){
+        fprintf(stderr, "OpenBLAS: set stack limit error =%d\n", result);                                                   
+      }
+    }
+  }
+}
 #endif
 
 /*
@@ -1248,11 +1267,18 @@ void CONSTRUCTOR gotoblas_init(void) {
 
   if (gotoblas_initialized) return;
 
+
 #ifdef PROFILE
    moncontrol (0);
 #endif
 
 #ifdef DYNAMIC_ARCH
+#if defined(SMP) && defined(OS_DARWIN) && MAX_CPU_NUMBER > 128
+  //Set stack limit to 16MB on Mac OS X 
+  //when NUM_THREADS>128 and DYNAMIC_ARCH=1.
+  //Prevent the SEGFAULT bug.
+  set_stack_limit(16);
+#endif
    gotoblas_dynamic_init();
 #endif