From: bryce Date: Sat, 14 May 2005 00:42:46 +0000 (+0000) Subject: 2005-05-13 Bryce McKinlay X-Git-Tag: upstream/4.9.2~61218 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9e90421dd0753710669f9c7d11a9b2e51ce4111c;p=platform%2Fupstream%2Flinaro-gcc.git 2005-05-13 Bryce McKinlay PR libgcj/21557 * java/lang/natObject.cc (_Jv_MonitorEnter): Save and clear thread interrupt status flag if _Jv_CondWait is interrupted. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@99687 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 93060fa..ac60b21 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,9 @@ +2005-05-13 Bryce McKinlay + + PR libgcj/21557 + * java/lang/natObject.cc (_Jv_MonitorEnter): Save and clear thread + interrupt status flag if _Jv_CondWait is interrupted. + 2005-05-13 Tom Tromey * gnu/gcj/runtime/SystemClassLoader.java (init): Handle empty diff --git a/libjava/java/lang/natObject.cc b/libjava/java/lang/natObject.cc index d7b67d7..aa79500 100644 --- a/libjava/java/lang/natObject.cc +++ b/libjava/java/lang/natObject.cc @@ -35,6 +35,8 @@ details. */ +using namespace java::lang; + // This is used to represent synchronization information. struct _Jv_SyncInfo { @@ -926,12 +928,22 @@ retry: release_set(&(he -> address), (address | REQUEST_CONVERSION | HEAVY)); // release lock on he LOG(REQ_CONV, (address | REQUEST_CONVERSION | HEAVY), self); + // If _Jv_CondWait is interrupted, we ignore the interrupt, but + // restore the thread's interrupt status flag when done. + jboolean interrupt_flag = false; while ((he -> address & ~FLAGS) == (address & ~FLAGS)) { // Once converted, the lock has to retain heavyweight - // status, since heavy_count > 0 . - _Jv_CondWait (&(hl->si.condition), &(hl->si.mutex), 0, 0); + // status, since heavy_count > 0. + int r = _Jv_CondWait (&(hl->si.condition), &(hl->si.mutex), 0, 0); + if (r == _JV_INTERRUPTED) + { + interrupt_flag = true; + Thread::currentThread()->interrupt_flag = false; + } } + if (interrupt_flag) + Thread::currentThread()->interrupt_flag = interrupt_flag; keep_live(addr); // Guarantee that hl doesn't get unlinked by finalizer. // This is only an issue if the client fails to release