In endtsleep() and cv_timedwait_end(), a thread marked TDF_TIMEOUT may

be swapped out.  Do not put such the thread directly back to the run
queue.

Spotted by:	David Xu <davidx@viasoft.com.cn>

While I am here, s/PS_TIMEOUT/TDF_TIMEOUT/.
This commit is contained in:
Seigo Tanimura 2002-07-30 10:12:11 +00:00
parent c72f085d04
commit 133267776c
2 changed files with 21 additions and 3 deletions

View File

@ -612,7 +612,16 @@ cv_timedwait_end(void *arg)
mtx_lock_spin(&sched_lock);
if (td->td_flags & TDF_TIMEOUT) {
td->td_flags &= ~TDF_TIMEOUT;
setrunqueue(td);
if (td->td_proc->p_sflag & PS_INMEM) {
setrunqueue(td);
maybe_resched(td);
} else {
td->td_state = TDS_SWAPPED;
if ((td->td_proc->p_sflag & PS_SWAPPINGIN) == 0) {
td->td_proc->p_sflag |= PS_SWAPINREQ;
wakeup(&proc0);
}
}
} else if (td->td_wchan != NULL) {
if (td->td_state == TDS_SLP) /* XXXKSE */
setrunnable(td);

View File

@ -621,12 +621,21 @@ endtsleep(arg)
mtx_lock_spin(&sched_lock);
/*
* This is the other half of the synchronization with msleep()
* described above. If the PS_TIMEOUT flag is set, we lost the
* described above. If the TDS_TIMEOUT flag is set, we lost the
* race and just need to put the process back on the runqueue.
*/
if ((td->td_flags & TDF_TIMEOUT) != 0) {
td->td_flags &= ~TDF_TIMEOUT;
setrunqueue(td);
if (td->td_proc->p_sflag & PS_INMEM) {
setrunqueue(td);
maybe_resched(td);
} else {
td->td_state = TDS_SWAPPED;
if ((td->td_proc->p_sflag & PS_SWAPPINGIN) == 0) {
td->td_proc->p_sflag |= PS_SWAPINREQ;
wakeup(&proc0);
}
}
} else if (td->td_wchan != NULL) {
if (td->td_state == TDS_SLP) /* XXXKSE */
setrunnable(td);