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/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 57e54b399b sched: remove all spin_lock_irqsave(NULL)
57e54b399b is described below

commit 57e54b399b32c782566f3a984078634d6b4bada1
Author: hujun5 <[email protected]>
AuthorDate: Mon Jan 6 11:15:45 2025 +0800

    sched: remove all spin_lock_irqsave(NULL)
    
    Signed-off-by: hujun5 <[email protected]>
---
 drivers/timers/rpmsg_rtc.c           | 11 +++++++++++
 include/nuttx/sched.h                |  2 ++
 sched/clock/clock.h                  |  2 ++
 sched/clock/clock_gettime.c          |  8 ++++----
 sched/clock/clock_initialize.c       | 26 ++++++++++++++------------
 sched/clock/clock_settime.c          |  8 +++++---
 sched/clock/clock_systime_timespec.c |  4 ++--
 sched/group/group_create.c           |  1 +
 sched/group/group_exitinfo.c         |  6 +++---
 sched/group/group_join.c             |  4 ++--
 sched/group/group_leave.c            |  4 ++--
 sched/irq/irq_attach.c               | 11 ++++++-----
 sched/irq/irq_chain.c                | 10 ++++++++--
 sched/mqueue/mq_initialize.c         |  2 ++
 sched/mqueue/mq_msgfree.c            |  8 ++++----
 sched/mqueue/mq_send.c               |  8 ++++----
 sched/mqueue/mqueue.h                |  3 +++
 sched/signal/sig_default.c           |  8 ++++----
 sched/signal/sig_findaction.c        |  4 ++--
 sched/task/task_setup.c              |  4 ++--
 sched/timer/timer.h                  |  3 +++
 sched/timer/timer_create.c           |  8 ++++----
 sched/timer/timer_initialize.c       |  6 ++++--
 sched/timer/timer_release.c          |  6 +++---
 24 files changed, 97 insertions(+), 60 deletions(-)

diff --git a/drivers/timers/rpmsg_rtc.c b/drivers/timers/rpmsg_rtc.c
index 31cff5f16d..68a5c731c5 100644
--- a/drivers/timers/rpmsg_rtc.c
+++ b/drivers/timers/rpmsg_rtc.c
@@ -308,8 +308,12 @@ static int rpmsg_rtc_ept_cb(FAR struct rpmsg_endpoint 
*ept, FAR void *data,
           struct rpmsg_rtc_set_s *msg = data;
 
 #ifdef CONFIG_RTC_RPMSG_SYNC_BASETIME
+          irqstate_t flags;
+
+          flags = spin_lock_irqsave(&g_basetime_lock);
           g_basetime.tv_sec  = msg->base_sec;
           g_basetime.tv_nsec = msg->base_nsec;
+          spin_unlock_irqrestore(&g_basetime_lock, flags);
 #else
           struct timespec tp;
 
@@ -480,6 +484,7 @@ static int rpmsg_rtc_server_settime(FAR struct 
rtc_lowerhalf_s *lower,
   FAR struct rpmsg_rtc_client_s *client;
   FAR struct list_node *node;
   struct rpmsg_rtc_set_s msg;
+  irqstate_t flags;
   int ret;
 
   ret = server->lower->ops->settime(server->lower, rtctime);
@@ -500,8 +505,10 @@ static int rpmsg_rtc_server_settime(FAR struct 
rtc_lowerhalf_s *lower,
           ret = 1; /* Request the upper half skip clock synchronize */
         }
 
+      flags = spin_lock_irqsave(&g_basetime_lock);
       msg.base_sec = g_basetime.tv_sec;
       msg.base_nsec = g_basetime.tv_nsec;
+      spin_unlock_irqrestore(&g_basetime_lock, flags);
 
       nxmutex_lock(&server->lock);
 
@@ -730,6 +737,7 @@ static void rpmsg_rtc_server_ns_bind(FAR struct 
rpmsg_device *rdev,
   FAR struct rpmsg_rtc_client_s *client;
   struct rpmsg_rtc_set_s msg;
   struct rtc_time rtctime;
+  irqstate_t flags;
 
   client = kmm_zalloc(sizeof(*client));
   if (client == NULL)
@@ -753,8 +761,11 @@ static void rpmsg_rtc_server_ns_bind(FAR struct 
rpmsg_device *rdev,
     {
       msg.sec  = timegm((FAR struct tm *)&rtctime);
       msg.nsec = rtctime.tm_nsec;
+
+      flags = spin_lock_irqsave(&g_basetime_lock);
       msg.base_sec = g_basetime.tv_sec;
       msg.base_nsec = g_basetime.tv_nsec;
+      spin_unlock_irqrestore(&g_basetime_lock, flags);
 
       msg.header.command = RPMSG_RTC_SYNC;
       rpmsg_send(&client->ept, &msg, sizeof(msg));
diff --git a/include/nuttx/sched.h b/include/nuttx/sched.h
index 916b4e2b82..e2507f9938 100644
--- a/include/nuttx/sched.h
+++ b/include/nuttx/sched.h
@@ -571,6 +571,8 @@ struct task_group_s
   /* Virtual memory mapping info ********************************************/
 
   struct mm_map_s tg_mm_map;        /* Task group virtual memory mappings   */
+
+  spinlock_t tg_lock;               /* lock */
 };
 
 /* struct tcb_s *************************************************************/
diff --git a/sched/clock/clock.h b/sched/clock/clock.h
index 8c676ec41a..acd076a6de 100644
--- a/sched/clock/clock.h
+++ b/sched/clock/clock.h
@@ -33,6 +33,7 @@
 
 #include <nuttx/clock.h>
 #include <nuttx/compiler.h>
+#include <nuttx/spinlock_type.h>
 
 /****************************************************************************
  * Pre-processor Definitions
@@ -66,6 +67,7 @@ extern volatile clock_t g_system_ticks;
 
 #ifndef CONFIG_CLOCK_TIMEKEEPING
 extern struct timespec  g_basetime;
+extern spinlock_t g_basetime_lock;
 #endif
 
 /****************************************************************************
diff --git a/sched/clock/clock_gettime.c b/sched/clock/clock_gettime.c
index f3ee59d135..ebebef61a4 100644
--- a/sched/clock/clock_gettime.c
+++ b/sched/clock/clock_gettime.c
@@ -58,7 +58,7 @@ static clock_t clock_process_runtime(FAR struct tcb_s *tcb)
 
   group = tcb->group;
 
-  flags = spin_lock_irqsave(NULL);
+  flags = spin_lock_irqsave(&group->tg_lock);
   sq_for_every(&group->tg_members, curr)
     {
       tcb = container_of(curr, struct tcb_s, member);
@@ -66,7 +66,7 @@ static clock_t clock_process_runtime(FAR struct tcb_s *tcb)
       runtime += tcb->run_time;
     }
 
-  spin_unlock_irqrestore(NULL, flags);
+  spin_unlock_irqrestore(&group->tg_lock, flags);
   return runtime;
 # else  /* HAVE_GROUP_MEMBERS */
   return tcb->run_time;
@@ -109,9 +109,9 @@ void nxclock_gettime(clockid_t clock_id, FAR struct 
timespec *tp)
        * was last set, this gives us the current time.
        */
 
-      flags = spin_lock_irqsave(NULL);
+      flags = spin_lock_irqsave(&g_basetime_lock);
       clock_timespec_add(&g_basetime, &ts, tp);
-      spin_unlock_irqrestore(NULL, flags);
+      spin_unlock_irqrestore(&g_basetime_lock, flags);
 #else
       clock_timekeeping_get_wall_time(tp);
 #endif
diff --git a/sched/clock/clock_initialize.c b/sched/clock/clock_initialize.c
index bb1b9f5317..020bb2e9b6 100644
--- a/sched/clock/clock_initialize.c
+++ b/sched/clock/clock_initialize.c
@@ -56,6 +56,7 @@ volatile clock_t g_system_ticks = INITIAL_SYSTEM_TIMER_TICKS;
 
 #ifndef CONFIG_CLOCK_TIMEKEEPING
 struct timespec   g_basetime;
+spinlock_t g_basetime_lock = SP_UNLOCKED;
 #endif
 
 /****************************************************************************
@@ -160,7 +161,9 @@ static void clock_inittime(FAR const struct timespec *tp)
 
 #ifndef CONFIG_CLOCK_TIMEKEEPING
   struct timespec ts;
+  irqstate_t flags;
 
+  flags = spin_lock_irqsave(&g_basetime_lock);
   if (tp)
     {
       memcpy(&g_basetime, tp, sizeof(struct timespec));
@@ -170,8 +173,12 @@ static void clock_inittime(FAR const struct timespec *tp)
       clock_basetime(&g_basetime);
     }
 
+  spin_unlock_irqrestore(&g_basetime_lock, flags);
+
   clock_systime_timespec(&ts);
 
+  flags = spin_lock_irqsave(&g_basetime_lock);
+
   /* Adjust base time to hide initial timer ticks. */
 
   g_basetime.tv_sec  -= ts.tv_sec;
@@ -181,6 +188,8 @@ static void clock_inittime(FAR const struct timespec *tp)
       g_basetime.tv_nsec += NSEC_PER_SEC;
       g_basetime.tv_sec--;
     }
+
+  spin_unlock_irqrestore(&g_basetime_lock, flags);
 #else
   clock_inittimekeeping(tp);
 #endif
@@ -266,13 +275,9 @@ void clock_initialize(void)
 #ifdef CONFIG_RTC
 void clock_synchronize(FAR const struct timespec *tp)
 {
-  irqstate_t flags;
-
   /* Re-initialize the time value to match the RTC */
 
-  flags = enter_critical_section();
   clock_inittime(tp);
-  leave_critical_section(flags);
 }
 #endif
 
@@ -319,10 +324,6 @@ void clock_resynchronize(FAR struct timespec *rtc_diff)
       rtc_diff = &rtc_diff_tmp;
     }
 
-  /* Set the time value to match the RTC */
-
-  flags = enter_critical_section();
-
   /* Get RTC time */
 
   ret = clock_basetime(&rtc_time);
@@ -334,9 +335,11 @@ void clock_resynchronize(FAR struct timespec *rtc_diff)
 
       rtc_diff->tv_sec = 0;
       rtc_diff->tv_nsec = 0;
-      goto skip;
+      return;
     }
 
+  /* Set the time value to match the RTC */
+
   /* Get the elapsed time since power up (in milliseconds).  This is a
    * bias value that we need to use to correct the base time.
    */
@@ -348,7 +351,9 @@ void clock_resynchronize(FAR struct timespec *rtc_diff)
    * was last set, this gives us the current time.
    */
 
+  flags = spin_lock_irqsave(&g_basetime_lock);
   clock_timespec_add(&bias, &g_basetime, &curr_ts);
+  spin_unlock_irqrestore(&g_basetime_lock, flags);
 
   /* Check if RTC has advanced past system time. */
 
@@ -382,9 +387,6 @@ void clock_resynchronize(FAR struct timespec *rtc_diff)
       atomic_fetch_add((FAR atomic_t *)&g_system_ticks, diff_ticks);
 #endif
     }
-
-skip:
-  leave_critical_section(flags);
 }
 #endif
 
diff --git a/sched/clock/clock_settime.c b/sched/clock/clock_settime.c
index e07b4fd941..41017e6964 100644
--- a/sched/clock/clock_settime.c
+++ b/sched/clock/clock_settime.c
@@ -33,6 +33,7 @@
 
 #include <nuttx/arch.h>
 #include <nuttx/irq.h>
+#include <nuttx/spinlock.h>
 #include <sys/time.h>
 
 #include "clock/clock.h"
@@ -71,16 +72,17 @@ void nxclock_settime(clockid_t clock_id, FAR const struct 
timespec *tp)
    * possible.
    */
 
-  flags = enter_critical_section();
-
   /* Get the elapsed time since power up (in milliseconds).  This is a
    * bias value that we need to use to correct the base time.
    */
 
   clock_systime_timespec(&bias);
+
+  flags = spin_lock_irqsave(&g_basetime_lock);
+
   clock_timespec_subtract(tp, &bias, &g_basetime);
 
-  leave_critical_section(flags);
+  spin_unlock_irqrestore(&g_basetime_lock, flags);
 
   /* Setup the RTC (lo- or high-res) */
 
diff --git a/sched/clock/clock_systime_timespec.c 
b/sched/clock/clock_systime_timespec.c
index 2e60b59a5b..fbb7ed6f14 100644
--- a/sched/clock/clock_systime_timespec.c
+++ b/sched/clock/clock_systime_timespec.c
@@ -68,9 +68,9 @@ int clock_systime_timespec(FAR struct timespec *ts)
 
       up_rtc_gettime(ts);
 
-      flags = spin_lock_irqsave(NULL);
+      flags = spin_lock_irqsave(&g_basetime_lock);
       clock_timespec_subtract(ts, &g_basetime, ts);
-      spin_unlock_irqrestore(NULL, flags);
+      spin_unlock_irqrestore(&g_basetime_lock, flags);
     }
   else
     {
diff --git a/sched/group/group_create.c b/sched/group/group_create.c
index bbeb77e5cc..a3c10de1d2 100644
--- a/sched/group/group_create.c
+++ b/sched/group/group_create.c
@@ -222,6 +222,7 @@ void group_postinitialize(FAR struct task_tcb_s *tcb)
 
   DEBUGASSERT(tcb && tcb->cmn.group);
   group = tcb->cmn.group;
+  spin_lock_init(&group->tg_lock);
 
   /* Allocate mm_map list if required */
 
diff --git a/sched/group/group_exitinfo.c b/sched/group/group_exitinfo.c
index 22987a76b4..e82a72e420 100644
--- a/sched/group/group_exitinfo.c
+++ b/sched/group/group_exitinfo.c
@@ -70,14 +70,14 @@ int group_exitinfo(pid_t pid, FAR struct binary_s *bininfo)
   irqstate_t flags;
 
   DEBUGASSERT(bininfo != NULL);
-  flags = spin_lock_irqsave(NULL);
+  flags = enter_critical_section();
 
   /* Get the TCB associated with the PID */
 
   tcb = nxsched_get_tcb(pid);
   if (tcb == NULL)
     {
-      spin_unlock_irqrestore(NULL, flags);
+      leave_critical_section(flags);
       return -ESRCH;
     }
 
@@ -90,7 +90,7 @@ int group_exitinfo(pid_t pid, FAR struct binary_s *bininfo)
 
   group->tg_bininfo = bininfo;
 
-  spin_unlock_irqrestore(NULL, flags);
+  leave_critical_section(flags);
   return OK;
 }
 
diff --git a/sched/group/group_join.c b/sched/group/group_join.c
index 941d8a5866..8209ba9357 100644
--- a/sched/group/group_join.c
+++ b/sched/group/group_join.c
@@ -102,9 +102,9 @@ void group_join(FAR struct pthread_tcb_s *tcb)
 
   /* Add the member to the group */
 
-  flags = spin_lock_irqsave(NULL);
+  flags = spin_lock_irqsave(&group->tg_lock);
   sq_addfirst(&tcb->cmn.member, &group->tg_members);
-  spin_unlock_irqrestore(NULL, flags);
+  spin_unlock_irqrestore(&group->tg_lock, flags);
 }
 
 #endif /* !CONFIG_DISABLE_PTHREAD */
diff --git a/sched/group/group_leave.c b/sched/group/group_leave.c
index 8069f94c8b..e5e4c5a706 100644
--- a/sched/group/group_leave.c
+++ b/sched/group/group_leave.c
@@ -185,9 +185,9 @@ void group_leave(FAR struct tcb_s *tcb)
       /* Remove the member from group. */
 
 #ifdef HAVE_GROUP_MEMBERS
-      flags = spin_lock_irqsave(NULL);
+      flags = spin_lock_irqsave(&group->tg_lock);
       sq_rem(&tcb->member, &group->tg_members);
-      spin_unlock_irqrestore(NULL, flags);
+      spin_unlock_irqrestore(&group->tg_lock, flags);
 
       /* Have all of the members left the group? */
 
diff --git a/sched/irq/irq_attach.c b/sched/irq/irq_attach.c
index 93097ef962..cccd353ca7 100644
--- a/sched/irq/irq_attach.c
+++ b/sched/irq/irq_attach.c
@@ -36,6 +36,7 @@
  * Private Data
  ****************************************************************************/
 
+static spinlock_t g_irqlock = SP_UNLOCKED;
 #ifdef CONFIG_ARCH_MINIMAL_VECTORTABLE_DYNAMIC
 static int g_irqmap_count = 1;
 #endif
@@ -67,13 +68,13 @@ int irq_to_ndx(int irq)
 {
   DEBUGASSERT(g_irqmap_count < CONFIG_ARCH_NUSER_INTERRUPTS);
 
-  irqstate_t flags = spin_lock_irqsave(NULL);
+  irqstate_t flags = spin_lock_irqsave(&g_irqlock);
   if (g_irqmap[irq] == 0)
     {
       g_irqmap[irq] = g_irqmap_count++;
     }
 
-  spin_unlock_irqrestore(NULL, flags);
+  spin_unlock_irqrestore(&g_irqlock, flags);
   return g_irqmap[irq];
 }
 #endif
@@ -107,7 +108,7 @@ int irq_attach(int irq, xcpt_t isr, FAR void *arg)
        * to the unexpected interrupt handler.
        */
 
-      flags = spin_lock_irqsave(NULL);
+      flags = spin_lock_irqsave(&g_irqlock);
       if (isr == NULL)
         {
           /* Disable the interrupt if we can before detaching it.  We might
@@ -141,7 +142,7 @@ int irq_attach(int irq, xcpt_t isr, FAR void *arg)
       if (is_irqchain(ndx, isr))
         {
           ret = irqchain_attach(ndx, isr, arg);
-          spin_unlock_irqrestore(NULL, flags);
+          spin_unlock_irqrestore(&g_irqlock, flags);
           return ret;
         }
 #endif
@@ -156,7 +157,7 @@ int irq_attach(int irq, xcpt_t isr, FAR void *arg)
       g_irqvector[ndx].count   = 0;
 #endif
 
-      spin_unlock_irqrestore(NULL, flags);
+      spin_unlock_irqrestore(&g_irqlock, flags);
       ret = OK;
     }
 
diff --git a/sched/irq/irq_chain.c b/sched/irq/irq_chain.c
index 0a3e4e0cb9..cb292ac45d 100644
--- a/sched/irq/irq_chain.c
+++ b/sched/irq/irq_chain.c
@@ -57,6 +57,7 @@ static struct irqchain_s 
g_irqchainpool[CONFIG_PREALLOC_IRQCHAIN];
  */
 
 static sq_queue_t g_irqchainfreelist;
+static spinlock_t g_irqchainlock = SP_UNLOCKED;
 
 /****************************************************************************
  * Private Functions
@@ -146,13 +147,16 @@ int irqchain_attach(int ndx, xcpt_t isr, FAR void *arg)
 {
   FAR struct irqchain_s *node;
   FAR struct irqchain_s *curr;
+  irqstate_t flags;
 
+  flags = spin_lock_irqsave(&g_irqchainlock);
   if (isr != irq_unexpected_isr)
     {
       if (g_irqvector[ndx].handler != irqchain_dispatch)
         {
           if (sq_count(&g_irqchainfreelist) < 2)
             {
+              spin_unlock_irqrestore(&g_irqchainlock, flags);
               return -ENOMEM;
             }
 
@@ -170,6 +174,7 @@ int irqchain_attach(int ndx, xcpt_t isr, FAR void *arg)
       node = (FAR struct irqchain_s *)sq_remfirst(&g_irqchainfreelist);
       if (node == NULL)
         {
+          spin_unlock_irqrestore(&g_irqchainlock, flags);
           return -ENOMEM;
         }
 
@@ -190,6 +195,7 @@ int irqchain_attach(int ndx, xcpt_t isr, FAR void *arg)
       irqchain_detach_all(ndx);
     }
 
+  spin_unlock_irqrestore(&g_irqchainlock, flags);
   return OK;
 }
 
@@ -211,7 +217,7 @@ int irqchain_detach(int irq, xcpt_t isr, FAR void *arg)
           return ndx;
         }
 
-      flags = spin_lock_irqsave(NULL);
+      flags = spin_lock_irqsave(&g_irqchainlock);
 
       if (g_irqvector[ndx].handler == irqchain_dispatch)
         {
@@ -257,7 +263,7 @@ int irqchain_detach(int irq, xcpt_t isr, FAR void *arg)
           ret = irq_detach(irq);
         }
 
-      spin_unlock_irqrestore(NULL, flags);
+      spin_unlock_irqrestore(&g_irqchainlock, flags);
     }
 
   return ret;
diff --git a/sched/mqueue/mq_initialize.c b/sched/mqueue/mq_initialize.c
index 28691a15ab..6976332799 100644
--- a/sched/mqueue/mq_initialize.c
+++ b/sched/mqueue/mq_initialize.c
@@ -78,6 +78,8 @@ struct list_node g_msgfree;
 
 struct list_node g_msgfreeirq;
 
+spinlock_t g_msgfreelock = SP_UNLOCKED;
+
 #endif
 
 /****************************************************************************
diff --git a/sched/mqueue/mq_msgfree.c b/sched/mqueue/mq_msgfree.c
index 846218eb1b..23134a497b 100644
--- a/sched/mqueue/mq_msgfree.c
+++ b/sched/mqueue/mq_msgfree.c
@@ -69,9 +69,9 @@ void nxmq_free_msg(FAR struct mqueue_msg_s *mqmsg)
        * list from interrupt handlers.
        */
 
-      flags = spin_lock_irqsave(NULL);
+      flags = spin_lock_irqsave(&g_msgfreelock);
       list_add_tail(&g_msgfree, &mqmsg->node);
-      spin_unlock_irqrestore(NULL, flags);
+      spin_unlock_irqrestore(&g_msgfreelock, flags);
     }
 
   /* If this is a message pre-allocated for interrupts,
@@ -84,9 +84,9 @@ void nxmq_free_msg(FAR struct mqueue_msg_s *mqmsg)
        * list from interrupt handlers.
        */
 
-      flags = spin_lock_irqsave(NULL);
+      flags = spin_lock_irqsave(&g_msgfreelock);
       list_add_tail(&g_msgfreeirq, &mqmsg->node);
-      spin_unlock_irqrestore(NULL, flags);
+      spin_unlock_irqrestore(&g_msgfreelock, flags);
     }
 
   /* Otherwise, deallocate it.  Note:  interrupt handlers
diff --git a/sched/mqueue/mq_send.c b/sched/mqueue/mq_send.c
index 3c86f12208..241bd3cd25 100644
--- a/sched/mqueue/mq_send.c
+++ b/sched/mqueue/mq_send.c
@@ -139,9 +139,9 @@ static FAR struct mqueue_msg_s *nxmq_alloc_msg(uint16_t 
msgsize)
 
   /* Try to get the message from the generally available free list. */
 
-  flags = spin_lock_irqsave(NULL);
+  flags = spin_lock_irqsave(&g_msgfreelock);
   mqmsg = (FAR struct mqueue_msg_s *)list_remove_head(&g_msgfree);
-  spin_unlock_irqrestore(NULL, flags);
+  spin_unlock_irqrestore(&g_msgfreelock, flags);
   if (mqmsg == NULL)
     {
       /* If we were called from an interrupt handler, then try to get the
@@ -153,9 +153,9 @@ static FAR struct mqueue_msg_s *nxmq_alloc_msg(uint16_t 
msgsize)
         {
           /* Try the free list reserved for interrupt handlers */
 
-          flags = spin_lock_irqsave(NULL);
+          flags = spin_lock_irqsave(&g_msgfreelock);
           mqmsg = (FAR struct mqueue_msg_s *)list_remove_head(&g_msgfreeirq);
-          spin_unlock_irqrestore(NULL, flags);
+          spin_unlock_irqrestore(&g_msgfreelock, flags);
         }
 
       /* We were not called from an interrupt handler. */
diff --git a/sched/mqueue/mqueue.h b/sched/mqueue/mqueue.h
index f47ea8e06d..9499e155e2 100644
--- a/sched/mqueue/mqueue.h
+++ b/sched/mqueue/mqueue.h
@@ -37,6 +37,7 @@
 #include <mqueue.h>
 #include <sched.h>
 
+#include <nuttx/spinlock.h>
 #include <nuttx/mqueue.h>
 
 #if defined(CONFIG_MQ_MAXMSGSIZE) && CONFIG_MQ_MAXMSGSIZE > 0
@@ -101,6 +102,8 @@ EXTERN struct list_node g_msgfree;
 
 EXTERN struct list_node g_msgfreeirq;
 
+EXTERN spinlock_t g_msgfreelock;
+
 /****************************************************************************
  * Public Function Prototypes
  ****************************************************************************/
diff --git a/sched/signal/sig_default.c b/sched/signal/sig_default.c
index b129c60beb..a2c0143857 100644
--- a/sched/signal/sig_default.c
+++ b/sched/signal/sig_default.c
@@ -534,9 +534,9 @@ _sa_handler_t nxsig_default(FAR struct tcb_s *tcb, int 
signo, bool defaction)
         {
           /* nxsig_addset() is not atomic (but neither is sigaction()) */
 
-          flags = spin_lock_irqsave(NULL);
+          flags = spin_lock_irqsave(&group->tg_lock);
           nxsig_addset(&group->tg_sigdefault, signo);
-          spin_unlock_irqrestore(NULL, flags);
+          spin_unlock_irqrestore(&group->tg_lock, flags);
         }
     }
 
@@ -546,9 +546,9 @@ _sa_handler_t nxsig_default(FAR struct tcb_s *tcb, int 
signo, bool defaction)
        * atomic (but neither is sigaction()).
        */
 
-      flags = spin_lock_irqsave(NULL);
+      flags = spin_lock_irqsave(&group->tg_lock);
       nxsig_delset(&group->tg_sigdefault, signo);
-      spin_unlock_irqrestore(NULL, flags);
+      spin_unlock_irqrestore(&group->tg_lock, flags);
     }
 
   return handler;
diff --git a/sched/signal/sig_findaction.c b/sched/signal/sig_findaction.c
index fc519232f7..ddfc777d0d 100644
--- a/sched/signal/sig_findaction.c
+++ b/sched/signal/sig_findaction.c
@@ -57,7 +57,7 @@ FAR sigactq_t *nxsig_find_action(FAR struct task_group_s 
*group, int signo)
        * protection.
        */
 
-      flags = spin_lock_irqsave(NULL);
+      flags = spin_lock_irqsave(&group->tg_lock);
 
       /* Search the list for a sigaction on this signal */
 
@@ -65,7 +65,7 @@ FAR sigactq_t *nxsig_find_action(FAR struct task_group_s 
*group, int signo)
            ((sigact) && (sigact->signo != signo));
            sigact = sigact->flink);
 
-      spin_unlock_irqrestore(NULL, flags);
+      spin_unlock_irqrestore(&group->tg_lock, flags);
     }
 
   return sigact;
diff --git a/sched/task/task_setup.c b/sched/task/task_setup.c
index 123af650f4..2fa39a0ef2 100644
--- a/sched/task/task_setup.c
+++ b/sched/task/task_setup.c
@@ -482,10 +482,10 @@ static int nxthread_setup_scheduler(FAR struct tcb_s 
*tcb, int priority,
 
       /* Add the task to the inactive task list */
 
-      flags = spin_lock_irqsave(NULL);
+      flags = enter_critical_section();
       dq_addfirst((FAR dq_entry_t *)tcb, list_inactivetasks());
       tcb->task_state = TSTATE_TASK_INACTIVE;
-      spin_unlock_irqrestore(NULL, flags);
+      leave_critical_section(flags);
     }
 
   return ret;
diff --git a/sched/timer/timer.h b/sched/timer/timer.h
index a4e88bb5c3..4f6fd6e213 100644
--- a/sched/timer/timer.h
+++ b/sched/timer/timer.h
@@ -35,6 +35,7 @@
 #include <nuttx/compiler.h>
 #include <nuttx/signal.h>
 #include <nuttx/wdog.h>
+#include <nuttx/spinlock.h>
 
 #ifndef CONFIG_DISABLE_POSIX_TIMERS
 
@@ -85,6 +86,8 @@ extern volatile sq_queue_t g_freetimers;
 
 extern volatile sq_queue_t g_alloctimers;
 
+extern spinlock_t g_locktimers;
+
 /****************************************************************************
  * Public Function Prototypes
  ****************************************************************************/
diff --git a/sched/timer/timer_create.c b/sched/timer/timer_create.c
index 57b9800bc3..4f42d8902c 100644
--- a/sched/timer/timer_create.c
+++ b/sched/timer/timer_create.c
@@ -63,10 +63,10 @@ static FAR struct posix_timer_s *timer_allocate(void)
   /* Try to get a preallocated timer from the free list */
 
 #if CONFIG_PREALLOC_TIMERS > 0
-  flags = spin_lock_irqsave(NULL);
+  flags = spin_lock_irqsave(&g_locktimers);
   ret   = (FAR struct posix_timer_s *)
     sq_remfirst((FAR sq_queue_t *)&g_freetimers);
-  spin_unlock_irqrestore(NULL, flags);
+  spin_unlock_irqrestore(&g_locktimers, flags);
 
   /* Did we get one? */
 
@@ -95,9 +95,9 @@ static FAR struct posix_timer_s *timer_allocate(void)
 
       /* And add it to the end of the list of allocated timers */
 
-      flags = spin_lock_irqsave(NULL);
+      flags = spin_lock_irqsave(&g_locktimers);
       sq_addlast((FAR sq_entry_t *)ret, (FAR sq_queue_t *)&g_alloctimers);
-      spin_unlock_irqrestore(NULL, flags);
+      spin_unlock_irqrestore(&g_locktimers, flags);
     }
 
   return ret;
diff --git a/sched/timer/timer_initialize.c b/sched/timer/timer_initialize.c
index 56d21c041d..1e6cbb8274 100644
--- a/sched/timer/timer_initialize.c
+++ b/sched/timer/timer_initialize.c
@@ -66,6 +66,8 @@ volatile sq_queue_t g_freetimers;
 
 volatile sq_queue_t g_alloctimers;
 
+spinlock_t g_locktimers = SP_UNLOCKED;
+
 /****************************************************************************
  * Public Functions
  ****************************************************************************/
@@ -173,7 +175,7 @@ FAR struct posix_timer_s *timer_gethandle(timer_t timerid)
 
   if (timerid != NULL)
     {
-      flags = spin_lock_irqsave(NULL);
+      flags = spin_lock_irqsave(&g_locktimers);
 
       sq_for_every(&g_alloctimers, entry)
         {
@@ -184,7 +186,7 @@ FAR struct posix_timer_s *timer_gethandle(timer_t timerid)
             }
         }
 
-      spin_unlock_irqrestore(NULL, flags);
+      spin_unlock_irqrestore(&g_locktimers, flags);
     }
 
   return timer;
diff --git a/sched/timer/timer_release.c b/sched/timer/timer_release.c
index 90756ed4be..9a132c403c 100644
--- a/sched/timer/timer_release.c
+++ b/sched/timer/timer_release.c
@@ -57,7 +57,7 @@ static inline void timer_free(struct posix_timer_s *timer)
 
   /* Remove the timer from the allocated list */
 
-  flags = spin_lock_irqsave(NULL);
+  flags = spin_lock_irqsave(&g_locktimers);
   sq_rem((FAR sq_entry_t *)timer, (FAR sq_queue_t *)&g_alloctimers);
 
   /* Return it to the free list if it is one of the preallocated timers */
@@ -66,14 +66,14 @@ static inline void timer_free(struct posix_timer_s *timer)
   if ((timer->pt_flags & PT_FLAGS_PREALLOCATED) != 0)
     {
       sq_addlast((FAR sq_entry_t *)timer, (FAR sq_queue_t *)&g_freetimers);
-      spin_unlock_irqrestore(NULL, flags);
+      spin_unlock_irqrestore(&g_locktimers, flags);
     }
   else
 #endif
     {
       /* Otherwise, return it to the heap */
 
-      spin_unlock_irqrestore(NULL, flags);
+      spin_unlock_irqrestore(&g_locktimers, flags);
       kmm_free(timer);
     }
 }

Reply via email to