From 9b6665b9e97401f4504e180712ce493ed2bc2196 Mon Sep 17 00:00:00 2001 From: ligd Date: Tue, 13 Jul 2021 21:56:29 +0800 Subject: [PATCH] sched/signal: add spinlock to g_sigfreeaction To avoid nxsig_alloc_action() & nxsig_release_action() competition MIRTOS-800 Change-Id: I6091ed9d6425a382e8c41351817b6d5ea06638f1 Signed-off-by: ligd --- sched/signal/sig_action.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/sched/signal/sig_action.c b/sched/signal/sig_action.c index 312d07ef09e..9dd66851175 100644 --- a/sched/signal/sig_action.c +++ b/sched/signal/sig_action.c @@ -53,10 +53,13 @@ static FAR sigactq_t *nxsig_alloc_action(void) { FAR sigactq_t *sigact; + irqstate_t flags; /* Try to get the signal action structure from the free list */ + flags = spin_lock_irqsave(); sigact = (FAR sigactq_t *)sq_remfirst(&g_sigfreeaction); + spin_unlock_irqrestore(flags); /* Check if we got one. */ @@ -68,7 +71,9 @@ static FAR sigactq_t *nxsig_alloc_action(void) /* And try again */ + flags = spin_lock_irqsave(); sigact = (FAR sigactq_t *)sq_remfirst(&g_sigfreeaction); + spin_unlock_irqrestore(flags); DEBUGASSERT(sigact); } @@ -363,7 +368,11 @@ int sigaction(int signo, FAR const struct sigaction *act, void nxsig_release_action(FAR sigactq_t *sigact) { + irqstate_t flags; + /* Just put it back on the free list */ + flags = spin_lock_irqsave(); sq_addlast((FAR sq_entry_t *)sigact, &g_sigfreeaction); + spin_unlock_irqrestore(flags); }