Commit 6e87747b by Tom Tromey Committed by Tom Tromey

posix-threads.cc (_Jv_CondWait): Call _Jv_PthreadCheckMonitor.

	* posix-threads.cc (_Jv_CondWait): Call _Jv_PthreadCheckMonitor.
	* include/posix-threads.h (_Jv_PthreadCheckMonitor): New
	function.
	(_Jv_CondNotify): Use it.
	(_Jv_CondNotifyAll): Likewise.

	* java/lang/Class.h (JV_STATE_NOTHING): Correct misspelling.

From-SVN: r29030
parent b1133adf
1999-09-01 Tom Tromey <tromey@cygnus.com>
* posix-threads.cc (_Jv_CondWait): Call _Jv_PthreadCheckMonitor.
* include/posix-threads.h (_Jv_PthreadCheckMonitor): New
function.
(_Jv_CondNotify): Use it.
(_Jv_CondNotifyAll): Likewise.
* java/lang/Class.h (JV_STATE_NOTHING): Correct misspelling.
1999-08-31 Tom Tromey <tromey@cygnus.com> 1999-08-31 Tom Tromey <tromey@cygnus.com>
* include/jvm.h (_Jv_makeUtf8TypeConst): Removed unused * include/jvm.h (_Jv_makeUtf8TypeConst): Removed unused
......
...@@ -65,6 +65,25 @@ typedef struct ...@@ -65,6 +65,25 @@ typedef struct
typedef void _Jv_ThreadStartFunc (java::lang::Thread *); typedef void _Jv_ThreadStartFunc (java::lang::Thread *);
// 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.
inline int _Jv_PthreadCheckMonitor (_Jv_Mutex_t *mu)
{
pthread_mutex_t *pmu;
#ifdef HAVE_RECURSIVE_MUTEX
pmu = mu;
#else
pmu = &mu->mutex2;
#endif
// See if the mutex is locked by this thread.
if (pthread_mutex_trylock (pmu))
return 1;
pthread_mutex_unlock (pmu);
return 0;
}
// //
// Condition variables. // Condition variables.
// //
...@@ -94,17 +113,15 @@ int _Jv_CondWait (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu, ...@@ -94,17 +113,15 @@ int _Jv_CondWait (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu,
jlong millis, jint nanos); jlong millis, jint nanos);
inline int inline int
_Jv_CondNotify (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *) _Jv_CondNotify (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu)
{ {
// FIXME: check to see if mutex is held by current thread. return _Jv_PthreadCheckMonitor (mu) || pthread_cond_signal (cv);
return pthread_cond_signal (cv);
} }
inline int inline int
_Jv_CondNotifyAll (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *) _Jv_CondNotifyAll (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu)
{ {
// FIXME: check to see if mutex is held by current thread. return _Jv_PthreadCheckMonitor (mu) || pthread_cond_broadcast (cv);
return pthread_cond_broadcast (cv);
} }
......
...@@ -27,7 +27,7 @@ extern "C" void _Jv_RegisterClasses (jclass *classes); ...@@ -27,7 +27,7 @@ extern "C" void _Jv_RegisterClasses (jclass *classes);
// `resolved' must come between `nothing' and the other states. // `resolved' must come between `nothing' and the other states.
// Whenever the state changes, one should notify all waiters of this // Whenever the state changes, one should notify all waiters of this
// class. // class.
#define JV_STATE_NOTING 0 // set by compiler #define JV_STATE_NOTHING 0 // set by compiler
#define JV_STATE_PRELOADING 1 // can do _Jv_FindClass #define JV_STATE_PRELOADING 1 // can do _Jv_FindClass
#define JV_STATE_LOADING 3 // has super installed #define JV_STATE_LOADING 3 // has super installed
......
...@@ -405,7 +405,7 @@ _Jv_RegisterClasses (jclass *classes) ...@@ -405,7 +405,7 @@ _Jv_RegisterClasses (jclass *classes)
// registering a compiled class causes // registering a compiled class causes
// it to be immediately "prepared". // it to be immediately "prepared".
if (klass->state == JV_STATE_NOTING) if (klass->state == JV_STATE_NOTHING)
klass->state = JV_STATE_COMPILED; klass->state = JV_STATE_COMPILED;
} }
} }
......
...@@ -75,6 +75,9 @@ int ...@@ -75,6 +75,9 @@ int
_Jv_CondWait (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu, _Jv_CondWait (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu,
jlong millis, jint nanos) jlong millis, jint nanos)
{ {
if (_Jv_PthreadCheckMonitor (mu))
return 1;
int r; int r;
pthread_mutex_t *pmu; pthread_mutex_t *pmu;
#ifdef HAVE_RECURSIVE_MUTEX #ifdef HAVE_RECURSIVE_MUTEX
...@@ -82,6 +85,7 @@ _Jv_CondWait (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu, ...@@ -82,6 +85,7 @@ _Jv_CondWait (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu,
#else #else
pmu = &mu->mutex2; pmu = &mu->mutex2;
#endif #endif
if (millis == 0 && nanos == 0) if (millis == 0 && nanos == 0)
r = pthread_cond_wait (cv, pmu); r = pthread_cond_wait (cv, pmu);
else else
...@@ -96,6 +100,7 @@ _Jv_CondWait (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu, ...@@ -96,6 +100,7 @@ _Jv_CondWait (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu,
if (r && errno == ETIMEDOUT) if (r && errno == ETIMEDOUT)
r = 0; r = 0;
} }
return r; return r;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment