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

ligd pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 65bc3db6243c3ac4aa8d0f7bc41945cbd24d1bbc
Author: ouyangxiangzhen <[email protected]>
AuthorDate: Wed Jan 7 20:45:01 2026 +0800

    sched/hrtimer: Add hrtimer_wait to simplify the wait.
    
    This commit added hrtimer_wait to simplify the wait.
    
    Signed-off-by: ouyangxiangzhen <[email protected]>
---
 sched/hrtimer/hrtimer.h        | 66 ++++++++++++++++++++++++++++++++++++++++++
 sched/hrtimer/hrtimer_cancel.c | 63 ++--------------------------------------
 2 files changed, 69 insertions(+), 60 deletions(-)

diff --git a/sched/hrtimer/hrtimer.h b/sched/hrtimer/hrtimer.h
index f3d6e80a2aa..42801ff4d8a 100644
--- a/sched/hrtimer/hrtimer.h
+++ b/sched/hrtimer/hrtimer.h
@@ -33,8 +33,18 @@
 #include <nuttx/hrtimer.h>
 #include <nuttx/seqlock.h>
 
+#include "sched/sched.h"
+
 #ifdef CONFIG_HRTIMER
 
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Delay used while waiting for a running hrtimer callback to complete */
+
+#define HRTIMER_CANCEL_SYNC_DELAY_MS  5
+
 /****************************************************************************
  * Public Types
  ****************************************************************************/
@@ -484,5 +494,61 @@ int hrtimer_cancel_running(FAR hrtimer_t *timer)
   return refs;
 }
 
+/****************************************************************************
+ * Name: hrtimer_wait
+ *
+ * Description:
+ *   Wait for all references to be released before the timer can be freed.
+ *
+ * Input Parameters:
+ *   timer - The hrtimer to be waited.
+ *
+ * Returned Value:
+ *   None.
+ *
+ * Assumption:
+ *   The periodical hrtimer should be cancelled before calling this function.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_SMP
+static inline_function void hrtimer_wait(FAR hrtimer_t *timer)
+{
+  int cpu;
+
+  DEBUGASSERT(timer && timer->func == NULL);
+
+  /* Wait until all references have been released. */
+
+  for (cpu = 0; cpu < CONFIG_SMP_NCPUS; cpu++)
+    {
+      /* The timer should not be restarted again.
+       * Or there will be ownership invariant violation.
+       */
+
+      DEBUGASSERT(!hrtimer_is_running(timer, cpu));
+
+      /* If sleeping is permitted, yield the CPU briefly to avoid
+       * busy-waiting.  Otherwise, spin until the callback completes
+       * and the state becomes inactive.
+       */
+
+      while (hrtimer_is_cancelling(timer, cpu))
+        {
+          if (!up_interrupt_context() && !is_idle_task(this_task()))
+            {
+              nxsched_msleep(HRTIMER_CANCEL_SYNC_DELAY_MS);
+            }
+
+          /* Otherwise, spin-wait is enough. */
+        }
+    }
+
+  /* Finally, we acquire the ownership of this hrtimer. */
+}
+#else
+#  define hrtimer_wait(timer) /* Nothing to wait in non-SMP. */
+#endif
+
 #endif /* CONFIG_HRTIMER */
 #endif /* __SCHED_HRTIMER_HRTIMER_H */
diff --git a/sched/hrtimer/hrtimer_cancel.c b/sched/hrtimer/hrtimer_cancel.c
index 8cf5a322606..bed9011a7f1 100644
--- a/sched/hrtimer/hrtimer_cancel.c
+++ b/sched/hrtimer/hrtimer_cancel.c
@@ -29,53 +29,8 @@
 #include <nuttx/clock.h>
 #include <errno.h>
 
-#include "sched/sched.h"
 #include "hrtimer/hrtimer.h"
 
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/* Delay used while waiting for a running hrtimer callback to complete */
-
-#define HRTIMER_CANCEL_SYNC_DELAY_MS  5
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: hrtimer_is_active
- *
- * Description:
- *   Check whether a high-resolution timer is currently running on any CPU.
- *
- * Input Parameters:
- *   hrtimer - Pointer to the high-resolution timer to check.
- *
- * Returned Value:
- *   true  - The timer is active on at least one CPU.
- *   false - The timer is not active.
- ****************************************************************************/
-#ifdef CONFIG_SMP
-static inline_function bool hrtimer_is_active(FAR hrtimer_t *hrtimer)
-{
-  int  cpu;
-  bool is_active = false;
-
-  for (cpu = 0; cpu < CONFIG_SMP_NCPUS; cpu++)
-    {
-      if (hrtimer_is_cancelling(hrtimer, cpu))
-        {
-          is_active = true;
-          break;
-        }
-    }
-
-  return is_active;
-}
-#endif
-
 /****************************************************************************
  * Public Functions
  ****************************************************************************/
@@ -192,21 +147,9 @@ int hrtimer_cancel_sync(FAR hrtimer_t *hrtimer)
   ret = hrtimer_cancel(hrtimer);
   if (ret > 0)
     {
-      /* Wait until the timer transitions to the inactive state.
-       *
-       * If sleeping is permitted, yield the CPU briefly to avoid
-       * busy-waiting. Otherwise, spin until the callback completes.
-       */
-#ifdef CONFIG_SMP
-      while (hrtimer_is_active(hrtimer))
-        {
-          if (!up_interrupt_context() &&
-              !is_idle_task(this_task()))
-            {
-              nxsched_msleep(HRTIMER_CANCEL_SYNC_DELAY_MS);
-            }
-        }
-#endif
+      /* Wait until all the timer callbacks finish. */
+
+       hrtimer_wait(hrtimer);
     }
 
   return ret;

Reply via email to