This is an automated email from the ASF dual-hosted git repository. acassis pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 5fa8634ce7b43196a43253ace63963e1d2e3e897 Author: wangchengdong <[email protected]> AuthorDate: Wed Oct 29 10:37:29 2025 +0800 sched/event: Restore critical section protection for event wait and post Restore the use of critical sections to provide mutual exclusion between event wait and post operations. This allows replacing the heavier semaphore-based mechanism with direct scheduler operations for synchronization. Signed-off-by: Chengdong Wang [email protected] --- include/nuttx/event.h | 2 -- sched/event/event_clear.c | 4 ++-- sched/event/event_getmask.c | 4 ++-- sched/event/event_init.c | 1 - sched/event/event_post.c | 4 ++-- sched/event/event_wait.c | 8 ++++---- 6 files changed, 10 insertions(+), 13 deletions(-) diff --git a/include/nuttx/event.h b/include/nuttx/event.h index 90afafbac12..365443c8664 100644 --- a/include/nuttx/event.h +++ b/include/nuttx/event.h @@ -31,7 +31,6 @@ #include <nuttx/list.h> #include <nuttx/semaphore.h> -#include <nuttx/spinlock.h> /**************************************************************************** * Pre-processor Definitions @@ -73,7 +72,6 @@ struct nxevent_s { struct list_node list; /* Waiting list of nxevent_wait_t */ volatile nxevent_mask_t events; /* Pending Events */ - spinlock_t lock; /* Spinlock */ }; #ifdef CONFIG_FS_NAMED_EVENTS diff --git a/sched/event/event_clear.c b/sched/event/event_clear.c index df70486c4a9..6f67b12f3cf 100644 --- a/sched/event/event_clear.c +++ b/sched/event/event_clear.c @@ -60,12 +60,12 @@ nxevent_mask_t nxevent_clear(FAR nxevent_t *event, nxevent_mask_t mask) DEBUGASSERT(event != NULL); - flags = spin_lock_irqsave(&event->lock); + flags = enter_critical_section(); events = event->events; event->events &= ~mask; - spin_unlock_irqrestore(&event->lock, flags); + leave_critical_section(flags); return events; } diff --git a/sched/event/event_getmask.c b/sched/event/event_getmask.c index f15e6e72633..1ab3031d327 100644 --- a/sched/event/event_getmask.c +++ b/sched/event/event_getmask.c @@ -58,11 +58,11 @@ nxevent_mask_t nxevent_getmask(FAR nxevent_t *event) DEBUGASSERT(event != NULL); - flags = spin_lock_irqsave(&event->lock); + flags = enter_critical_section(); events = event->events; - spin_unlock_irqrestore(&event->lock, flags); + leave_critical_section(flags); return events; } diff --git a/sched/event/event_init.c b/sched/event/event_init.c index 2525969b2d2..5d93b81f537 100644 --- a/sched/event/event_init.c +++ b/sched/event/event_init.c @@ -49,6 +49,5 @@ void nxevent_init(FAR nxevent_t *event, nxevent_mask_t events) { event->events = events; - spin_lock_init(&event->lock); list_initialize(&event->list); } diff --git a/sched/event/event_post.c b/sched/event/event_post.c index 056107b87eb..07b9f0b4f23 100644 --- a/sched/event/event_post.c +++ b/sched/event/event_post.c @@ -81,7 +81,7 @@ int nxevent_post(FAR nxevent_t *event, nxevent_mask_t events, return -EINVAL; } - flags = spin_lock_irqsave_nopreempt(&event->lock); + flags = enter_critical_section(); if ((eflags & NXEVENT_POST_SET) != 0) { @@ -135,7 +135,7 @@ int nxevent_post(FAR nxevent_t *event, nxevent_mask_t events, } } - spin_unlock_irqrestore_nopreempt(&event->lock, flags); + leave_critical_section(flags); return ret; } diff --git a/sched/event/event_wait.c b/sched/event/event_wait.c index f70b85564b1..04d62cee249 100644 --- a/sched/event/event_wait.c +++ b/sched/event/event_wait.c @@ -80,7 +80,7 @@ nxevent_mask_t nxevent_tickwait_wait(FAR nxevent_t *event, events = ~0; } - flags = spin_lock_irqsave(&event->lock); + flags = enter_critical_section(); if ((eflags & NXEVENT_WAIT_RESET) != 0) { @@ -126,7 +126,7 @@ nxevent_mask_t nxevent_tickwait_wait(FAR nxevent_t *event, wait->eflags = eflags; list_add_tail(&event->list, &(wait->node)); - spin_unlock_irqrestore(&event->lock, flags); + leave_critical_section(flags); /* Wait for the event */ @@ -143,7 +143,7 @@ nxevent_mask_t nxevent_tickwait_wait(FAR nxevent_t *event, nxsem_destroy(&(wait->sem)); - flags = spin_lock_irqsave(&event->lock); + flags = enter_critical_section(); if (ret == 0) { events = wait->expect; @@ -160,7 +160,7 @@ nxevent_mask_t nxevent_tickwait_wait(FAR nxevent_t *event, } } - spin_unlock_irqrestore(&event->lock, flags); + leave_critical_section(flags); return events; }
