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>
* include/jvm.h (_Jv_makeUtf8TypeConst): Removed unused
......
......@@ -65,6 +65,25 @@ typedef struct
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.
//
......@@ -94,17 +113,15 @@ int _Jv_CondWait (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu,
jlong millis, jint nanos);
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 pthread_cond_signal (cv);
return _Jv_PthreadCheckMonitor (mu) || pthread_cond_signal (cv);
}
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 pthread_cond_broadcast (cv);
return _Jv_PthreadCheckMonitor (mu) || pthread_cond_broadcast (cv);
}
......
......@@ -27,7 +27,7 @@ extern "C" void _Jv_RegisterClasses (jclass *classes);
// `resolved' must come between `nothing' and the other states.
// Whenever the state changes, one should notify all waiters of this
// 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_LOADING 3 // has super installed
......
......@@ -405,7 +405,7 @@ _Jv_RegisterClasses (jclass *classes)
// registering a compiled class causes
// it to be immediately "prepared".
if (klass->state == JV_STATE_NOTING)
if (klass->state == JV_STATE_NOTHING)
klass->state = JV_STATE_COMPILED;
}
}
......
......@@ -75,6 +75,9 @@ int
_Jv_CondWait (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu,
jlong millis, jint nanos)
{
if (_Jv_PthreadCheckMonitor (mu))
return 1;
int r;
pthread_mutex_t *pmu;
#ifdef HAVE_RECURSIVE_MUTEX
......@@ -82,6 +85,7 @@ _Jv_CondWait (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu,
#else
pmu = &mu->mutex2;
#endif
if (millis == 0 && nanos == 0)
r = pthread_cond_wait (cv, pmu);
else
......@@ -96,6 +100,7 @@ _Jv_CondWait (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu,
if (r && errno == ETIMEDOUT)
r = 0;
}
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