This is the mail archive of the
java-patches@sourceware.cygnus.com
mailing list for the Java project.
Patch: PR 117
- To: Java Patch List <java-patches at sourceware dot cygnus dot com>
- Subject: Patch: PR 117
- From: Tom Tromey <tromey at cygnus dot com>
- Date: 09 Dec 1999 09:35:20 -0700
- Reply-To: tromey at cygnus dot com
I'm committing this patch, which fixes PR 117.
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.
Tom
Index: include/posix-threads.h
===================================================================
RCS file: /cvs/java/libgcj/libjava/include/posix-threads.h,v
retrieving revision 1.9
diff -u -r1.9 posix-threads.h
--- posix-threads.h 1999/11/04 16:45:11 1.9
+++ posix-threads.h 1999/12/09 16:32:35
@@ -99,14 +99,18 @@
// 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 @@
#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;
}