diff options
| author | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 1999-12-09 16:57:27 +0000 |
|---|---|---|
| committer | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 1999-12-09 16:57:27 +0000 |
| commit | 9d46f942a2385be36da0968a247563b2f029d685 (patch) | |
| tree | 4231bf239e6de9f15ba3e4439ad11be8daa49b95 /libjava/include | |
| parent | c41c7d7a6634d1fff08c11f5cb222a73b8606a0c (diff) | |
| download | ppe42-gcc-9d46f942a2385be36da0968a247563b2f029d685.tar.gz ppe42-gcc-9d46f942a2385be36da0968a247563b2f029d685.zip | |
* 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/include')
| -rw-r--r-- | libjava/include/posix-threads.h | 19 |
1 files changed, 17 insertions, 2 deletions
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; } |

