src/hotspot/os/windows/os_windows.cpp
changeset 52302 912b79d983d9
parent 52109 101c2b6eacbe
child 52396 e292e94b448a
--- a/src/hotspot/os/windows/os_windows.cpp	Fri Oct 26 08:23:52 2018 -0400
+++ b/src/hotspot/os/windows/os_windows.cpp	Fri Oct 19 09:39:29 2018 +0200
@@ -420,6 +420,9 @@
 
 // Thread start routine for all newly created threads
 static unsigned __stdcall thread_native_entry(Thread* thread) {
+
+  thread->record_stack_base_and_size();
+
   // Try to randomize the cache line index of hot stack frames.
   // This helps when threads of the same stack traces evict each other's
   // cache lines. The threads can be either from the same JVM instance, or
@@ -453,12 +456,15 @@
   // by VM, so VM can generate error dump when an exception occurred in non-
   // Java thread (e.g. VM thread).
   __try {
-    thread->run();
+    thread->call_run();
   } __except(topLevelExceptionFilter(
                                      (_EXCEPTION_POINTERS*)_exception_info())) {
     // Nothing to do.
   }
 
+  // Note: at this point the thread object may already have deleted itself.
+  // Do not dereference it from here on out.
+
   log_info(os, thread)("Thread finished (tid: " UINTX_FORMAT ").", os::current_thread_id());
 
   // One less thread is executing
@@ -468,15 +474,6 @@
     Atomic::dec(&os::win32::_os_thread_count);
   }
 
-  // If a thread has not deleted itself ("delete this") as part of its
-  // termination sequence, we have to ensure thread-local-storage is
-  // cleared before we actually terminate. No threads should ever be
-  // deleted asynchronously with respect to their termination.
-  if (Thread::current_or_null_safe() != NULL) {
-    assert(Thread::current_or_null_safe() == thread, "current thread is wrong");
-    thread->clear_thread_current();
-  }
-
   // Thread must not return from exit_process_or_thread(), but if it does,
   // let it proceed to exit normally
   return (unsigned)os::win32::exit_process_or_thread(os::win32::EPT_THREAD, res);