mirror of
https://github.com/apache/nuttx.git
synced 2026-08-01 20:28:58 +00:00
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:
parent
76dcec8f4b
commit
5fa8634ce7
6 changed files with 10 additions and 13 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue