summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorJonathan Gray <jsg@jsg.id.au>2013-03-15 15:22:54 +1100
committerJonathan Gray <jsg@jsg.id.au>2013-03-15 15:22:54 +1100
commit52685f417729ae0089f640bc756c8160830c8618 (patch)
tree0f48d9029cdbdc746f1088c8a247219e2c04118d /sys
parent38bf2accf63b7c417aacaff5dcba2ead920266d7 (diff)
have wakeup return the number of processes woken up
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/kern_synch.c14
-rw-r--r--sys/sys/systm.h4
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);