Micro-optimize sleepq_broadcast().
- Avoid a conditional branch on the return value of sleepq_resume_thread() by ORing its return value into the boolean wakeup_swapper. This is consistent with other sleepqueue functions which just pass this return value to their caller. - sleepq_resume_thread() unconditionally removes the thread from its queue, so there's no need to maintain a pointer to the next element in the queue. MFC after: 2 weeks
This commit is contained in:
parent
f9ce274675
commit
d2f5f8db87
@ -865,7 +865,7 @@ int
|
||||
sleepq_broadcast(void *wchan, int flags, int pri, int queue)
|
||||
{
|
||||
struct sleepqueue *sq;
|
||||
struct thread *td, *tdn;
|
||||
struct thread *td;
|
||||
int wakeup_swapper;
|
||||
|
||||
CTR2(KTR_PROC, "sleepq_broadcast(%p, %d)", wchan, flags);
|
||||
@ -879,10 +879,9 @@ sleepq_broadcast(void *wchan, int flags, int pri, int queue)
|
||||
|
||||
/* Resume all blocked threads on the sleep queue. */
|
||||
wakeup_swapper = 0;
|
||||
TAILQ_FOREACH_SAFE(td, &sq->sq_blocked[queue], td_slpq, tdn) {
|
||||
while ((td = TAILQ_FIRST(&sq->sq_blocked[queue])) != NULL) {
|
||||
thread_lock(td);
|
||||
if (sleepq_resume_thread(sq, td, pri))
|
||||
wakeup_swapper = 1;
|
||||
wakeup_swapper |= sleepq_resume_thread(sq, td, pri);
|
||||
thread_unlock(td);
|
||||
}
|
||||
return (wakeup_swapper);
|
||||
|
Loading…
x
Reference in New Issue
Block a user