diff options
| author | membar <membar@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-09-19 08:28:43 +0000 |
|---|---|---|
| committer | membar <membar@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-09-19 08:28:43 +0000 |
| commit | 843607dfb47b51137eddb808427bd8627e89dd91 (patch) | |
| tree | d3850b3d1b7ded7bcbfb6b163fc0d2d5a78e5a7b /libjava/java/lang | |
| parent | 03caada8b6198e8429cfe14112fc0bea1de97b96 (diff) | |
| download | ppe42-gcc-843607dfb47b51137eddb808427bd8627e89dd91.tar.gz ppe42-gcc-843607dfb47b51137eddb808427bd8627e89dd91.zip | |
* win32-threads.cc: (ensure_interrupt_event_initialized) New
function for lazy initialization of an auto-reset event.
(_Jv_CondWait) Added thread interrupt support.
(_Jv_ThreadInitData) Added initialization of interrupt support
members.
(_Jv_ThreadDestroyData) Added cleanup of interrupt support members.
(_Jv_ThreadStart) Removed unused code.
(_Jv_Win32GetInterruptEvent) New method for returning interrupt event
to an external caller.
(_Jv_ThreadInterrupt) Implemented.
* include/win32-threads.h: (_Jv_Thread_t) Added a Win32 auto-reset
event for interrupt support as well as a mutex which regulates
access to this.
(_Jv_Win32GetInterruptEvent) Declared new method for returning interrupt
event to an external caller.
* java/lang/natWin32Process.cc: (cleanup) Close handle to spawned
process.
(waitFor) Added interrupt support.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@71562 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/java/lang')
| -rw-r--r-- | libjava/java/lang/natWin32Process.cc | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/libjava/java/lang/natWin32Process.cc b/libjava/java/lang/natWin32Process.cc index 86fd5b3d253..49fa853a398 100644 --- a/libjava/java/lang/natWin32Process.cc +++ b/libjava/java/lang/natWin32Process.cc @@ -46,6 +46,11 @@ java::lang::ConcreteProcess::cleanup (void) errorStream->close (); errorStream = NULL; } + if (procHandle) + { + CloseHandle((HANDLE) procHandle); + procHandle = (jint) INVALID_HANDLE_VALUE; + } } void @@ -92,8 +97,28 @@ java::lang::ConcreteProcess::waitFor (void) { DWORD exitStatus = 0UL; - // FIXME: The wait should be interruptible. - WaitForSingleObject ((HANDLE) procHandle, INFINITE); + // Set up our waitable objects array + // - 0: the handle to the process we just launched + // - 1: our thread's interrupt event + HANDLE arh[2]; + arh[0] = (HANDLE) procHandle; + arh[1] = _Jv_Win32GetInterruptEvent (); + DWORD rval = WaitForMultipleObjects (2, arh, 0, INFINITE); + + // Use the returned value from WaitForMultipleObjects + // instead of our thread's interrupt_flag to test for + // thread interruption. See the comment for + // _Jv_Win32GetInterruptEvent(). + bool bInterrupted = rval == (WAIT_OBJECT_0 + 1); + + if (bInterrupted) + { + // Querying this forces a reset our thread's interrupt flag. + Thread::interrupted(); + + cleanup (); + throw new InterruptedException (); + } GetExitCodeProcess ((HANDLE) procHandle, &exitStatus); exitCode = exitStatus; |

