diff options
author | membar <membar@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-10-31 03:36:38 +0000 |
---|---|---|
committer | membar <membar@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-10-31 03:36:38 +0000 |
commit | 9d4702a0f93f376d3579ab3855de0245c28daf20 (patch) | |
tree | ab5178c3a445c4eabae09bbe11ede4c98ba1445d /libjava/win32-threads.cc | |
parent | 123d02f4d7835d5fd8b2e1049807f3021ad9e3eb (diff) | |
download | gcc-9d4702a0f93f376d3579ab3855de0245c28daf20.tar.gz |
PR libgcj/12647:
* win32-threads.cc (_Jv_CondWait): Respect mutex's
refcount when releasing and reacquiring it.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@73118 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/win32-threads.cc')
-rw-r--r-- | libjava/win32-threads.cc | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/libjava/win32-threads.cc b/libjava/win32-threads.cc index 1f3d0c57b22..9e3981db3dd 100644 --- a/libjava/win32-threads.cc +++ b/libjava/win32-threads.cc @@ -126,7 +126,18 @@ _Jv_CondWait(_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu, jlong millis, jint na else if (millis == 0) time = INFINITE; else time = millis; - _Jv_MutexUnlock (mu); + // Record the current lock depth, so it can be restored + // when we reacquire it. + int count = mu->refcount; + int curcount = count; + + // Call _Jv_MutexUnlock repeatedly until this thread + // has completely released the monitor. + while (curcount > 0) + { + _Jv_MutexUnlock (mu); + --curcount; + } // Set up our array of three events: // - the auto-reset event (for notify()) @@ -164,7 +175,13 @@ _Jv_CondWait(_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu, jlong millis, jint na if (last_waiter) ResetEvent (cv->ev[1]); - _Jv_MutexLock (mu); + // Call _Jv_MutexLock repeatedly until the mutex's refcount is the + // same as before we originally released it. + while (curcount < count) + { + _Jv_MutexLock (mu); + ++curcount; + } return interrupted ? _JV_INTERRUPTED : 0; } |