posix-threads.cc (_Jv_CondWait): Check to see if we are interrupted before modifying the cv's wait set.
2000-09-30 Tom Tromey <tromey@cygnus.com> * posix-threads.cc (_Jv_CondWait): Check to see if we are interrupted before modifying the cv's wait set. From-SVN: r36680
This commit is contained in:
parent
bf3b8e42e2
commit
304daac5d9
2 changed files with 17 additions and 12 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2000-09-30 Tom Tromey <tromey@cygnus.com>
|
||||||
|
|
||||||
|
* posix-threads.cc (_Jv_CondWait): Check to see if we are
|
||||||
|
interrupted before modifying the cv's wait set.
|
||||||
|
|
||||||
2000-09-30 Hans Boehm <boehm@acm.org>
|
2000-09-30 Hans Boehm <boehm@acm.org>
|
||||||
Bryce McKinlay <bryce@albatross.co.nz>
|
Bryce McKinlay <bryce@albatross.co.nz>
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// posix-threads.cc - interface between libjava and POSIX threads.
|
// posix-threads.cc - interface between libjava and POSIX threads.
|
||||||
|
|
||||||
/* Copyright (C) 1998, 1999 Free Software Foundation
|
/* Copyright (C) 1998, 1999, 2000 Free Software Foundation
|
||||||
|
|
||||||
This file is part of libgcj.
|
This file is part of libgcj.
|
||||||
|
|
||||||
|
@ -104,6 +104,16 @@ _Jv_CondWait (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu,
|
||||||
_Jv_Thread_t *current = _Jv_ThreadCurrentData ();
|
_Jv_Thread_t *current = _Jv_ThreadCurrentData ();
|
||||||
java::lang::Thread *current_obj = _Jv_ThreadCurrent ();
|
java::lang::Thread *current_obj = _Jv_ThreadCurrent ();
|
||||||
|
|
||||||
|
pthread_mutex_lock (¤t->wait_mutex);
|
||||||
|
|
||||||
|
// Now that we hold the wait mutex, check if this thread has been
|
||||||
|
// interrupted already.
|
||||||
|
if (current_obj->interrupt_flag)
|
||||||
|
{
|
||||||
|
pthread_mutex_unlock (¤t->wait_mutex);
|
||||||
|
return _JV_INTERRUPTED;
|
||||||
|
}
|
||||||
|
|
||||||
// Add this thread to the cv's wait set.
|
// Add this thread to the cv's wait set.
|
||||||
current->next = NULL;
|
current->next = NULL;
|
||||||
|
|
||||||
|
@ -119,16 +129,6 @@ _Jv_CondWait (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_lock (¤t->wait_mutex);
|
|
||||||
|
|
||||||
// Now that we hold the wait mutex, check if this thread has been
|
|
||||||
// interrupted already.
|
|
||||||
if (current_obj->interrupt_flag)
|
|
||||||
{
|
|
||||||
pthread_mutex_unlock (¤t->wait_mutex);
|
|
||||||
return _JV_INTERRUPTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Record the current lock depth, so it can be restored when we re-aquire it.
|
// Record the current lock depth, so it can be restored when we re-aquire it.
|
||||||
int count = mu->count;
|
int count = mu->count;
|
||||||
|
|
||||||
|
@ -154,7 +154,7 @@ _Jv_CondWait (_Jv_ConditionVariable_t *cv, _Jv_Mutex_t *mu,
|
||||||
done_sleeping = true;
|
done_sleeping = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for an interrupt *before* unlocking the wait mutex.
|
// Check for an interrupt *before* releasing the wait mutex.
|
||||||
jboolean interrupted = current_obj->interrupt_flag;
|
jboolean interrupted = current_obj->interrupt_flag;
|
||||||
|
|
||||||
pthread_mutex_unlock (¤t->wait_mutex);
|
pthread_mutex_unlock (¤t->wait_mutex);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue