summaryrefslogtreecommitdiffstats
path: root/libjava/java/lang
diff options
context:
space:
mode:
authormembar <membar@138bc75d-0d04-0410-961f-82ee72b054a4>2003-09-19 08:28:43 +0000
committermembar <membar@138bc75d-0d04-0410-961f-82ee72b054a4>2003-09-19 08:28:43 +0000
commit843607dfb47b51137eddb808427bd8627e89dd91 (patch)
treed3850b3d1b7ded7bcbfb6b163fc0d2d5a78e5a7b /libjava/java/lang
parent03caada8b6198e8429cfe14112fc0bea1de97b96 (diff)
downloadppe42-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.cc29
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;
OpenPOWER on IntegriCloud