diff --git a/arch/arm/src/arm/arm_schedulesigaction.c b/arch/arm/src/arm/arm_schedulesigaction.c index 9016c39d2e7..bf2c48af9b7 100644 --- a/arch/arm/src/arm/arm_schedulesigaction.c +++ b/arch/arm/src/arm/arm_schedulesigaction.c @@ -35,7 +35,6 @@ #include "arm.h" #include "sched/sched.h" -#include "signal/signal.h" #include "arm_internal.h" /**************************************************************************** @@ -91,8 +90,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) { /* In this case just deliver the signal now. */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } /* Otherwise, we are (1) signaling a task is not running diff --git a/arch/arm/src/arm/arm_sigdeliver.c b/arch/arm/src/arm/arm_sigdeliver.c index 6a6b6a2465e..276b8a053e2 100644 --- a/arch/arm/src/arm/arm_sigdeliver.c +++ b/arch/arm/src/arm/arm_sigdeliver.c @@ -37,7 +37,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "arm_internal.h" /**************************************************************************** @@ -60,9 +59,9 @@ void arm_sigdeliver(void) board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); #ifndef CONFIG_SUPPRESS_INTERRUPTS /* Then make sure that interrupts are enabled. Signal handlers must always @@ -74,7 +73,7 @@ void arm_sigdeliver(void) /* Deliver the signal */ - nxsig_deliver(rtcb); + (rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -94,9 +93,7 @@ void arm_sigdeliver(void) * could be modified by a hostile program. */ - /* Allows next handler to be scheduled */ - - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + rtcb->sigdeliver = NULL; /* Allows next handler to be scheduled */ /* Then restore the correct state for this thread of execution. */ diff --git a/arch/arm/src/armv6-m/arm_doirq.c b/arch/arm/src/armv6-m/arm_doirq.c index f7891359b29..c3ba52564a2 100644 --- a/arch/arm/src/armv6-m/arm_doirq.c +++ b/arch/arm/src/armv6-m/arm_doirq.c @@ -34,7 +34,6 @@ #include #include #include -#include #include "arm_internal.h" #include "exc_return.h" @@ -87,7 +86,7 @@ uint32_t *arm_doirq(int irq, uint32_t *regs) irq_dispatch(irq, regs); #endif - if ((tcb->flags & TCB_FLAG_SIGDELIVER) != 0) + if (tcb->sigdeliver) { /* Pendsv able to access running tcb with no critical section */ diff --git a/arch/arm/src/armv6-m/arm_schedulesigaction.c b/arch/arm/src/armv6-m/arm_schedulesigaction.c index ddf0920df6a..56af01fe45a 100644 --- a/arch/arm/src/armv6-m/arm_schedulesigaction.c +++ b/arch/arm/src/armv6-m/arm_schedulesigaction.c @@ -37,7 +37,6 @@ #include "psr.h" #include "exc_return.h" #include "sched/sched.h" -#include "signal/signal.h" #include "arm_internal.h" #include "irq/irq.h" #include "nvic.h" @@ -97,8 +96,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) * REVISIT: Signal handle will run in a critical section! */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } else if (tcb == rtcb && ipsr != NVIC_IRQ_PENDSV) { diff --git a/arch/arm/src/armv6-m/arm_sigdeliver.c b/arch/arm/src/armv6-m/arm_sigdeliver.c index 0daf4204e6d..d9ce126b9e5 100644 --- a/arch/arm/src/armv6-m/arm_sigdeliver.c +++ b/arch/arm/src/armv6-m/arm_sigdeliver.c @@ -37,7 +37,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "arm_internal.h" /**************************************************************************** @@ -70,9 +69,9 @@ void arm_sigdeliver(void) board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); retry: #ifdef CONFIG_SMP @@ -104,7 +103,7 @@ retry: /* Deliver the signal */ - nxsig_deliver(rtcb); + (rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -151,9 +150,7 @@ retry: * could be modified by a hostile program. */ - /* Allows next handler to be scheduled */ - - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + rtcb->sigdeliver = NULL; /* Allows next handler to be scheduled */ /* Then restore the correct state for this thread of * execution. diff --git a/arch/arm/src/armv7-a/arm_schedulesigaction.c b/arch/arm/src/armv7-a/arm_schedulesigaction.c index 3a856e1a349..b68276b645e 100644 --- a/arch/arm/src/armv7-a/arm_schedulesigaction.c +++ b/arch/arm/src/armv7-a/arm_schedulesigaction.c @@ -36,7 +36,6 @@ #include "arm.h" #include "sched/sched.h" -#include "signal/signal.h" #include "arm_internal.h" #include "irq/irq.h" @@ -95,8 +94,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) * REVISIT: Signal handler will run in a critical section! */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } else { diff --git a/arch/arm/src/armv7-a/arm_sigdeliver.c b/arch/arm/src/armv7-a/arm_sigdeliver.c index d4fd6b8b7b0..fe0696f75d6 100644 --- a/arch/arm/src/armv7-a/arm_sigdeliver.c +++ b/arch/arm/src/armv7-a/arm_sigdeliver.c @@ -37,7 +37,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "arm_internal.h" /**************************************************************************** @@ -70,9 +69,9 @@ void arm_sigdeliver(void) board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); retry: #ifdef CONFIG_SMP @@ -104,7 +103,7 @@ retry: /* Deliver the signal */ - nxsig_deliver(rtcb); + (rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -151,9 +150,7 @@ retry: * could be modified by a hostile program. */ - /* Allows next handler to be scheduled */ - - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + rtcb->sigdeliver = NULL; /* Allows next handler to be scheduled */ /* Then restore the correct state for this thread of execution. */ diff --git a/arch/arm/src/armv7-a/arm_syscall.c b/arch/arm/src/armv7-a/arm_syscall.c index c42bf603a7e..f60d4d7f9a9 100644 --- a/arch/arm/src/armv7-a/arm_syscall.c +++ b/arch/arm/src/armv7-a/arm_syscall.c @@ -411,7 +411,7 @@ uint32_t *arm_syscall(uint32_t *regs) /* Copy "info" into user stack */ - if ((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0) + if (rtcb->sigdeliver) { usp = rtcb->xcp.saved_regs[REG_SP]; } diff --git a/arch/arm/src/armv7-m/arm_doirq.c b/arch/arm/src/armv7-m/arm_doirq.c index d01f4341752..9dff88e5143 100644 --- a/arch/arm/src/armv7-m/arm_doirq.c +++ b/arch/arm/src/armv7-m/arm_doirq.c @@ -34,7 +34,6 @@ #include #include #include -#include #include "arm_internal.h" #include "exc_return.h" @@ -87,7 +86,7 @@ uint32_t *arm_doirq(int irq, uint32_t *regs) irq_dispatch(irq, regs); #endif - if ((tcb->flags & TCB_FLAG_SIGDELIVER) != 0) + if (tcb->sigdeliver) { /* Pendsv able to access running tcb with no critical section */ diff --git a/arch/arm/src/armv7-m/arm_schedulesigaction.c b/arch/arm/src/armv7-m/arm_schedulesigaction.c index 4f964fa67b2..ad430e44686 100644 --- a/arch/arm/src/armv7-m/arm_schedulesigaction.c +++ b/arch/arm/src/armv7-m/arm_schedulesigaction.c @@ -38,7 +38,6 @@ #include "psr.h" #include "exc_return.h" #include "sched/sched.h" -#include "signal/signal.h" #include "arm_internal.h" #include "irq/irq.h" #include "nvic.h" @@ -98,8 +97,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) * REVISIT: Signal handle will run in a critical section! */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } else if (tcb == rtcb && ipsr != NVIC_IRQ_PENDSV) { diff --git a/arch/arm/src/armv7-m/arm_sigdeliver.c b/arch/arm/src/armv7-m/arm_sigdeliver.c index 7b83684b130..7dff72944b2 100644 --- a/arch/arm/src/armv7-m/arm_sigdeliver.c +++ b/arch/arm/src/armv7-m/arm_sigdeliver.c @@ -37,7 +37,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "arm_internal.h" /**************************************************************************** @@ -70,9 +69,9 @@ void arm_sigdeliver(void) board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); retry: #ifdef CONFIG_SMP @@ -104,7 +103,7 @@ retry: /* Deliver the signal */ - nxsig_deliver(rtcb); + (rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -151,9 +150,7 @@ retry: * could be modified by a hostile program. */ - /* Allows next handler to be scheduled */ - - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + rtcb->sigdeliver = NULL; /* Allows next handler to be scheduled */ /* Then restore the correct state for this thread of * execution. diff --git a/arch/arm/src/armv7-r/arm_schedulesigaction.c b/arch/arm/src/armv7-r/arm_schedulesigaction.c index c7f3495eb0a..c7fce2ab3d8 100644 --- a/arch/arm/src/armv7-r/arm_schedulesigaction.c +++ b/arch/arm/src/armv7-r/arm_schedulesigaction.c @@ -35,7 +35,6 @@ #include "arm.h" #include "sched/sched.h" -#include "signal/signal.h" #include "arm_internal.h" /**************************************************************************** @@ -93,8 +92,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) * REVISIT: Signal handler will run in a critical section! */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } else { diff --git a/arch/arm/src/armv7-r/arm_sigdeliver.c b/arch/arm/src/armv7-r/arm_sigdeliver.c index 0e19c6d8005..6559345a76d 100644 --- a/arch/arm/src/armv7-r/arm_sigdeliver.c +++ b/arch/arm/src/armv7-r/arm_sigdeliver.c @@ -37,7 +37,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "arm_internal.h" /**************************************************************************** @@ -70,9 +69,9 @@ void arm_sigdeliver(void) board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); retry: #ifdef CONFIG_SMP @@ -104,7 +103,7 @@ retry: /* Deliver the signal */ - nxsig_deliver(rtcb); + (rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -148,9 +147,7 @@ retry: * could be modified by a hostile program. */ - /* Allows next handler to be scheduled */ - - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + rtcb->sigdeliver = NULL; /* Allows next handler to be scheduled */ /* Then restore the correct state for this thread of execution. */ diff --git a/arch/arm/src/armv7-r/arm_syscall.c b/arch/arm/src/armv7-r/arm_syscall.c index 275e0aa6f6c..283c029e1ce 100644 --- a/arch/arm/src/armv7-r/arm_syscall.c +++ b/arch/arm/src/armv7-r/arm_syscall.c @@ -405,7 +405,7 @@ uint32_t *arm_syscall(uint32_t *regs) /* Copy "info" into user stack */ - if ((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0) + if (rtcb->sigdeliver) { usp = rtcb->xcp.saved_regs[REG_SP]; } diff --git a/arch/arm/src/armv8-m/arm_doirq.c b/arch/arm/src/armv8-m/arm_doirq.c index 537c27d14ed..3128090c2b4 100644 --- a/arch/arm/src/armv8-m/arm_doirq.c +++ b/arch/arm/src/armv8-m/arm_doirq.c @@ -97,7 +97,7 @@ uint32_t *arm_doirq(int irq, uint32_t *regs) irq_dispatch(irq, regs); #endif - if ((tcb->flags & TCB_FLAG_SIGDELIVER) != 0) + if (tcb->sigdeliver) { /* Pendsv able to access running tcb with no critical section */ diff --git a/arch/arm/src/armv8-m/arm_schedulesigaction.c b/arch/arm/src/armv8-m/arm_schedulesigaction.c index 4482d8f778d..523082806c9 100644 --- a/arch/arm/src/armv8-m/arm_schedulesigaction.c +++ b/arch/arm/src/armv8-m/arm_schedulesigaction.c @@ -38,7 +38,6 @@ #include "psr.h" #include "exc_return.h" #include "sched/sched.h" -#include "signal/signal.h" #include "arm_internal.h" #include "irq/irq.h" #include "nvic.h" @@ -98,8 +97,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) * REVISIT: Signal handle will run in a critical section! */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } else if (tcb == rtcb && ipsr != NVIC_IRQ_PENDSV) { diff --git a/arch/arm/src/armv8-m/arm_sigdeliver.c b/arch/arm/src/armv8-m/arm_sigdeliver.c index 8f2707f871a..6f5e91814fe 100644 --- a/arch/arm/src/armv8-m/arm_sigdeliver.c +++ b/arch/arm/src/armv8-m/arm_sigdeliver.c @@ -37,7 +37,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "arm_internal.h" /**************************************************************************** @@ -70,9 +69,9 @@ void arm_sigdeliver(void) board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); retry: #ifdef CONFIG_SMP @@ -104,7 +103,7 @@ retry: /* Deliver the signal */ - nxsig_deliver(rtcb); + (rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -151,9 +150,7 @@ retry: * could be modified by a hostile program. */ - /* Allows next handler to be scheduled */ - - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + rtcb->sigdeliver = NULL; /* Allows next handler to be scheduled */ /* Then restore the correct state for this thread of * execution. diff --git a/arch/arm/src/armv8-r/arm_schedulesigaction.c b/arch/arm/src/armv8-r/arm_schedulesigaction.c index 2c035496cc9..fcb18ab9388 100644 --- a/arch/arm/src/armv8-r/arm_schedulesigaction.c +++ b/arch/arm/src/armv8-r/arm_schedulesigaction.c @@ -35,7 +35,6 @@ #include "arm.h" #include "sched/sched.h" -#include "signal/signal.h" #include "arm_internal.h" /**************************************************************************** @@ -93,8 +92,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) * REVISIT: Signal handler will run in a critical section! */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } else { diff --git a/arch/arm/src/armv8-r/arm_sigdeliver.c b/arch/arm/src/armv8-r/arm_sigdeliver.c index 8280f419317..b876d98bda1 100644 --- a/arch/arm/src/armv8-r/arm_sigdeliver.c +++ b/arch/arm/src/armv8-r/arm_sigdeliver.c @@ -37,7 +37,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "arm_internal.h" /**************************************************************************** @@ -70,9 +69,9 @@ void arm_sigdeliver(void) board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); retry: #ifdef CONFIG_SMP @@ -104,7 +103,7 @@ retry: /* Deliver the signal */ - nxsig_deliver(rtcb); + (rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -148,9 +147,7 @@ retry: * could be modified by a hostile program. */ - /* Allows next handler to be scheduled */ - - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + rtcb->sigdeliver = NULL; /* Allows next handler to be scheduled */ /* Then restore the correct state for this thread of execution. */ diff --git a/arch/arm/src/armv8-r/arm_syscall.c b/arch/arm/src/armv8-r/arm_syscall.c index baa31466892..af389c945e9 100644 --- a/arch/arm/src/armv8-r/arm_syscall.c +++ b/arch/arm/src/armv8-r/arm_syscall.c @@ -408,7 +408,7 @@ uint32_t *arm_syscall(uint32_t *regs) /* Copy "info" into user stack */ - if ((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0) + if (rtcb->sigdeliver) { usp = rtcb->xcp.saved_regs[REG_SP]; } diff --git a/arch/arm/src/tlsr82/tc32/tc32_schedulesigaction.c b/arch/arm/src/tlsr82/tc32/tc32_schedulesigaction.c index 58235a53e20..2e95c6765f5 100644 --- a/arch/arm/src/tlsr82/tc32/tc32_schedulesigaction.c +++ b/arch/arm/src/tlsr82/tc32/tc32_schedulesigaction.c @@ -35,7 +35,6 @@ #include "tc32.h" #include "sched/sched.h" -#include "signal/signal.h" #include "arm_internal.h" /**************************************************************************** @@ -91,8 +90,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) { /* In this case just deliver the signal now. */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } /* Otherwise, we are (1) signaling a task is not running diff --git a/arch/arm64/src/common/arm64_schedulesigaction.c b/arch/arm64/src/common/arm64_schedulesigaction.c index 2ba5eaad73b..a143a05bb8e 100644 --- a/arch/arm64/src/common/arm64_schedulesigaction.c +++ b/arch/arm64/src/common/arm64_schedulesigaction.c @@ -35,7 +35,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "arm64_internal.h" #include "arm64_arch.h" #include "irq/irq.h" @@ -131,8 +130,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) * REVISIT: Signal handler will run in a critical section! */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } else { diff --git a/arch/arm64/src/common/arm64_sigdeliver.c b/arch/arm64/src/common/arm64_sigdeliver.c index dac0f0a3c3a..2395aa1e8c6 100644 --- a/arch/arm64/src/common/arm64_sigdeliver.c +++ b/arch/arm64/src/common/arm64_sigdeliver.c @@ -35,7 +35,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "arm64_internal.h" #include "arm64_arch.h" #include "irq/irq.h" @@ -70,9 +69,9 @@ void arm64_sigdeliver(void) flags = (rtcb->xcp.saved_regs[REG_SPSR] & SPSR_DAIF_MASK); #endif - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); retry: #ifdef CONFIG_SMP @@ -104,7 +103,7 @@ retry: /* Deliver the signal */ - nxsig_deliver(rtcb); + (rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -151,9 +150,7 @@ retry: * could be modified by a hostile program. */ - /* Allows next handler to be scheduled */ - - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + rtcb->sigdeliver = NULL; /* Allows next handler to be scheduled */ rtcb->xcp.regs = rtcb->xcp.saved_regs; /* Then restore the correct state for this thread of execution. */ diff --git a/arch/avr/src/avr/avr_schedulesigaction.c b/arch/avr/src/avr/avr_schedulesigaction.c index cfc0685f18c..ce69f30d311 100644 --- a/arch/avr/src/avr/avr_schedulesigaction.c +++ b/arch/avr/src/avr/avr_schedulesigaction.c @@ -35,7 +35,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "avr_internal.h" /**************************************************************************** @@ -99,8 +98,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) { /* In this case just deliver the signal now. */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } /* CASE 2: We are in an interrupt handler AND the diff --git a/arch/avr/src/avr/avr_sigdeliver.c b/arch/avr/src/avr/avr_sigdeliver.c index 89f15972228..e7be0563b6c 100644 --- a/arch/avr/src/avr/avr_sigdeliver.c +++ b/arch/avr/src/avr/avr_sigdeliver.c @@ -37,7 +37,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "avr_internal.h" /**************************************************************************** @@ -61,9 +60,9 @@ void avr_sigdeliver(void) board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); /* Save the return state on the stack. */ @@ -79,7 +78,7 @@ void avr_sigdeliver(void) /* Deliver the signal */ - nxsig_deliver(rtcb); + (rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -99,19 +98,17 @@ void avr_sigdeliver(void) * could be modified by a hostile program. */ - regs[REG_PC0] = rtcb->xcp.saved_pc0; - regs[REG_PC1] = rtcb->xcp.saved_pc1; + regs[REG_PC0] = rtcb->xcp.saved_pc0; + regs[REG_PC1] = rtcb->xcp.saved_pc1; #if defined(REG_PC2) - regs[REG_PC2] = rtcb->xcp.saved_pc2; + regs[REG_PC2] = rtcb->xcp.saved_pc2; #endif + #if defined(REG_RAMPZ) regs[REG_RAMPZ] = rtcb->xcp.saved_rampz; #endif - regs[REG_SREG] = rtcb->xcp.saved_sreg; - - /* Allows next handler to be scheduled */ - - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + regs[REG_SREG] = rtcb->xcp.saved_sreg; + rtcb->sigdeliver = NULL; /* Allows next handler to be scheduled */ /* Then restore the correct state for this thread of execution. This is an * unusual case that must be handled by up_fullcontextresore. This case is diff --git a/arch/avr/src/avr32/avr_initialstate.c b/arch/avr/src/avr32/avr_initialstate.c index 2b666e9f4fb..7e4ced382ac 100644 --- a/arch/avr/src/avr32/avr_initialstate.c +++ b/arch/avr/src/avr32/avr_initialstate.c @@ -89,7 +89,7 @@ void up_initial_state(struct tcb_s *tcb) #else /* No pending signal delivery */ - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + tcb->sigdeliver = NULL; /* Clear the frame pointer and link register since this is the outermost * frame. diff --git a/arch/avr/src/avr32/avr_schedulesigaction.c b/arch/avr/src/avr32/avr_schedulesigaction.c index 141e3ecb5cb..fc9be71af9f 100644 --- a/arch/avr/src/avr32/avr_schedulesigaction.c +++ b/arch/avr/src/avr32/avr_schedulesigaction.c @@ -35,7 +35,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "avr_internal.h" /**************************************************************************** @@ -97,8 +96,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) { /* In this case just deliver the signal now. */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } /* CASE 2: We are in an interrupt handler AND the diff --git a/arch/avr/src/avr32/avr_sigdeliver.c b/arch/avr/src/avr32/avr_sigdeliver.c index 3f2d2408ae6..d799bc420e8 100644 --- a/arch/avr/src/avr32/avr_sigdeliver.c +++ b/arch/avr/src/avr32/avr_sigdeliver.c @@ -37,7 +37,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "avr_internal.h" /**************************************************************************** @@ -65,9 +64,9 @@ void avr_sigdeliver(void) board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); /* Save the return state on the stack. */ @@ -83,7 +82,7 @@ void avr_sigdeliver(void) /* Deliver the signal */ - nxsig_deliver(rtcb); + (rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -103,12 +102,9 @@ void avr_sigdeliver(void) * could be modified by a hostile program. */ - regs[REG_PC] = rtcb->xcp.saved_pc; - regs[REG_SR] = rtcb->xcp.saved_sr; - - /* Allows next handler to be scheduled */ - - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + regs[REG_PC] = rtcb->xcp.saved_pc; + regs[REG_SR] = rtcb->xcp.saved_sr; + rtcb->sigdeliver = NULL; /* Allows next handler to be scheduled */ /* Then restore the correct state for this thread of execution. This is an * unusual case that must be handled by up_fullcontextresore. This case is diff --git a/arch/ceva/src/common/ceva_schedulesigaction.c b/arch/ceva/src/common/ceva_schedulesigaction.c index 4345a54f3d2..5a2f62025c4 100644 --- a/arch/ceva/src/common/ceva_schedulesigaction.c +++ b/arch/ceva/src/common/ceva_schedulesigaction.c @@ -33,7 +33,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "ceva_internal.h" #ifndef CONFIG_DISABLE_SIGNALS @@ -101,8 +100,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) { /* In this case just deliver the signal now. */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } /* CASE 2: The task that needs to receive the signal is running. diff --git a/arch/ceva/src/common/ceva_sigdeliver.c b/arch/ceva/src/common/ceva_sigdeliver.c index f13bb9c487b..9a61377425a 100644 --- a/arch/ceva/src/common/ceva_sigdeliver.c +++ b/arch/ceva/src/common/ceva_sigdeliver.c @@ -54,6 +54,7 @@ void ceva_sigdeliver(void) { struct tcb_s *rtcb = this_task(); uint32_t *regs = rtcb->xcp.saved_regs; + sig_deliver_t sigdeliver; /* Save the errno. This must be preserved throughout the signal handling * so that the user code final gets the correct errno value (probably @@ -62,20 +63,21 @@ void ceva_sigdeliver(void) int saved_errno = rtcb->pterrno; - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); - /* We do this so that we can nullify the TCB_FLAG_SIGDELIVER in the TCB - * and accept more signal deliveries while processing the current pending - * signals. + /* Get a local copy of the sigdeliver function pointer. We do this so that + * we can nullify the sigdeliver function pointer in the TCB and accept + * more signal deliveries while processing the current pending signals. */ - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + sigdeliver = rtcb->sigdeliver; + rtcb->sigdeliver = NULL; /* Deliver the signal */ - nxsig_deliver(rtcb); + sigdeliver(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original diff --git a/arch/mips/src/mips32/mips_schedulesigaction.c b/arch/mips/src/mips32/mips_schedulesigaction.c index a9eb1a2efe0..5899549b509 100644 --- a/arch/mips/src/mips32/mips_schedulesigaction.c +++ b/arch/mips/src/mips32/mips_schedulesigaction.c @@ -36,7 +36,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "mips_internal.h" /**************************************************************************** @@ -100,8 +99,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) { /* In this case just deliver the signal now. */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } /* CASE 2: We are in an interrupt handler AND the diff --git a/arch/mips/src/mips32/mips_sigdeliver.c b/arch/mips/src/mips32/mips_sigdeliver.c index b4cd103d9d2..f333adb7043 100644 --- a/arch/mips/src/mips32/mips_sigdeliver.c +++ b/arch/mips/src/mips32/mips_sigdeliver.c @@ -39,7 +39,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "mips_internal.h" /**************************************************************************** @@ -63,9 +62,9 @@ void mips_sigdeliver(void) board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); /* Save the return state on the stack. */ @@ -81,7 +80,7 @@ void mips_sigdeliver(void) /* Deliver the signal */ - nxsig_deliver(rtcb); + (rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -105,10 +104,7 @@ void mips_sigdeliver(void) regs[REG_EPC] = rtcb->xcp.saved_epc; regs[REG_STATUS] = rtcb->xcp.saved_status; - - /* Allows next handler to be scheduled */ - - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + rtcb->sigdeliver = NULL; /* Allows next handler to be scheduled */ /* Then restore the correct state for this thread of * execution. diff --git a/arch/misoc/src/lm32/lm32_schedulesigaction.c b/arch/misoc/src/lm32/lm32_schedulesigaction.c index 83db54afa98..95e42a15c4a 100644 --- a/arch/misoc/src/lm32/lm32_schedulesigaction.c +++ b/arch/misoc/src/lm32/lm32_schedulesigaction.c @@ -35,7 +35,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "lm32.h" /**************************************************************************** @@ -97,8 +96,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) { /* In this case just deliver the signal now. */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } /* CASE 2: We are in an interrupt handler AND the diff --git a/arch/misoc/src/lm32/lm32_sigdeliver.c b/arch/misoc/src/lm32/lm32_sigdeliver.c index fc3e807d041..c0fac7e36d9 100644 --- a/arch/misoc/src/lm32/lm32_sigdeliver.c +++ b/arch/misoc/src/lm32/lm32_sigdeliver.c @@ -38,7 +38,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "lm32.h" /**************************************************************************** @@ -62,9 +61,9 @@ void lm32_sigdeliver(void) board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); /* Save the return state on the stack. */ @@ -80,7 +79,7 @@ void lm32_sigdeliver(void) /* Deliver the signal */ - nxsig_deliver(rtcb); + (rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -104,10 +103,7 @@ void lm32_sigdeliver(void) regs[REG_EPC] = rtcb->xcp.saved_epc; regs[REG_INT_CTX] = rtcb->xcp.saved_int_ctx; - - /* Allows next handler to be scheduled */ - - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + rtcb->sigdeliver = NULL; /* Allows next handler to be scheduled */ /* Then restore the correct state for this thread of * execution. diff --git a/arch/misoc/src/minerva/minerva_schedulesigaction.c b/arch/misoc/src/minerva/minerva_schedulesigaction.c index cd46ee4bdae..e563c485fd5 100644 --- a/arch/misoc/src/minerva/minerva_schedulesigaction.c +++ b/arch/misoc/src/minerva/minerva_schedulesigaction.c @@ -36,7 +36,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "minerva.h" /**************************************************************************** @@ -98,8 +97,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) { /* In this case just deliver the signal now. */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } /* CASE 2: We are in an interrupt handler AND the interrupted task diff --git a/arch/misoc/src/minerva/minerva_sigdeliver.c b/arch/misoc/src/minerva/minerva_sigdeliver.c index e579b686f7e..12053d0fec0 100644 --- a/arch/misoc/src/minerva/minerva_sigdeliver.c +++ b/arch/misoc/src/minerva/minerva_sigdeliver.c @@ -59,12 +59,13 @@ void minerva_sigdeliver(void) { struct tcb_s *rtcb = this_task(); uint32_t regs[XCPTCONTEXT_REGS]; + sig_deliver_t sigdeliver; board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); /* Save the real return state on the stack. */ @@ -72,12 +73,13 @@ void minerva_sigdeliver(void) regs[REG_CSR_MEPC] = rtcb->xcp.saved_epc; regs[REG_CSR_MSTATUS] = rtcb->xcp.saved_int_ctx; - /* We do this so that we can nullify the TCB_FLAG_SIGDELIVER in the TCB - * and accept more signal deliveries while processing the current pending - * signals. + /* Get a local copy of the sigdeliver function pointer. We do this so that + * we can nullify the sigdeliver function pointer in the TCB and accept + * more signal deliveries while processing the current pending signals. */ - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + sigdeliver = rtcb->sigdeliver; + rtcb->sigdeliver = NULL; # ifndef CONFIG_SUPPRESS_INTERRUPTS /* Then make sure that interrupts are enabled. Signal handlers must always @@ -89,7 +91,7 @@ void minerva_sigdeliver(void) /* Deliver the signals */ - nxsig_deliver(rtcb); + sigdeliver(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original diff --git a/arch/or1k/src/common/or1k_schedulesigaction.c b/arch/or1k/src/common/or1k_schedulesigaction.c index af1b9ebdd8e..305e3de998c 100644 --- a/arch/or1k/src/common/or1k_schedulesigaction.c +++ b/arch/or1k/src/common/or1k_schedulesigaction.c @@ -34,7 +34,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "or1k_internal.h" /**************************************************************************** @@ -96,8 +95,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) { /* In this case just deliver the signal now. */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } /* CASE 2: We are in an interrupt handler AND the diff --git a/arch/renesas/src/m16c/m16c_schedulesigaction.c b/arch/renesas/src/m16c/m16c_schedulesigaction.c index e33735f56d7..a71bc1dff13 100644 --- a/arch/renesas/src/m16c/m16c_schedulesigaction.c +++ b/arch/renesas/src/m16c/m16c_schedulesigaction.c @@ -34,7 +34,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "renesas_internal.h" /**************************************************************************** @@ -96,8 +95,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) { /* In this case just deliver the signal now. */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } /* CASE 2: We are in an interrupt handler AND the diff --git a/arch/renesas/src/m16c/m16c_sigdeliver.c b/arch/renesas/src/m16c/m16c_sigdeliver.c index 6ab5448b4cb..1f9fa0ea0bb 100644 --- a/arch/renesas/src/m16c/m16c_sigdeliver.c +++ b/arch/renesas/src/m16c/m16c_sigdeliver.c @@ -36,7 +36,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "renesas_internal.h" /**************************************************************************** @@ -60,9 +59,9 @@ void renesas_sigdeliver(void) board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); /* Save the return state on the stack. */ @@ -78,7 +77,7 @@ void renesas_sigdeliver(void) /* Deliver the signal */ - nxsig_deliver(rtcb); + (sig_rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -101,10 +100,7 @@ void renesas_sigdeliver(void) regs[REG_PC] = rtcb->xcp.saved_pc[0]; regs[REG_PC + 1] = rtcb->xcp.saved_pc[1]; regs[REG_FLG] = rtcb->xcp.saved_flg; - - /* Allows next handler to be scheduled */ - - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + rtcb->sigdeliver = NULL; /* Allows next handler to be scheduled */ /* Then restore the correct state for this thread of * execution. diff --git a/arch/renesas/src/rx65n/rx65n_schedulesigaction.c b/arch/renesas/src/rx65n/rx65n_schedulesigaction.c index 8e5e3fc5a39..67403ff0893 100644 --- a/arch/renesas/src/rx65n/rx65n_schedulesigaction.c +++ b/arch/renesas/src/rx65n/rx65n_schedulesigaction.c @@ -34,7 +34,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "renesas_internal.h" /**************************************************************************** @@ -96,8 +95,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) { /* In this case just deliver the signal now. */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } /* CASE 2: We are in an interrupt handler AND the diff --git a/arch/renesas/src/rx65n/rx65n_sigdeliver.c b/arch/renesas/src/rx65n/rx65n_sigdeliver.c index 5ebdec8f231..300c55dca86 100644 --- a/arch/renesas/src/rx65n/rx65n_sigdeliver.c +++ b/arch/renesas/src/rx65n/rx65n_sigdeliver.c @@ -37,7 +37,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "renesas_internal.h" /**************************************************************************** @@ -58,12 +57,13 @@ void renesas_sigdeliver(void) { struct tcb_s *rtcb = this_task(); uint32_t regs[XCPTCONTEXT_REGS]; + sig_deliver_t sigdeliver; board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); /* Save the real return state on the stack. */ @@ -77,7 +77,8 @@ void renesas_sigdeliver(void) * signals. */ - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + sigdeliver = rtcb->sigdeliver; + rtcb->sigdeliver = NULL; #ifndef CONFIG_SUPPRESS_INTERRUPTS /* Then make sure that interrupts are enabled. Signal handlers must always @@ -89,7 +90,7 @@ void renesas_sigdeliver(void) /* Deliver the signals */ - nxsig_deliver(rtcb); + sigdeliver(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original diff --git a/arch/renesas/src/sh1/sh1_schedulesigaction.c b/arch/renesas/src/sh1/sh1_schedulesigaction.c index 80db3ee703c..b6ab7721f1d 100644 --- a/arch/renesas/src/sh1/sh1_schedulesigaction.c +++ b/arch/renesas/src/sh1/sh1_schedulesigaction.c @@ -34,7 +34,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "renesas_internal.h" /**************************************************************************** @@ -96,8 +95,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) { /* In this case just deliver the signal now. */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } /* CASE 2: We are in an interrupt handler AND the diff --git a/arch/renesas/src/sh1/sh1_sigdeliver.c b/arch/renesas/src/sh1/sh1_sigdeliver.c index 0487eed1648..d6d6e542d18 100644 --- a/arch/renesas/src/sh1/sh1_sigdeliver.c +++ b/arch/renesas/src/sh1/sh1_sigdeliver.c @@ -36,7 +36,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "renesas_internal.h" /**************************************************************************** @@ -60,9 +59,9 @@ void renesas_sigdeliver(void) board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); /* Save the return state on the stack. */ @@ -78,7 +77,7 @@ void renesas_sigdeliver(void) /* Deliver the signal */ - nxsig_deliver(rtcb); + (rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -98,12 +97,9 @@ void renesas_sigdeliver(void) * could be modified by a hostile program. */ - regs[REG_PC] = rtcb->xcp.saved_pc; - regs[REG_SR] = rtcb->xcp.saved_sr; - - /* Allows next handler to be scheduled */ - - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + regs[REG_PC] = rtcb->xcp.saved_pc; + regs[REG_SR] = rtcb->xcp.saved_sr; + rtcb->sigdeliver = NULL; /* Allows next handler to be scheduled */ /* Then restore the correct state for this thread of execution. */ diff --git a/arch/risc-v/src/common/riscv_schedulesigaction.c b/arch/risc-v/src/common/riscv_schedulesigaction.c index 7b3b3ad3023..ffc9d4d17e1 100644 --- a/arch/risc-v/src/common/riscv_schedulesigaction.c +++ b/arch/risc-v/src/common/riscv_schedulesigaction.c @@ -36,7 +36,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "riscv_internal.h" /**************************************************************************** @@ -96,8 +95,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) * REVISIT: Signal handler will run in a critical section! */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } else { diff --git a/arch/risc-v/src/common/riscv_sigdeliver.c b/arch/risc-v/src/common/riscv_sigdeliver.c index ad6c575ee83..6193fb7f2ac 100644 --- a/arch/risc-v/src/common/riscv_sigdeliver.c +++ b/arch/risc-v/src/common/riscv_sigdeliver.c @@ -39,7 +39,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "riscv_internal.h" /**************************************************************************** * Public Functions @@ -71,9 +70,9 @@ void riscv_sigdeliver(void) board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); retry: #ifdef CONFIG_SMP @@ -105,7 +104,7 @@ retry: /* Deliver the signals */ - nxsig_deliver(rtcb); + (rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -150,7 +149,7 @@ retry: * could be modified by a hostile program. */ - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + rtcb->sigdeliver = NULL; /* Allows next handler to be scheduled */ /* Then restore the correct state for this thread of * execution. diff --git a/arch/sim/src/sim/sim_schedulesigaction.c b/arch/sim/src/sim/sim_schedulesigaction.c index d66f7e9bf97..32ce5f09e73 100644 --- a/arch/sim/src/sim/sim_schedulesigaction.c +++ b/arch/sim/src/sim/sim_schedulesigaction.c @@ -32,7 +32,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" /**************************************************************************** * Public Functions @@ -82,7 +81,7 @@ void up_schedule_sigaction(struct tcb_s *tcb) if (tcb == this_task()) { - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } } diff --git a/arch/sim/src/sim/sim_sigdeliver.c b/arch/sim/src/sim/sim_sigdeliver.c index 09cb5b421ad..e70ec25dbc1 100644 --- a/arch/sim/src/sim/sim_sigdeliver.c +++ b/arch/sim/src/sim/sim_sigdeliver.c @@ -35,7 +35,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "sim_internal.h" /**************************************************************************** @@ -64,7 +63,7 @@ void sim_sigdeliver(void) int16_t saved_irqcount; irqstate_t flags; #endif - if ((rtcb->flags & TCB_FLAG_SIGDELIVER) == 0) + if (NULL == (rtcb->sigdeliver)) { return; } @@ -77,9 +76,9 @@ void sim_sigdeliver(void) flags = enter_critical_section(); #endif - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); /* NOTE: we do not save the return state for sim */ @@ -106,7 +105,7 @@ retry: /* Deliver the signal */ - nxsig_deliver(rtcb); + (rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -138,7 +137,7 @@ retry: /* Allows next handler to be scheduled */ - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + rtcb->sigdeliver = NULL; /* NOTE: we leave a critical section here for sim */ diff --git a/arch/sparc/src/sparc_v8/sparc_v8_schedulesigaction.c b/arch/sparc/src/sparc_v8/sparc_v8_schedulesigaction.c index d4ec8409ce7..543bf7b6cae 100644 --- a/arch/sparc/src/sparc_v8/sparc_v8_schedulesigaction.c +++ b/arch/sparc/src/sparc_v8/sparc_v8_schedulesigaction.c @@ -34,7 +34,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "sparc_internal.h" /**************************************************************************** @@ -94,8 +93,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) { /* In this case just deliver the signal now. */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } /* CASE 2: We are in an interrupt handler AND the @@ -193,8 +192,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) * REVISIT: Signal handler will run in a critical section! */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } /* CASE 2: The task that needs to receive the signal is running. diff --git a/arch/sparc/src/sparc_v8/sparc_v8_sigdeliver.c b/arch/sparc/src/sparc_v8/sparc_v8_sigdeliver.c index 30911829482..352b9ef19e7 100644 --- a/arch/sparc/src/sparc_v8/sparc_v8_sigdeliver.c +++ b/arch/sparc/src/sparc_v8/sparc_v8_sigdeliver.c @@ -38,7 +38,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "sparc_internal.h" /**************************************************************************** @@ -79,9 +78,9 @@ void sparc_sigdeliver(void) board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); /* Save the return state on the stack. */ @@ -117,7 +116,7 @@ retry: /* Deliver the signal */ - nxsig_deliver(rtcb); + (rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -169,7 +168,7 @@ retry: regs[REG_PC] = rtcb->xcp.saved_pc; regs[REG_NPC] = rtcb->xcp.saved_npc; regs[REG_PSR] = rtcb->xcp.saved_status; - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + rtcb->sigdeliver = NULL; /* Allows next handler to be scheduled */ #ifdef CONFIG_SMP /* Restore the saved 'irqcount' and recover the critical section diff --git a/arch/tricore/src/common/tricore_schedulesigaction.c b/arch/tricore/src/common/tricore_schedulesigaction.c index 33d6bba300b..ffac299f1ac 100644 --- a/arch/tricore/src/common/tricore_schedulesigaction.c +++ b/arch/tricore/src/common/tricore_schedulesigaction.c @@ -36,7 +36,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "tricore_internal.h" /**************************************************************************** @@ -95,8 +94,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) { /* In this case just deliver the signal now. */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } /* CASE 2: We are in an interrupt handler AND the diff --git a/arch/tricore/src/common/tricore_sigdeliver.c b/arch/tricore/src/common/tricore_sigdeliver.c index 3f950883877..5149dec75ba 100644 --- a/arch/tricore/src/common/tricore_sigdeliver.c +++ b/arch/tricore/src/common/tricore_sigdeliver.c @@ -37,7 +37,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "tricore_internal.h" /**************************************************************************** @@ -61,9 +60,9 @@ void tricore_sigdeliver(void) board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); retry: @@ -77,7 +76,7 @@ retry: /* Deliver the signal */ - nxsig_deliver(rtcb); + (rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -109,7 +108,7 @@ retry: * could be modified by a hostile program. */ - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + rtcb->sigdeliver = NULL; /* Allows next handler to be scheduled */ /* Then restore the correct state for this thread of * execution. diff --git a/arch/x86/src/i486/i486_schedulesigaction.c b/arch/x86/src/i486/i486_schedulesigaction.c index 245eb16409e..724b7594c28 100644 --- a/arch/x86/src/i486/i486_schedulesigaction.c +++ b/arch/x86/src/i486/i486_schedulesigaction.c @@ -34,7 +34,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "x86_internal.h" /**************************************************************************** @@ -92,8 +91,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) { /* In this case just deliver the signal now. */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } /* CASE 2: We are in an interrupt handler AND the interrupted task diff --git a/arch/x86/src/i486/i486_sigdeliver.c b/arch/x86/src/i486/i486_sigdeliver.c index d25432f385d..a0803a1084a 100644 --- a/arch/x86/src/i486/i486_sigdeliver.c +++ b/arch/x86/src/i486/i486_sigdeliver.c @@ -37,7 +37,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "x86_internal.h" /**************************************************************************** @@ -61,9 +60,9 @@ void x86_sigdeliver(void) board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); /* Save the return state on the stack. */ @@ -79,7 +78,7 @@ void x86_sigdeliver(void) /* Deliver the signals */ - nxsig_deliver(rtcb); + (rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -101,10 +100,7 @@ void x86_sigdeliver(void) regs[REG_EIP] = rtcb->xcp.saved_eip; regs[REG_EFLAGS] = rtcb->xcp.saved_eflags; - - /* Allows next handler to be scheduled */ - - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + rtcb->sigdeliver = NULL; /* Allows next handler to be scheduled */ /* Then restore the correct state for this thread of execution. */ diff --git a/arch/x86_64/src/intel64/intel64_schedulesigaction.c b/arch/x86_64/src/intel64/intel64_schedulesigaction.c index 6fbddee6fbd..797c9f3a69d 100644 --- a/arch/x86_64/src/intel64/intel64_schedulesigaction.c +++ b/arch/x86_64/src/intel64/intel64_schedulesigaction.c @@ -34,7 +34,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "x86_64_internal.h" /**************************************************************************** @@ -84,8 +83,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) if (tcb == this_task() && !up_interrupt_context()) { - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } /* Otherwise, we are (1) signaling a task is not running from an diff --git a/arch/x86_64/src/intel64/intel64_sigdeliver.c b/arch/x86_64/src/intel64/intel64_sigdeliver.c index 11c6abfe0d1..b9c173e8937 100644 --- a/arch/x86_64/src/intel64/intel64_sigdeliver.c +++ b/arch/x86_64/src/intel64/intel64_sigdeliver.c @@ -37,7 +37,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "x86_64_internal.h" /**************************************************************************** @@ -71,9 +70,9 @@ void x86_64_sigdeliver(void) board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); /* Align regs to 64 byte boundary for XSAVE */ @@ -116,7 +115,7 @@ void x86_64_sigdeliver(void) /* Deliver the signals */ - nxsig_deliver(rtcb); + (rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -144,10 +143,7 @@ void x86_64_sigdeliver(void) regs[REG_RIP] = rtcb->xcp.saved_rip; regs[REG_RSP] = rtcb->xcp.saved_rsp; regs[REG_RFLAGS] = rtcb->xcp.saved_rflags; - - /* Allows next handler to be scheduled */ - - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + rtcb->sigdeliver = NULL; /* Allows next handler to be scheduled */ #ifdef CONFIG_SMP /* Restore the saved 'irqcount' and recover the critical section diff --git a/arch/xtensa/src/common/xtensa_schedsigaction.c b/arch/xtensa/src/common/xtensa_schedsigaction.c index f3db7c029ba..421d8e7e176 100644 --- a/arch/xtensa/src/common/xtensa_schedsigaction.c +++ b/arch/xtensa/src/common/xtensa_schedsigaction.c @@ -36,7 +36,6 @@ #include "irq/irq.h" #include "sched/sched.h" -#include "signal/signal.h" #include "chip.h" #include "xtensa.h" @@ -96,8 +95,8 @@ void up_schedule_sigaction(struct tcb_s *tcb) * REVISIT: Signal handler will run in a critical section! */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } else { diff --git a/arch/xtensa/src/common/xtensa_sigdeliver.c b/arch/xtensa/src/common/xtensa_sigdeliver.c index c754918504a..c0914df6894 100644 --- a/arch/xtensa/src/common/xtensa_sigdeliver.c +++ b/arch/xtensa/src/common/xtensa_sigdeliver.c @@ -37,7 +37,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "xtensa.h" /**************************************************************************** @@ -70,9 +69,9 @@ void xtensa_sig_deliver(void) board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); retry: #ifdef CONFIG_SMP @@ -105,7 +104,7 @@ retry: /* Deliver the signals */ - nxsig_deliver(rtcb); + (rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -149,9 +148,7 @@ retry: * could be modified by a hostile program. */ - /* Allows next handler to be scheduled */ - - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + rtcb->sigdeliver = NULL; /* Allows next handler to be scheduled */ /* Then restore the correct state for this thread of execution. */ diff --git a/arch/z16/src/common/z16_schedulesigaction.c b/arch/z16/src/common/z16_schedulesigaction.c index fa7d6bb2fbb..5a628ad5860 100644 --- a/arch/z16/src/common/z16_schedulesigaction.c +++ b/arch/z16/src/common/z16_schedulesigaction.c @@ -34,7 +34,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "z16_internal.h" /**************************************************************************** @@ -96,8 +95,8 @@ void up_schedule_sigaction(FAR struct tcb_s *tcb) { /* In this case just deliver the signal now. */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } /* CASE 2: We are in an interrupt handler AND the interrupted diff --git a/arch/z16/src/common/z16_sigdeliver.c b/arch/z16/src/common/z16_sigdeliver.c index 067b7a4ddcc..f8203505953 100644 --- a/arch/z16/src/common/z16_sigdeliver.c +++ b/arch/z16/src/common/z16_sigdeliver.c @@ -37,7 +37,6 @@ #include #include "sched/sched.h" -#include "signal/signal.h" #include "z16_internal.h" /**************************************************************************** @@ -62,9 +61,9 @@ void z16_sigdeliver(void) board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); /* Save the return state on the stack. */ @@ -80,7 +79,7 @@ void z16_sigdeliver(void) /* Deliver the signals */ - nxsig_deliver(rtcb); + (rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -102,7 +101,7 @@ void z16_sigdeliver(void) regs32[REG_PC / 2] = rtcb->xcp.saved_pc; regs[REG_FLAGS] = rtcb->xcp.saved_i; - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + rtcb->sigdeliver = NULL; /* Allows next handler to be scheduled */ /* Then restore the correct state for this thread of execution. */ diff --git a/arch/z80/src/ez80/ez80_schedulesigaction.c b/arch/z80/src/ez80/ez80_schedulesigaction.c index 097d3274fe7..2b5cf925aa7 100644 --- a/arch/z80/src/ez80/ez80_schedulesigaction.c +++ b/arch/z80/src/ez80/ez80_schedulesigaction.c @@ -35,7 +35,6 @@ #include "chip/switch.h" #include "sched/sched.h" -#include "signal/signal.h" #include "z80_internal.h" /**************************************************************************** @@ -120,8 +119,8 @@ void up_schedule_sigaction(FAR struct tcb_s *tcb) { /* In this case just deliver the signal now. */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } /* CASE 2: We are in an interrupt handler AND the interrupted task diff --git a/arch/z80/src/ez80/ez80_sigdeliver.c b/arch/z80/src/ez80/ez80_sigdeliver.c index 0fb49dbfb00..ce22d2249f1 100644 --- a/arch/z80/src/ez80/ez80_sigdeliver.c +++ b/arch/z80/src/ez80/ez80_sigdeliver.c @@ -39,7 +39,6 @@ #include "chip/switch.h" #include "sched/sched.h" -#include "signal/signal.h" #include "z80_internal.h" /**************************************************************************** @@ -63,9 +62,9 @@ void z80_sigdeliver(void) board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); /* Save the return state on the stack. */ @@ -81,7 +80,7 @@ void z80_sigdeliver(void) /* Deliver the signals */ - nxsig_deliver(rtcb); + (rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -101,12 +100,9 @@ void z80_sigdeliver(void) * could be modified by a hostile program. */ - regs[XCPT_PC] = rtcb->xcp.saved_pc; - regs[XCPT_I] = rtcb->xcp.saved_i; - - /* Allows next handler to be scheduled */ - - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + regs[XCPT_PC] = rtcb->xcp.saved_pc; + regs[XCPT_I] = rtcb->xcp.saved_i; + rtcb->sigdeliver = NULL; /* Allows next handler to be scheduled */ /* Modify the saved return state with the actual saved values in the * TCB. This depends on the fact that nested signal handling is diff --git a/arch/z80/src/z180/z180_schedulesigaction.c b/arch/z80/src/z180/z180_schedulesigaction.c index 45fdba2cd3a..fe072f14247 100644 --- a/arch/z80/src/z180/z180_schedulesigaction.c +++ b/arch/z80/src/z180/z180_schedulesigaction.c @@ -38,7 +38,6 @@ #include "switch.h" #include "sched/sched.h" -#include "signal/signal.h" #include "z80_internal.h" /**************************************************************************** @@ -123,8 +122,8 @@ void up_schedule_sigaction(FAR struct tcb_s *tcb) { /* In this case just deliver the signal now. */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } /* CASE 2: We are in an interrupt handler AND the interrupted task diff --git a/arch/z80/src/z180/z180_sigdeliver.c b/arch/z80/src/z180/z180_sigdeliver.c index 7876b235f4a..5f4a3599908 100644 --- a/arch/z80/src/z180/z180_sigdeliver.c +++ b/arch/z80/src/z180/z180_sigdeliver.c @@ -36,7 +36,6 @@ #include "chip/switch.h" #include "sched/sched.h" -#include "signal/signal.h" #include "z80_internal.h" /**************************************************************************** @@ -60,9 +59,9 @@ void z80_sigdeliver(void) board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); /* Save the return state on the stack. */ @@ -78,7 +77,7 @@ void z80_sigdeliver(void) /* Deliver the signals */ - nxsig_deliver(rtcb); + (rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -98,12 +97,9 @@ void z80_sigdeliver(void) * could be modified by a hostile program. */ - regs[XCPT_PC] = rtcb->xcp.saved_pc; - regs[XCPT_I] = rtcb->xcp.saved_i; - - /* Allows next handler to be scheduled */ - - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + regs[XCPT_PC] = rtcb->xcp.saved_pc; + regs[XCPT_I] = rtcb->xcp.saved_i; + rtcb->sigdeliver = NULL; /* Allows next handler to be scheduled */ /* Then restore the correct state for this thread of execution. */ diff --git a/arch/z80/src/z8/z8_schedulesigaction.c b/arch/z80/src/z8/z8_schedulesigaction.c index 7cb92545604..39720960185 100644 --- a/arch/z80/src/z8/z8_schedulesigaction.c +++ b/arch/z80/src/z8/z8_schedulesigaction.c @@ -35,7 +35,6 @@ #include "chip/switch.h" #include "sched/sched.h" -#include "signal/signal.h" #include "z80_internal.h" /**************************************************************************** @@ -120,8 +119,8 @@ void up_schedule_sigaction(FAR struct tcb_s *tcb) { /* In this case just deliver the signal now. */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } /* CASE 2: We are in an interrupt handler AND the interrupted task diff --git a/arch/z80/src/z8/z8_sigdeliver.c b/arch/z80/src/z8/z8_sigdeliver.c index d7fd8c9e428..257b512e331 100644 --- a/arch/z80/src/z8/z8_sigdeliver.c +++ b/arch/z80/src/z8/z8_sigdeliver.c @@ -36,7 +36,6 @@ #include "chip/switch.h" #include "sched/sched.h" -#include "signal/signal.h" #include "z80_internal.h" /**************************************************************************** @@ -79,9 +78,9 @@ void z80_sigdeliver(void) board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); /* Save the return state on the stack. */ @@ -97,7 +96,7 @@ void z80_sigdeliver(void) /* Deliver the signals */ - nxsig_deliver(rtcb); + (rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -119,10 +118,7 @@ void z80_sigdeliver(void) regs[XCPT_PC] = rtcb->xcp.saved_pc; regs[XCPT_IRQCTL] = rtcb->xcp.saved_irqctl; - - /* Allows next handler to be scheduled */ - - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + rtcb->sigdeliver = NULL; /* Allows next handler to be scheduled */ /* Then restore the correct state for this thread of execution. */ diff --git a/arch/z80/src/z80/z80_schedulesigaction.c b/arch/z80/src/z80/z80_schedulesigaction.c index 51bebe3ebfd..a8d93fd1f9b 100644 --- a/arch/z80/src/z80/z80_schedulesigaction.c +++ b/arch/z80/src/z80/z80_schedulesigaction.c @@ -36,7 +36,6 @@ #include "chip/switch.h" #include "sched/sched.h" -#include "signal/signal.h" #include "z80_internal.h" /**************************************************************************** @@ -121,8 +120,8 @@ void up_schedule_sigaction(FAR struct tcb_s *tcb) { /* In this case just deliver the signal now. */ - nxsig_deliver(tcb); - tcb->flags &= ~TCB_FLAG_SIGDELIVER; + (tcb->sigdeliver)(tcb); + tcb->sigdeliver = NULL; } /* CASE 2: We are in an interrupt handler AND the interrupted task diff --git a/arch/z80/src/z80/z80_sigdeliver.c b/arch/z80/src/z80/z80_sigdeliver.c index ec99b001169..5afdd263f1f 100644 --- a/arch/z80/src/z80/z80_sigdeliver.c +++ b/arch/z80/src/z80/z80_sigdeliver.c @@ -36,7 +36,6 @@ #include "chip/switch.h" #include "sched/sched.h" -#include "signal/signal.h" #include "z80_internal.h" /**************************************************************************** @@ -60,9 +59,9 @@ void z80_sigdeliver(void) board_autoled_on(LED_SIGNAL); - sinfo("rtcb=%p sigpendactionq.head=%p\n", - rtcb, rtcb->sigpendactionq.head); - DEBUGASSERT((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0); + sinfo("rtcb=%p sigdeliver=%p sigpendactionq.head=%p\n", + rtcb, rtcb->sigdeliver, rtcb->sigpendactionq.head); + DEBUGASSERT(rtcb->sigdeliver != NULL); /* Save the return state on the stack. */ @@ -78,7 +77,7 @@ void z80_sigdeliver(void) /* Deliver the signals */ - nxsig_deliver(rtcb); + (rtcb->sigdeliver)(rtcb); /* Output any debug messages BEFORE restoring errno (because they may * alter errno), then disable interrupts again and restore the original @@ -98,12 +97,9 @@ void z80_sigdeliver(void) * could be modified by a hostile program. */ - regs[XCPT_PC] = rtcb->xcp.saved_pc; - regs[XCPT_I] = rtcb->xcp.saved_i; - - /* Allows next handler to be scheduled */ - - rtcb->flags &= ~TCB_FLAG_SIGDELIVER; + regs[XCPT_PC] = rtcb->xcp.saved_pc; + regs[XCPT_I] = rtcb->xcp.saved_i; + rtcb->sigdeliver = NULL; /* Allows next handler to be scheduled */ /* Then restore the correct state for this thread of execution. */ diff --git a/drivers/syslog/syslog_write.c b/drivers/syslog/syslog_write.c index 991605b27d4..285f7547ab4 100644 --- a/drivers/syslog/syslog_write.c +++ b/drivers/syslog/syslog_write.c @@ -68,7 +68,7 @@ static bool syslog_safe_to_block(void) /* It's not safe to block if a signal is being delivered */ rtcb = nxsched_self(); - if ((rtcb->flags & TCB_FLAG_SIGDELIVER) != 0) + if (rtcb->sigdeliver != NULL) { return false; } diff --git a/include/nuttx/sched.h b/include/nuttx/sched.h index c0f65f316b9..a84936cd9d0 100644 --- a/include/nuttx/sched.h +++ b/include/nuttx/sched.h @@ -93,23 +93,22 @@ # define TCB_FLAG_TTYPE_TASK (0 << TCB_FLAG_TTYPE_SHIFT) /* Normal user task */ # define TCB_FLAG_TTYPE_PTHREAD (1 << TCB_FLAG_TTYPE_SHIFT) /* User pthread */ # define TCB_FLAG_TTYPE_KERNEL (2 << TCB_FLAG_TTYPE_SHIFT) /* Kernel thread */ -#define TCB_FLAG_POLICY_SHIFT (2) /* Bit 2-3: Scheduling policy */ +#define TCB_FLAG_POLICY_SHIFT (3) /* Bit 3-4: Scheduling policy */ #define TCB_FLAG_POLICY_MASK (3 << TCB_FLAG_POLICY_SHIFT) # define TCB_FLAG_SCHED_FIFO (0 << TCB_FLAG_POLICY_SHIFT) /* FIFO scheding policy */ # define TCB_FLAG_SCHED_RR (1 << TCB_FLAG_POLICY_SHIFT) /* Round robin scheding policy */ # define TCB_FLAG_SCHED_SPORADIC (2 << TCB_FLAG_POLICY_SHIFT) /* Sporadic scheding policy */ -#define TCB_FLAG_CPU_LOCKED (1 << 4) /* Bit 4: Locked to this CPU */ -#define TCB_FLAG_SIGNAL_ACTION (1 << 5) /* Bit 5: In a signal handler */ -#define TCB_FLAG_SYSCALL (1 << 6) /* Bit 6: In a system call */ -#define TCB_FLAG_EXIT_PROCESSING (1 << 7) /* Bit 7: Exiting */ -#define TCB_FLAG_FREE_STACK (1 << 8) /* Bit 8: Free stack after exit */ -#define TCB_FLAG_HEAP_CHECK (1 << 9) /* Bit 9: Heap check */ -#define TCB_FLAG_HEAP_DUMP (1 << 10) /* Bit 10: Heap dump */ -#define TCB_FLAG_DETACHED (1 << 11) /* Bit 11: Pthread detached */ -#define TCB_FLAG_FORCED_CANCEL (1 << 12) /* Bit 12: Pthread cancel is forced */ -#define TCB_FLAG_JOIN_COMPLETED (1 << 13) /* Bit 13: Pthread join completed */ -#define TCB_FLAG_FREE_TCB (1 << 14) /* Bit 14: Free tcb after exit */ -#define TCB_FLAG_SIGDELIVER (1 << 15) /* Bit 15: Deliver pending signals */ +#define TCB_FLAG_CPU_LOCKED (1 << 5) /* Bit 5: Locked to this CPU */ +#define TCB_FLAG_SIGNAL_ACTION (1 << 6) /* Bit 6: In a signal handler */ +#define TCB_FLAG_SYSCALL (1 << 7) /* Bit 7: In a system call */ +#define TCB_FLAG_EXIT_PROCESSING (1 << 8) /* Bit 8: Exiting */ +#define TCB_FLAG_FREE_STACK (1 << 9) /* Bit 9: Free stack after exit */ +#define TCB_FLAG_HEAP_CHECK (1 << 10) /* Bit 10: Heap check */ +#define TCB_FLAG_HEAP_DUMP (1 << 11) /* Bit 11: Heap dump */ +#define TCB_FLAG_DETACHED (1 << 12) /* Bit 12: Pthread detached */ +#define TCB_FLAG_FORCED_CANCEL (1 << 13) /* Bit 13: Pthread cancel is forced */ +#define TCB_FLAG_JOIN_COMPLETED (1 << 14) /* Bit 14: Pthread join completed */ +#define TCB_FLAG_FREE_TCB (1 << 15) /* Bit 15: Free tcb after exit */ #define TCB_FLAG_PREEMPT_SCHED (1 << 16) /* Bit 16: tcb is PREEMPT_SCHED */ /* Values for struct task_group tg_flags */ @@ -284,6 +283,7 @@ typedef enum tstate_e tstate_t; /* The following is the form of a thread start-up function */ typedef CODE void (*start_t)(void); +typedef CODE void (*sig_deliver_t)(FAR struct tcb_s *tcb); /* This is the entry point into the main thread of the task or into a created * pthread within the task. @@ -697,6 +697,11 @@ struct tcb_s struct xcptcontext xcp; /* Interrupt register save area */ + /* The following function pointer is non-zero if there are pending signals + * to be processed. + */ + + sig_deliver_t sigdeliver; #if CONFIG_TASK_NAME_SIZE > 0 char name[CONFIG_TASK_NAME_SIZE + 1]; /* Task name (with NUL terminator) */ #endif diff --git a/sched/signal/sig_dispatch.c b/sched/signal/sig_dispatch.c index 63ac05932bc..12a6bb62140 100644 --- a/sched/signal/sig_dispatch.c +++ b/sched/signal/sig_dispatch.c @@ -86,7 +86,7 @@ static int sig_handler(FAR void *cookie) tcb->flags &= ~TCB_FLAG_CPU_LOCKED; } - if ((tcb->flags & TCB_FLAG_SIGDELIVER) != 0) + if (tcb->sigdeliver) { up_schedule_sigaction(tcb); } @@ -158,13 +158,13 @@ static int nxsig_queue_action(FAR struct tcb_s *stcb, * up_schedule_sigaction() */ - if ((stcb->flags & TCB_FLAG_SIGDELIVER) == 0) + if (!stcb->sigdeliver) { #ifdef CONFIG_SMP int cpu = stcb->cpu; int me = this_cpu(); - stcb->flags |= TCB_FLAG_SIGDELIVER; + stcb->sigdeliver = nxsig_deliver; if (cpu != me && stcb->task_state == TSTATE_TASK_RUNNING) { struct sig_arg_s arg; @@ -189,7 +189,7 @@ static int nxsig_queue_action(FAR struct tcb_s *stcb, else #endif { - stcb->flags |= TCB_FLAG_SIGDELIVER; + stcb->sigdeliver = nxsig_deliver; up_schedule_sigaction(stcb); } }