mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-15 12:54:27 +00:00
Use sleepq_signal(SLEEPQ_DROP) in cv_signal().
Same as wakeup_one()/wakeup_any() commit before it reduces the lock hold time and so contention. MFC after: 1 week
This commit is contained in:
parent
588c7a06df
commit
63ca9ea4f3
|
@ -397,26 +397,23 @@ _cv_timedwait_sig_sbt(struct cv *cvp, struct lock_object *lock,
|
|||
void
|
||||
cv_signal(struct cv *cvp)
|
||||
{
|
||||
int wakeup_swapper;
|
||||
|
||||
if (cvp->cv_waiters == 0)
|
||||
return;
|
||||
wakeup_swapper = 0;
|
||||
sleepq_lock(cvp);
|
||||
if (cvp->cv_waiters > 0) {
|
||||
if (cvp->cv_waiters == CV_WAITERS_BOUND &&
|
||||
sleepq_lookup(cvp) == NULL) {
|
||||
cvp->cv_waiters = 0;
|
||||
} else {
|
||||
if (cvp->cv_waiters < CV_WAITERS_BOUND)
|
||||
cvp->cv_waiters--;
|
||||
wakeup_swapper = sleepq_signal(cvp, SLEEPQ_CONDVAR, 0,
|
||||
0);
|
||||
}
|
||||
if (cvp->cv_waiters == 0) {
|
||||
sleepq_release(cvp);
|
||||
return;
|
||||
}
|
||||
if (cvp->cv_waiters == CV_WAITERS_BOUND && sleepq_lookup(cvp) == NULL) {
|
||||
cvp->cv_waiters = 0;
|
||||
sleepq_release(cvp);
|
||||
} else {
|
||||
if (cvp->cv_waiters < CV_WAITERS_BOUND)
|
||||
cvp->cv_waiters--;
|
||||
if (sleepq_signal(cvp, SLEEPQ_CONDVAR | SLEEPQ_DROP, 0, 0))
|
||||
kick_proc0();
|
||||
}
|
||||
sleepq_release(cvp);
|
||||
if (wakeup_swapper)
|
||||
kick_proc0();
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue