]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Implement -Xss.
authorBryce McKinlay <mckinlay@redhat.com>
Thu, 17 Nov 2005 20:25:57 +0000 (20:25 +0000)
committerBryce McKinlay <bryce@gcc.gnu.org>
Thu, 17 Nov 2005 20:25:57 +0000 (20:25 +0000)
        * include/jvm.h (gcj::stack_size): Declare.
        (_Jv_StackSize): Declare.
        * posix-threads.cc (_Jv_InitThreads): Validate gcj::stack_size.
        (_Jv_ThreadStart): Set stack size if specified.
        * prims.cc (gcj::stack_size): Define.
        (parse_memory_size): Renamed from parse_heap_size.
        (_Jv_SetStackSize): Parse stack size argument and set
        gcj::stack_size.

From-SVN: r107132

libjava/ChangeLog
libjava/include/jvm.h
libjava/posix-threads.cc
libjava/prims.cc

index f6e0c24465b6e06c7a0fd186d60fb4360804ee52..31962c62a2bf3ed59905c5d3165437b1a4be64ec 100644 (file)
@@ -1,3 +1,15 @@
+2005-11-17  Bryce McKinlay  <mckinlay@redhat.com>
+
+       Implement -Xss.
+       * include/jvm.h (gcj::stack_size): Declare.
+       (_Jv_StackSize): Declare.
+       * posix-threads.cc (_Jv_InitThreads): Validate gcj::stack_size.
+       (_Jv_ThreadStart): Set stack size if specified.
+       * prims.cc (gcj::stack_size): Define.
+       (parse_memory_size): Renamed from parse_heap_size.
+       (_Jv_SetStackSize): Parse stack size argument and set 
+       gcj::stack_size.
+
 2005-11-17  Mark Wielaard  <mark@klomp.org>
 
        * java/text/SimpleDateFormat.java: Removed, fully merged now.
index 6061300a74ddc77d9dcef6d6c2dbc33d95fb87d1..fc104d695f81b2043a03498f75b0010b8f011c06 100644 (file)
@@ -233,6 +233,9 @@ namespace gcj
   
   /* When true, enable the bytecode verifier and BC-ABI verification. */
   extern bool verifyClasses;
+
+  /* Thread stack size specified by the -Xss runtime argument. */
+  extern size_t stack_size;
 }
 
 // This class handles all aspects of class preparation and linking.
@@ -363,6 +366,10 @@ void _Jv_SetMaximumHeapSize (const char *arg);
    during thread deregistration.  */
 void _Jv_FreeMethodCache ();
 
+/* Set the stack size for threads.  Parses ARG, a number which can 
+   optionally have "k" or "m" appended.  */
+void _Jv_SetStackSize (const char *arg);
+
 extern "C" void JvRunMain (jclass klass, int argc, const char **argv);
 void _Jv_RunMain (jclass klass, const char *name, int argc, const char **argv, 
                  bool is_jar);
index f77e2f4b75a8d93e393598ca22877e8c859b255b..a596c77e131c1778bb578c94891a7051803d99b7 100644 (file)
@@ -311,6 +311,19 @@ _Jv_InitThreads (void)
   // Block SIGCHLD here to ensure that any non-Java threads inherit the new 
   // signal mask.
   block_sigchld();
+
+  // Check/set the thread stack size.
+  size_t min_ss = 32 * 1024;
+  
+  if (sizeof (void *) == 8)
+    // Bigger default on 64-bit systems.
+    min_ss *= 2;
+
+  if (min_ss < PTHREAD_STACK_MIN)
+    min_ss = PTHREAD_STACK_MIN;
+  
+  if (gcj::stack_size > 0 && gcj::stack_size < min_ss)
+    gcj::stack_size = min_ss;
 }
 
 _Jv_Thread_t *
@@ -430,6 +443,14 @@ _Jv_ThreadStart (java::lang::Thread *thread, _Jv_Thread_t *data,
   pthread_attr_init (&attr);
   pthread_attr_setschedparam (&attr, &param);
   pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
+  
+  // Set stack size if -Xss option was given.
+  if (gcj::stack_size > 0)
+    {
+      int e = pthread_attr_setstacksize (&attr, gcj::stack_size);
+      if (e != 0)
+       JvFail (strerror (e));
+    }
 
   info = (struct starter *) _Jv_AllocBytes (sizeof (struct starter));
   info->method = meth;
index ba5c9efd260dcb20c6e807db34e89e8baa01ef27..490d2b1c127b7a39ebe4faf0607f06cd2396f838 100644 (file)
@@ -959,6 +959,9 @@ namespace gcj
   
   // When true, enable the bytecode verifier and BC-ABI type verification. 
   bool verifyClasses = true;
+
+  // Thread stack size specified by the -Xss runtime argument.
+  size_t stack_size = 0;
 }
 
 // We accept all non-standard options accepted by Sun's java command,
@@ -1045,7 +1048,7 @@ parse_x_arg (char* option_string)
     }
   else if (! strncmp (option_string, "ss", 2))
     {
-      // FIXME: set thread stack size
+      _Jv_SetStackSize (option_string + 2);
     }
   else if (! strcmp (option_string, "X:+UseAltSigs"))
     {
@@ -1407,7 +1410,7 @@ JvRunMain (jclass klass, int argc, const char **argv)
 
 // Parse a string and return a heap size.
 static size_t
-parse_heap_size (const char *spec)
+parse_memory_size (const char *spec)
 {
   char *end;
   unsigned long val = strtoul (spec, &end, 10);
@@ -1423,7 +1426,7 @@ parse_heap_size (const char *spec)
 void
 _Jv_SetInitialHeapSize (const char *arg)
 {
-  size_t size = parse_heap_size (arg);
+  size_t size = parse_memory_size (arg);
   _Jv_GCSetInitialHeapSize (size);
 }
 
@@ -1432,11 +1435,16 @@ _Jv_SetInitialHeapSize (const char *arg)
 void
 _Jv_SetMaximumHeapSize (const char *arg)
 {
-  size_t size = parse_heap_size (arg);
+  size_t size = parse_memory_size (arg);
   _Jv_GCSetMaximumHeapSize (size);
 }
 
-\f
+void
+_Jv_SetStackSize (const char *arg)
+{
+  size_t size = parse_memory_size (arg);
+  gcj::stack_size = size;
+}
 
 void *
 _Jv_Malloc (jsize size)