You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by pk...@apache.org on 2022/07/22 07:15:11 UTC

[incubator-nuttx] branch master updated: sched_critmonitor: remove check zero in sched_critmonitor

This is an automated email from the ASF dual-hosted git repository.

pkarashchenko 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 fe723f0715 sched_critmonitor: remove check zero in sched_critmonitor
fe723f0715 is described below

commit fe723f071567544eaf3993ec2999a35d685a2a32
Author: ligd <li...@xiaomi.com>
AuthorDate: Thu Mar 31 16:19:52 2022 +0800

    sched_critmonitor: remove check zero in sched_critmonitor
    
    Cause of up_perf_gettime() may return 0
    
    Signed-off-by: ligd <li...@xiaomi.com>
---
 sched/sched/sched_critmonitor.c | 97 +++++++++--------------------------------
 1 file changed, 20 insertions(+), 77 deletions(-)

diff --git a/sched/sched/sched_critmonitor.c b/sched/sched/sched_critmonitor.c
index e54678356b..db504fb53c 100644
--- a/sched/sched/sched_critmonitor.c
+++ b/sched/sched/sched_critmonitor.c
@@ -138,31 +138,18 @@ void nxsched_critmon_preemption(FAR struct tcb_s *tcb, bool state)
 
   if (state)
     {
-      DEBUGASSERT(tcb->premp_start == 0);
-
       /* Disabling.. Save the thread start time */
 
-      tcb->premp_start = up_perf_gettime();
-
-      /* Zero means that the timer is not ready */
-
-      if (tcb->premp_start != 0 && g_premp_start[cpu] == 0)
-        {
-          /* Save the global start time */
-
-          g_premp_start[cpu] = tcb->premp_start;
-        }
+      tcb->premp_start   = up_perf_gettime();
+      g_premp_start[cpu] = tcb->premp_start;
     }
-  else if (tcb->premp_start != 0)
+  else
     {
       /* Re-enabling.. Check for the max elapsed time */
 
       uint32_t now     = up_perf_gettime();
       uint32_t elapsed = now - tcb->premp_start;
 
-      DEBUGASSERT(now != 0);
-
-      tcb->premp_start = 0;
       if (elapsed > tcb->premp_max)
         {
           tcb->premp_max = elapsed;
@@ -171,15 +158,10 @@ void nxsched_critmon_preemption(FAR struct tcb_s *tcb, bool state)
 
       /* Check for the global max elapsed time */
 
-      if (g_premp_start[cpu] != 0)
+      elapsed = now - g_premp_start[cpu];
+      if (elapsed > g_premp_max[cpu])
         {
-          elapsed            = now - g_premp_start[cpu];
-          g_premp_start[cpu] = 0;
-
-          if (elapsed > g_premp_max[cpu])
-            {
-              g_premp_max[cpu] = elapsed;
-            }
+          g_premp_max[cpu] = elapsed;
         }
     }
 }
@@ -206,28 +188,16 @@ void nxsched_critmon_csection(FAR struct tcb_s *tcb, bool state)
     {
       /* Entering... Save the start time. */
 
-      DEBUGASSERT(tcb->crit_start == 0);
-      tcb->crit_start = up_perf_gettime();
-
-      /* Zero means that the timer is not ready */
-
-      if (tcb->crit_start != 0 && g_crit_start[cpu] == 0)
-        {
-          /* Set the global start time */
-
-          g_crit_start[cpu] = tcb->crit_start;
-        }
+      tcb->crit_start   = up_perf_gettime();
+      g_crit_start[cpu] = tcb->crit_start;
     }
-  else if (tcb->crit_start != 0)
+  else
     {
       /* Leaving .. Check for the max elapsed time */
 
       uint32_t now     = up_perf_gettime();
       uint32_t elapsed = now - tcb->crit_start;
 
-      DEBUGASSERT(now != 0);
-
-      tcb->crit_start = 0;
       if (elapsed > tcb->crit_max)
         {
           tcb->crit_max = elapsed;
@@ -236,15 +206,10 @@ void nxsched_critmon_csection(FAR struct tcb_s *tcb, bool state)
 
       /* Check for the global max elapsed time */
 
-      if (g_crit_start[cpu] != 0)
+      elapsed = now - g_crit_start[cpu];
+      if (elapsed > g_crit_max[cpu])
         {
-          elapsed           = now - g_crit_start[cpu];
-          g_crit_start[cpu] = 0;
-
-          if (elapsed > g_crit_max[cpu])
-            {
-              g_crit_max[cpu] = elapsed;
-            }
+          g_crit_max[cpu] = elapsed;
         }
     }
 }
@@ -268,9 +233,6 @@ void nxsched_resume_critmon(FAR struct tcb_s *tcb)
   int cpu = this_cpu();
   uint32_t elapsed;
 
-  DEBUGASSERT(tcb->premp_start == 0 && tcb->crit_start == 0 &&
-              tcb->run_start == 0);
-
   tcb->run_start = current;
 
   /* Did this task disable pre-emption? */
@@ -279,22 +241,14 @@ void nxsched_resume_critmon(FAR struct tcb_s *tcb)
     {
       /* Yes.. Save the start time */
 
-      tcb->premp_start = current;
-
-      /* Zero means that the timer is not ready */
-
-      if (g_premp_start[cpu] == 0)
-        {
-          g_premp_start[cpu] = tcb->premp_start;
-        }
+      tcb->premp_start   = current;
+      g_premp_start[cpu] = current;
     }
-  else if (g_premp_start[cpu] != 0)
+  else
     {
       /* Check for the global max elapsed time */
 
-      elapsed            = current - g_premp_start[cpu];
-      g_premp_start[cpu] = 0;
-
+      elapsed = current - g_premp_start[cpu];
       if (elapsed > g_premp_max[cpu])
         {
           g_premp_max[cpu] = elapsed;
@@ -308,20 +262,14 @@ void nxsched_resume_critmon(FAR struct tcb_s *tcb)
     {
       /* Yes.. Save the start time */
 
-      tcb->crit_start = current;
-
-      if (g_crit_start[cpu] == 0)
-        {
-          g_crit_start[cpu] = tcb->crit_start;
-        }
+      tcb->crit_start   = current;
+      g_crit_start[cpu] = current;
     }
-  else if (g_crit_start[cpu] != 0)
+  else
     {
       /* Check for the global max elapsed time */
 
-      elapsed      = current - g_crit_start[cpu];
-      g_crit_start[cpu] = 0;
-
+      elapsed = current - g_crit_start[cpu];
       if (elapsed > g_crit_max[cpu])
         {
           g_crit_max[cpu] = elapsed;
@@ -348,7 +296,6 @@ void nxsched_suspend_critmon(FAR struct tcb_s *tcb)
   uint32_t current = up_perf_gettime();
   uint32_t elapsed = current - tcb->run_start;
 
-  tcb->run_start = 0;
   if (elapsed > tcb->run_max)
     {
       tcb->run_max = elapsed;
@@ -362,8 +309,6 @@ void nxsched_suspend_critmon(FAR struct tcb_s *tcb)
       /* Possibly re-enabling.. Check for the max elapsed time */
 
       elapsed = current - tcb->premp_start;
-
-      tcb->premp_start = 0;
       if (elapsed > tcb->premp_max)
         {
           tcb->premp_max = elapsed;
@@ -378,8 +323,6 @@ void nxsched_suspend_critmon(FAR struct tcb_s *tcb)
       /* Possibly leaving .. Check for the max elapsed time */
 
       elapsed = current - tcb->crit_start;
-
-      tcb->crit_start = 0;
       if (elapsed > tcb->crit_max)
         {
           tcb->crit_max = elapsed;