< prev index next >

src/hotspot/os/windows/os_windows.cpp

Print this page

        

*** 3745,3763 **** bool registered = false; // The first thread that reached this point, initializes the critical section. if (!InitOnceExecuteOnce(&init_once_crit_sect, init_crit_sect_call, &crit_sect, NULL)) { warning("crit_sect initialization failed in %s: %d\n", __FILE__, __LINE__); ! } else if (OrderAccess::load_acquire(&process_exiting) == 0) { if (what != EPT_THREAD) { // Atomically set process_exiting before the critical section // to increase the visibility between racing threads. Atomic::cmpxchg(GetCurrentThreadId(), &process_exiting, (DWORD)0); } EnterCriticalSection(&crit_sect); ! if (what == EPT_THREAD && OrderAccess::load_acquire(&process_exiting) == 0) { // Remove from the array those handles of the threads that have completed exiting. for (i = 0, j = 0; i < handle_count; ++i) { res = WaitForSingleObject(handles[i], 0 /* don't wait */); if (res == WAIT_TIMEOUT) { handles[j++] = handles[i]; --- 3745,3763 ---- bool registered = false; // The first thread that reached this point, initializes the critical section. if (!InitOnceExecuteOnce(&init_once_crit_sect, init_crit_sect_call, &crit_sect, NULL)) { warning("crit_sect initialization failed in %s: %d\n", __FILE__, __LINE__); ! } else if (Atomic::load_acquire(&process_exiting) == 0) { if (what != EPT_THREAD) { // Atomically set process_exiting before the critical section // to increase the visibility between racing threads. Atomic::cmpxchg(GetCurrentThreadId(), &process_exiting, (DWORD)0); } EnterCriticalSection(&crit_sect); ! if (what == EPT_THREAD && Atomic::load_acquire(&process_exiting) == 0) { // Remove from the array those handles of the threads that have completed exiting. for (i = 0, j = 0; i < handle_count; ++i) { res = WaitForSingleObject(handles[i], 0 /* don't wait */); if (res == WAIT_TIMEOUT) { handles[j++] = handles[i];
*** 3866,3876 **** LeaveCriticalSection(&crit_sect); } if (!registered && ! OrderAccess::load_acquire(&process_exiting) != 0 && process_exiting != GetCurrentThreadId()) { // Some other thread is about to call exit(), so we don't let // the current unregistered thread proceed to exit() or _endthreadex() while (true) { SuspendThread(GetCurrentThread()); --- 3866,3876 ---- LeaveCriticalSection(&crit_sect); } if (!registered && ! Atomic::load_acquire(&process_exiting) != 0 && process_exiting != GetCurrentThreadId()) { // Some other thread is about to call exit(), so we don't let // the current unregistered thread proceed to exit() or _endthreadex() while (true) { SuspendThread(GetCurrentThread());
< prev index next >