src/os/windows/vm/os_windows.cpp
Print this page
@@ -412,10 +412,12 @@
return NULL;
}
LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo);
+extern jint volatile vm_getting_terminated;
+
// Thread start routine for all new Java threads
static unsigned __stdcall java_start(Thread* thread) {
// 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
@@ -433,13 +435,21 @@
if (lgrp_id != -1) {
thread->set_lgrp_id(lgrp_id);
}
}
+ // Diagnostic code to investigate JDK-6573254 (Part I)
+ unsigned res = 90115; // non-java thread
+ if (thread->is_Java_thread()) {
+ JavaThread* java_thread = (JavaThread*)thread;
+ res = java_lang_Thread::is_daemon(java_thread->threadObj())
+ ? 70115 // java daemon thread
+ : 80115; // java non-daemon thread
+ }
// Install a win32 structured exception handler around every thread created
- // by VM, so VM can genrate error dump when an exception occurred in non-
+ // by VM, so VM can generate error dump when an exception occurred in non-
// Java thread (e.g. VM thread).
__try {
thread->run();
} __except(topLevelExceptionFilter(
(_EXCEPTION_POINTERS*)_exception_info())) {
@@ -451,10 +461,15 @@
// which frees the CodeHeap containing the Atomic::add code
if (thread != VMThread::vm_thread() && VMThread::vm_thread() != NULL) {
Atomic::dec_ptr((intptr_t*)&os::win32::_os_thread_count);
}
+ // Diagnostic code to investigate JDK-6573254 (Part II)
+ if (OrderAccess::load_acquire(&vm_getting_terminated)) {
+ return res;
+ }
+
return 0;
}
static OSThread* create_os_thread(Thread* thread, HANDLE thread_handle, int thread_id) {
// Allocate the OSThread object