< prev index next >

src/hotspot/os/linux/os_linux.cpp

Print this page
rev 49420 : 8199717: Avoid calculating primordial thread stack bounds on VM startup
Reviewed-by: dholmes, rehn, stuefe

@@ -150,10 +150,17 @@
 
 static jlong initial_time_count=0;
 
 static int clock_tics_per_sec = 100;
 
+// If the VM might have been created on the primordial thread, we need to resolve the
+// primordial thread stack bounds and check if the current thread might be the
+// primordial thread in places. If we know that the primordial thread is never used,
+// such as when the VM was created by one of the standard java launchers, we can
+// avoid this
+static bool suppress_primordial_thread_resolution = false;
+
 // For diagnostics to print a message once. see run_periodic_checks
 static sigset_t check_signal_done;
 static bool check_signals = true;
 
 // Signal number used to suspend/resume a thread

@@ -915,10 +922,13 @@
 //////////////////////////////////////////////////////////////////////////////
 // primordial thread
 
 // Check if current thread is the primordial thread, similar to Solaris thr_main.
 bool os::is_primordial_thread(void) {
+  if (suppress_primordial_thread_resolution) {
+    return false;
+  }
   char dummy;
   // If called before init complete, thread stack bottom will be null.
   // Can be called if fatal error occurs before initialization.
   if (os::Linux::initial_thread_stack_bottom() == NULL) return false;
   assert(os::Linux::initial_thread_stack_bottom() != NULL &&

@@ -4934,11 +4944,15 @@
 
   // Check and sets minimum stack sizes against command line options
   if (Posix::set_minimum_stack_sizes() == JNI_ERR) {
     return JNI_ERR;
   }
+
+  suppress_primordial_thread_resolution = Arguments::created_by_java_launcher();
+  if (!suppress_primordial_thread_resolution) {
   Linux::capture_initial_stack(JavaThread::stack_size_at_create());
+  }
 
 #if defined(IA32)
   workaround_expand_exec_shield_cs_limit();
 #endif
 
< prev index next >