[前][次][番号順一覧][スレッド一覧]

ruby-changes:25028

From: nobu <ko1@a...>
Date: Thu, 4 Oct 2012 11:43:42 +0900 (JST)
Subject: [ruby-changes:25028] nobu:r37080 (trunk): thread_pthread.c: precise stack size

nobu	2012-10-04 11:43:30 +0900 (Thu, 04 Oct 2012)

  New Revision: 37080

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=37080

  Log:
    thread_pthread.c: precise stack size
    
    * thread_pthread.c (ruby_init_stack): round stack limit to page size
      boundary to calculate stack size more precisely.  [ruby-dev:46174]
      [Bug #7084]

  Modified files:
    trunk/ChangeLog
    trunk/thread_pthread.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 37079)
+++ ChangeLog	(revision 37080)
@@ -1,3 +1,9 @@
+Thu Oct  4 11:43:28 2012  Nobuyoshi Nakada  <nobu@r...>
+
+	* thread_pthread.c (ruby_init_stack): round stack limit to page size
+	  boundary to calculate stack size more precisely.  [ruby-dev:46174]
+	  [Bug #7084]
+
 Wed Oct  3 19:51:57 2012  Narihiro Nakamura  <authornari@g...>
 
 	* gc.c: Use the non-recursive marking instead of recursion. The
Index: thread_pthread.c
===================================================================
--- thread_pthread.c	(revision 37079)
+++ thread_pthread.c	(revision 37080)
@@ -649,14 +649,22 @@
 	STACK_GROW_DIR_DETECTION;
 	get_stack(&stackaddr, &size);
 	space = STACK_DIR_UPPER((char *)addr - (char *)stackaddr, (char *)stackaddr - (char *)addr);
+	native_main_thread.stack_maxsize = size - space;
 #elif defined(HAVE_GETRLIMIT)
+	int pagesize = getpagesize();
 	struct rlimit rlim;
 	if (getrlimit(RLIMIT_STACK, &rlim) == 0) {
 	    size = (size_t)rlim.rlim_cur;
 	}
-	space = size > 5 * 1024 * 1024 ? 1024 * 1024 : size / 5;
+	addr = native_main_thread.stack_start;
+	if (IS_STACK_DIR_UPPER()) {
+	    space = ((size_t)((char *)addr + size) / pagesize) * pagesize - (size_t)addr;
+	}
+	else {
+	    space = (size_t)addr - ((size_t)((char *)addr - size) / pagesize + 1) * pagesize;
+	}
+	native_main_thread.stack_maxsize = space;
 #endif
-	native_main_thread.stack_maxsize = size - space;
     }
 }
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]