Module: xenomai-3 Branch: master Commit: 21f530ad4e426efab46899a30b53251be5b83a60 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=21f530ad4e426efab46899a30b53251be5b83a60
Author: Philippe Gerum <r...@xenomai.org> Date: Fri May 22 21:02:05 2015 +0200 cobalt/pipe: care for spurious wakeups waiting for events --- include/boilerplate/setup.h | 2 +- kernel/cobalt/pipe.c | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/include/boilerplate/setup.h b/include/boilerplate/setup.h index bc8b3f6..e99a9b1 100644 --- a/include/boilerplate/setup.h +++ b/include/boilerplate/setup.h @@ -66,7 +66,7 @@ struct setup_descriptor { * * - The last priority level is used for the bootstrap code * (__bootstrap_ctor), which is guaranteed to run after any - * setup/early code, provided such code is part of the main + * setup/early code, provided such bootstrap code is part of the main * executable. * * The guarantees on the init order don't go beyond what is stated diff --git a/kernel/cobalt/pipe.c b/kernel/cobalt/pipe.c index fa16378..76db672 100644 --- a/kernel/cobalt/pipe.c +++ b/kernel/cobalt/pipe.c @@ -126,13 +126,17 @@ static inline void xnpipe_dequeue_all(struct xnpipe_state *state, int mask) xnpipe_enqueue_wait(__state, __mask); \ xnlock_put_irqrestore(&nklock, __s); \ \ - prepare_to_wait_exclusive(__waitq, &__wait, TASK_INTERRUPTIBLE);\ - \ - if (!(__cond)) \ + for (;;) { \ + __sigpending = signal_pending(current); \ + if (__sigpending) \ + break; \ + prepare_to_wait_exclusive(__waitq, &__wait, TASK_INTERRUPTIBLE); \ + if (__cond) \ + break; \ schedule(); \ + } \ \ finish_wait(__waitq, &__wait); \ - __sigpending = signal_pending(current); \ \ /* Restore the interrupt state initially set by the caller. */ \ xnlock_get_irqsave(&nklock, __s); \ _______________________________________________ Xenomai-git mailing list Xenomai-git@xenomai.org http://xenomai.org/mailman/listinfo/xenomai-git