diff --git a/arch/sim/src/sim/up_blocktask.c b/arch/sim/src/sim/up_blocktask.c index e81df88b59f..cb6407cb04e 100644 --- a/arch/sim/src/sim/up_blocktask.c +++ b/arch/sim/src/sim/up_blocktask.c @@ -127,18 +127,6 @@ void up_block_task(struct tcb_s *tcb, tstate_t task_state) rtcb = this_task(); sinfo("New Active Task TCB=%p\n", rtcb); - /* The way that we handle signals in the simulation is kind of - * a kludge. This would be unsafe in a truly multi-threaded, - * interrupt driven environment. - */ - - if (rtcb->xcp.sigdeliver) - { - sinfo("Delivering signals TCB=%p\n", rtcb); - ((sig_deliver_t)rtcb->xcp.sigdeliver)(rtcb); - rtcb->xcp.sigdeliver = NULL; - } - /* Reset scheduler parameters */ nxsched_resume_scheduler(rtcb); @@ -147,5 +135,20 @@ void up_block_task(struct tcb_s *tcb, tstate_t task_state) up_longjmp(rtcb->xcp.regs, 1); } + else + { + /* The way that we handle signals in the simulation is kind of + * a kludge. This would be unsafe in a truly multi-threaded, + * interrupt driven environment. + */ + + rtcb = this_task(); + if (rtcb->xcp.sigdeliver) + { + sinfo("Delivering signals TCB=%p\n", rtcb); + ((sig_deliver_t)rtcb->xcp.sigdeliver)(rtcb); + rtcb->xcp.sigdeliver = NULL; + } + } } } diff --git a/arch/sim/src/sim/up_exit.c b/arch/sim/src/sim/up_exit.c index 8cac071baf6..32fd227ab41 100644 --- a/arch/sim/src/sim/up_exit.c +++ b/arch/sim/src/sim/up_exit.c @@ -80,18 +80,6 @@ void up_exit(int status) tcb = this_task(); sinfo("New Active Task TCB=%p\n", tcb); - /* The way that we handle signals in the simulation is kind of - * a kludge. This would be unsafe in a truly multi-threaded, interrupt - * driven environment. - */ - - if (tcb->xcp.sigdeliver) - { - sinfo("Delivering signals TCB=%p\n", tcb); - ((sig_deliver_t)tcb->xcp.sigdeliver)(tcb); - tcb->xcp.sigdeliver = NULL; - } - /* Then switch contexts */ up_longjmp(tcb->xcp.regs, 1); diff --git a/arch/sim/src/sim/up_releasepending.c b/arch/sim/src/sim/up_releasepending.c index b1c1fb961a9..40ef4ba83f8 100644 --- a/arch/sim/src/sim/up_releasepending.c +++ b/arch/sim/src/sim/up_releasepending.c @@ -96,18 +96,6 @@ void up_release_pending(void) rtcb = this_task(); sinfo("New Active Task TCB=%p\n", rtcb); - /* The way that we handle signals in the simulation is kind of - * a kludge. This would be unsafe in a truly multi-threaded, - * interrupt driven environment. - */ - - if (rtcb->xcp.sigdeliver) - { - sinfo("Delivering signals TCB=%p\n", rtcb); - ((sig_deliver_t)rtcb->xcp.sigdeliver)(rtcb); - rtcb->xcp.sigdeliver = NULL; - } - /* Update scheduler parameters */ nxsched_resume_scheduler(rtcb); @@ -116,5 +104,20 @@ void up_release_pending(void) up_longjmp(rtcb->xcp.regs, 1); } + else + { + /* The way that we handle signals in the simulation is kind of + * a kludge. This would be unsafe in a truly multi-threaded, + * interrupt driven environment. + */ + + rtcb = this_task(); + if (rtcb->xcp.sigdeliver) + { + sinfo("Delivering signals TCB=%p\n", rtcb); + ((sig_deliver_t)rtcb->xcp.sigdeliver)(rtcb); + rtcb->xcp.sigdeliver = NULL; + } + } } } diff --git a/arch/sim/src/sim/up_reprioritizertr.c b/arch/sim/src/sim/up_reprioritizertr.c index c4ce3172b0e..83d7baa1e04 100644 --- a/arch/sim/src/sim/up_reprioritizertr.c +++ b/arch/sim/src/sim/up_reprioritizertr.c @@ -151,18 +151,6 @@ void up_reprioritize_rtr(struct tcb_s *tcb, uint8_t priority) rtcb = this_task(); sinfo("New Active Task TCB=%p\n", rtcb); - /* The way that we handle signals in the simulation is kind of - * a kludge. This would be unsafe in a truly multi-threaded, - * interrupt driven environment. - */ - - if (rtcb->xcp.sigdeliver) - { - sinfo("Delivering signals TCB=%p\n", rtcb); - ((sig_deliver_t)rtcb->xcp.sigdeliver)(rtcb); - rtcb->xcp.sigdeliver = NULL; - } - /* Update scheduler parameters */ nxsched_resume_scheduler(rtcb); @@ -171,6 +159,21 @@ void up_reprioritize_rtr(struct tcb_s *tcb, uint8_t priority) up_longjmp(rtcb->xcp.regs, 1); } + else + { + /* The way that we handle signals in the simulation is kind of + * a kludge. This would be unsafe in a truly multi-threaded, + * interrupt driven environment. + */ + + rtcb = this_task(); + if (rtcb->xcp.sigdeliver) + { + sinfo("Delivering signals TCB=%p\n", rtcb); + ((sig_deliver_t)rtcb->xcp.sigdeliver)(rtcb); + rtcb->xcp.sigdeliver = NULL; + } + } } } } diff --git a/arch/sim/src/sim/up_smpsignal.c b/arch/sim/src/sim/up_smpsignal.c index 0179bbc00ec..bde53db6d3f 100644 --- a/arch/sim/src/sim/up_smpsignal.c +++ b/arch/sim/src/sim/up_smpsignal.c @@ -139,18 +139,6 @@ int up_cpu_paused(int cpu) rtcb = current_task(cpu); - /* The way that we handle signals in the simulation is kind of a - * kludge. This would be unsafe in a truly multi-threaded, - * interrupt driven environment. - */ - - if (rtcb->xcp.sigdeliver) - { - sinfo("CPU%d: Delivering signals TCB=%p\n", cpu, rtcb); - ((sig_deliver_t)rtcb->xcp.sigdeliver)(rtcb); - rtcb->xcp.sigdeliver = NULL; - } - #ifdef CONFIG_SCHED_INSTRUMENTATION /* Notify that we have resumed */ @@ -165,6 +153,21 @@ int up_cpu_paused(int cpu) up_longjmp(rtcb->xcp.regs, 1); } + else + { + /* The way that we handle signals in the simulation is kind of + * a kludge. This would be unsafe in a truly multi-threaded, + * interrupt driven environment. + */ + + rtcb = this_task(); + if (rtcb->xcp.sigdeliver) + { + sinfo("CPU%d: Delivering signals TCB=%p\n", this_cpu(), rtcb); + ((sig_deliver_t)rtcb->xcp.sigdeliver)(rtcb); + rtcb->xcp.sigdeliver = NULL; + } + } return OK; } diff --git a/arch/sim/src/sim/up_unblocktask.c b/arch/sim/src/sim/up_unblocktask.c index 5f739bcbfd2..3331b6772f8 100644 --- a/arch/sim/src/sim/up_unblocktask.c +++ b/arch/sim/src/sim/up_unblocktask.c @@ -111,18 +111,6 @@ void up_unblock_task(FAR struct tcb_s *tcb) rtcb = this_task(); sinfo("New Active Task TCB=%p\n", rtcb); - /* The way that we handle signals in the simulation is kind of - * a kludge. This would be unsafe in a truly multi-threaded, - * interrupt driven environment. - */ - - if (rtcb->xcp.sigdeliver) - { - sinfo("Delivering signals TCB=%p\n", rtcb); - ((sig_deliver_t)rtcb->xcp.sigdeliver)(rtcb); - rtcb->xcp.sigdeliver = NULL; - } - /* Update scheduler parameters */ nxsched_resume_scheduler(rtcb); @@ -131,5 +119,20 @@ void up_unblock_task(FAR struct tcb_s *tcb) up_longjmp(rtcb->xcp.regs, 1); } + else + { + /* The way that we handle signals in the simulation is kind of + * a kludge. This would be unsafe in a truly multi-threaded, + * interrupt driven environment. + */ + + rtcb = this_task(); + if (rtcb->xcp.sigdeliver) + { + sinfo("Delivering signals TCB=%p\n", rtcb); + ((sig_deliver_t)rtcb->xcp.sigdeliver)(rtcb); + rtcb->xcp.sigdeliver = NULL; + } + } } }