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 wangchengdong@lixiang.com
This commit is contained in:
wangchengdong 2025-10-29 10:37:29 +08:00 committed by Alan C. Assis
parent 76dcec8f4b
commit 5fa8634ce7
6 changed files with 10 additions and 13 deletions

View file

@ -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

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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);
}

View file

@ -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;
}

View file

@ -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;
}