diff options
author | Bryce McKinlay <mckinlay@redhat.com> | 2005-05-14 00:42:46 +0000 |
---|---|---|
committer | Bryce McKinlay <bryce@gcc.gnu.org> | 2005-05-14 01:42:46 +0100 |
commit | c8c03f8479eaf1ac91067bf475e49668dfafca34 (patch) | |
tree | be69ae4c147f570a75735439b574986f1129c19b /libjava/java/lang/natObject.cc | |
parent | 77d0a09d7fafa06b6933335db6778882430da8c0 (diff) | |
download | gcc-c8c03f8479eaf1ac91067bf475e49668dfafca34.zip gcc-c8c03f8479eaf1ac91067bf475e49668dfafca34.tar.gz gcc-c8c03f8479eaf1ac91067bf475e49668dfafca34.tar.bz2 |
re PR libgcj/21557 (Hash synchronization: Thread.interrupt() can make _Jv_MonitorEnter hang)
2005-05-13 Bryce McKinlay <mckinlay@redhat.com>
PR libgcj/21557
* java/lang/natObject.cc (_Jv_MonitorEnter): Save and clear thread
interrupt status flag if _Jv_CondWait is interrupted.
From-SVN: r99687
Diffstat (limited to 'libjava/java/lang/natObject.cc')
-rw-r--r-- | libjava/java/lang/natObject.cc | 16 |
1 files changed, 14 insertions, 2 deletions
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 |