diff -r fbfcdc5bf694 -r 912b79d983d9 src/hotspot/os/windows/os_windows.cpp --- 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);