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);
         }
     }
 }