aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>1999-12-09 16:57:27 +0000
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>1999-12-09 16:57:27 +0000
commit9d46f942a2385be36da0968a247563b2f029d685 (patch)
tree4231bf239e6de9f15ba3e4439ad11be8daa49b95 /libjava
parentc41c7d7a6634d1fff08c11f5cb222a73b8606a0c (diff)
* include/posix-threads.h (_Jv_PthreadCheckMonitor): Handle case
where no recursive mutexes exist. Fixes PR libgcj/117. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@30847 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog5
-rw-r--r--libjava/include/posix-threads.h19
2 files changed, 22 insertions, 2 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 27181ab1fc8..36559ba8706 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,8 @@
+1999-12-08 Tom Tromey <tromey@cygnus.com>
+
+ * include/posix-threads.h (_Jv_PthreadCheckMonitor): Handle case
+ where no recursive mutexes exist. Fixes PR libgcj/117.
+
1999-12-05 Anthony Green <green@cygnus.com>
* include/jvm.h: Declare many functions with
diff --git a/libjava/include/posix-threads.h b/libjava/include/posix-threads.h
index f4952835440..4785ff8e96a 100644
--- a/libjava/include/posix-threads.h
+++ b/libjava/include/posix-threads.h
@@ -99,14 +99,18 @@ _Jv_PthreadGetMutex (_Jv_Mutex_t *mu)
// This is a convenience function used only by the pthreads thread
// implementation. This is slow, but that's too bad -- we need to do
// the checks for correctness. It might be nice to be able to compile
-// this out.
+// this out. Returns 0 if the lock is held by the current thread, and
+// 1 otherwise.
inline int
_Jv_PthreadCheckMonitor (_Jv_Mutex_t *mu)
{
- pthread_mutex_t *pmu = _Jv_PthreadGetMutex (mu);
+ pthread_mutex_t *pmu;
+#ifdef HAVE_RECURSIVE_MUTEX
+ pmu = _Jv_PthreadGetMutex (mu);
// See if the mutex is locked by this thread.
if (pthread_mutex_trylock (pmu))
return 1;
+
#if defined (PTHREAD_MUTEX_HAVE_M_COUNT)
// On Linux we exploit knowledge of the implementation.
int r = pmu->m_count == 1;
@@ -117,6 +121,17 @@ _Jv_PthreadCheckMonitor (_Jv_Mutex_t *mu)
#else
int r = mu->count == 0;
#endif
+
+#else /* HAVE_RECURSIVE_MUTEX */
+ // In this case we must lock our structure and then see if this
+ // thread owns the mutex.
+ pmu = &mu->mutex;
+ if (pthread_mutex_lock (pmu))
+ return 1;
+
+ int r = mu->thread != pthread_self () || mu->count == 0;
+#endif /* HAVE_RECURSIVE_MUTEX */
+
pthread_mutex_unlock (pmu);
return r;
}