You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2021/03/26 02:42:36 UTC
[incubator-nuttx] branch master updated: sim: fix signal deliver
calling error on sim platform
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 5340fde sim: fix signal deliver calling error on sim platform
5340fde is described below
commit 5340fde4275646da28ed896392e2352774647776
Author: mage1 <ma...@xiaomi.com>
AuthorDate: Tue Mar 16 17:27:26 2021 +0800
sim: fix signal deliver calling error on sim platform
since the signal deliver handler should be called in signal owner task.
Change-Id: Ic55c08d1a880069864eddda8dab945ce677792d7
---
arch/sim/src/sim/up_blocktask.c | 19 +++++++++++--------
arch/sim/src/sim/up_exit.c | 12 ------------
arch/sim/src/sim/up_releasepending.c | 19 +++++++++++--------
arch/sim/src/sim/up_reprioritizertr.c | 19 +++++++++++--------
arch/sim/src/sim/up_unblocktask.c | 19 +++++++++++--------
5 files changed, 44 insertions(+), 44 deletions(-)
diff --git a/arch/sim/src/sim/up_blocktask.c b/arch/sim/src/sim/up_blocktask.c
index 8edf230..ab690e6 100644
--- a/arch/sim/src/sim/up_blocktask.c
+++ b/arch/sim/src/sim/up_blocktask.c
@@ -134,25 +134,28 @@ void up_block_task(struct tcb_s *tcb, tstate_t task_state)
rtcb = this_task();
sinfo("New Active Task TCB=%p\n", rtcb);
+ /* Reset scheduler parameters */
+
+ nxsched_resume_scheduler(rtcb);
+
+ /* Then switch contexts */
+
+ 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;
}
-
- /* Reset scheduler parameters */
-
- nxsched_resume_scheduler(rtcb);
-
- /* Then switch contexts */
-
- up_longjmp(rtcb->xcp.regs, 1);
}
}
}
diff --git a/arch/sim/src/sim/up_exit.c b/arch/sim/src/sim/up_exit.c
index 55c189e..73d7e18 100644
--- a/arch/sim/src/sim/up_exit.c
+++ b/arch/sim/src/sim/up_exit.c
@@ -92,18 +92,6 @@ void up_exit(int status)
nxsched_resume_scheduler(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 77210d2..88e75b4 100644
--- a/arch/sim/src/sim/up_releasepending.c
+++ b/arch/sim/src/sim/up_releasepending.c
@@ -103,25 +103,28 @@ void up_release_pending(void)
rtcb = this_task();
sinfo("New Active Task TCB=%p\n", rtcb);
+ /* Update scheduler parameters */
+
+ nxsched_resume_scheduler(rtcb);
+
+ /* Then switch contexts */
+
+ 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;
}
-
- /* Update scheduler parameters */
-
- nxsched_resume_scheduler(rtcb);
-
- /* Then switch contexts */
-
- up_longjmp(rtcb->xcp.regs, 1);
}
}
}
diff --git a/arch/sim/src/sim/up_reprioritizertr.c b/arch/sim/src/sim/up_reprioritizertr.c
index 7d529d2..c3b69d0 100644
--- a/arch/sim/src/sim/up_reprioritizertr.c
+++ b/arch/sim/src/sim/up_reprioritizertr.c
@@ -158,25 +158,28 @@ void up_reprioritize_rtr(struct tcb_s *tcb, uint8_t priority)
rtcb = this_task();
sinfo("New Active Task TCB=%p\n", rtcb);
+ /* Update scheduler parameters */
+
+ nxsched_resume_scheduler(rtcb);
+
+ /* Then switch contexts */
+
+ 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;
}
-
- /* Update scheduler parameters */
-
- nxsched_resume_scheduler(rtcb);
-
- /* Then switch contexts */
-
- up_longjmp(rtcb->xcp.regs, 1);
}
}
}
diff --git a/arch/sim/src/sim/up_unblocktask.c b/arch/sim/src/sim/up_unblocktask.c
index 341608c..07424c7 100644
--- a/arch/sim/src/sim/up_unblocktask.c
+++ b/arch/sim/src/sim/up_unblocktask.c
@@ -136,25 +136,28 @@ void up_unblock_task(FAR struct tcb_s *tcb)
rtcb = this_task();
sinfo("New Active Task TCB=%p\n", rtcb);
+ /* Update scheduler parameters */
+
+ nxsched_resume_scheduler(rtcb);
+
+ /* Then switch contexts */
+
+ 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;
}
-
- /* Update scheduler parameters */
-
- nxsched_resume_scheduler(rtcb);
-
- /* Then switch contexts */
-
- up_longjmp(rtcb->xcp.regs, 1);
}
}
}