hotspot/src/os/windows/vm/os_windows.cpp
void os::interrupt(Thread* thread) {
{- -------------------------------------------
(1) (assert)
---------------------------------------- -}
assert(!thread->is_Java_thread() || Thread::current() == thread || Threads_lock->owned_by_self(),
"possibility of dangling Thread pointer");
{- -------------------------------------------
(1) (変数宣言など)
---------------------------------------- -}
OSThread* osthread = thread->osthread();
{- -------------------------------------------
(1) OSThread::set_interrupted() を呼んで,
処理対象のスレッドの interrupted フラグを立てておく.
(ついでに, OrderAccess::release() でメモリバリアも張って,
この後の store よりも先に interrupted フラグの変更が visible になるようにしておく)
---------------------------------------- -}
osthread->set_interrupted(true);
// More than one thread can get here with the same value of osthread,
// resulting in multiple notifications. We do, however, want the store
// to interrupted() to be visible to other threads before we post
// the interrupt event.
OrderAccess::release();
{- -------------------------------------------
(1) 対象のスレッドが保持しているイベントオブジェクトに対し, SetEvent() でシグナルを送る.
(これは java.lang.Thread.sleep() に割り込むための処理.
See: java.lang.Thread.sleep())
---------------------------------------- -}
SetEvent(osthread->interrupt_event());
{- -------------------------------------------
(1) もし対象のスレッドが JavaThread であれば,
JavaThread::parker() で Parker オブジェクトを取得して
Parker::unpark() を呼び出しておく.
(これは, java.util.concurrent.locks.LockSupport.park() に割り込むための処理.
See: java.util.concurrent.locks.LockSupport.park())
---------------------------------------- -}
// For JSR166: unpark after setting status
if (thread->is_Java_thread())
((JavaThread*)thread)->parker()->unpark();
{- -------------------------------------------
(1) もし対象のスレッドの _ParkEvent フィールドに
ParkEvent オブジェクトが入っていれば (= NULL でなければ),
それに対しても os::PlatformEvent::unpark() を呼び出しておく.
(これは, java.lang.Object.wait() に割り込むための処理.
See: java.lang.Object.wait())
---------------------------------------- -}
ParkEvent * ev = thread->_ParkEvent ;
if (ev != NULL) ev->unpark() ;
}
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.