diff options
author | Jonathan Gray <jsg@jsg.id.au> | 2013-03-15 15:22:54 +1100 |
---|---|---|
committer | Jonathan Gray <jsg@jsg.id.au> | 2013-03-15 15:22:54 +1100 |
commit | 52685f417729ae0089f640bc756c8160830c8618 (patch) | |
tree | 0f48d9029cdbdc746f1088c8a247219e2c04118d | |
parent | 38bf2accf63b7c417aacaff5dcba2ead920266d7 (diff) |
have wakeup return the number of processes woken up
-rw-r--r-- | sys/kern/kern_synch.c | 14 | ||||
-rw-r--r-- | sys/sys/systm.h | 4 |
2 files changed, 11 insertions, 7 deletions
diff --git a/sys/kern/kern_synch.c b/sys/kern/kern_synch.c index f1db615348b..084a194c847 100644 --- a/sys/kern/kern_synch.c +++ b/sys/kern/kern_synch.c @@ -350,13 +350,13 @@ unsleep(struct proc *p) /* * Make a number of processes sleeping on the specified identifier runnable. */ -void +int wakeup_n(const volatile void *ident, int n) { struct slpque *qp; struct proc *p; struct proc *pnext; - int s; + int s, woken = 0; SCHED_LOCK(s); qp = &slpque[LOOKUP(ident)]; @@ -370,20 +370,24 @@ wakeup_n(const volatile void *ident, int n) --n; p->p_wchan = 0; TAILQ_REMOVE(qp, p, p_runq); - if (p->p_stat == SSLEEP) + if (p->p_stat == SSLEEP) { setrunnable(p); + woken++; + } } } SCHED_UNLOCK(s); + + return (woken); } /* * Make all processes sleeping on the specified identifier runnable. */ -void +int wakeup(const volatile void *chan) { - wakeup_n(chan, -1); + return (wakeup_n(chan, -1)); } int diff --git a/sys/sys/systm.h b/sys/sys/systm.h index dd3823db0c8..bd5a39f1d5d 100644 --- a/sys/sys/systm.h +++ b/sys/sys/systm.h @@ -250,8 +250,8 @@ int sleep_finish_signal(struct sleep_state *); void sleep_queue_init(void); struct mutex; -void wakeup_n(const volatile void *, int); -void wakeup(const volatile void *); +int wakeup_n(const volatile void *, int); +int wakeup(const volatile void *); #define wakeup_one(c) wakeup_n((c), 1) int tsleep(const volatile void *, int, const char *, int); int msleep(const volatile void *, struct mutex *, int, const char*, int); |