1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00

fixup! thread_yield_higher(): assert interrupts enabled

This commit is contained in:
Mihai Renea 2024-10-25 16:15:58 +02:00
parent fc76726519
commit e5e51ef749
2 changed files with 16 additions and 17 deletions

View File

@ -49,7 +49,9 @@
* therefore, beneficial for the majority of applications.
*/
static inline __attribute__((always_inline))
void _block(mutex_t *mutex, uinttxtptr_t pc)
void _block(mutex_t *mutex,
unsigned irq_state,
uinttxtptr_t pc)
{
/* pc is only used when MODULE_CORE_MUTEX_DEBUG */
(void)pc;
@ -85,7 +87,7 @@ void _block(mutex_t *mutex, uinttxtptr_t pc)
}
#endif
irq_enable();
irq_restore(irq_state);
thread_yield_higher();
/* We were woken up by scheduler. Waker removed us from queue. */
#if IS_USED(MODULE_CORE_MUTEX_DEBUG)
@ -95,12 +97,11 @@ void _block(mutex_t *mutex, uinttxtptr_t pc)
bool mutex_lock_internal(mutex_t *mutex, bool block)
{
assert(irq_is_enabled());
uinttxtptr_t pc = 0;
#if IS_USED(MODULE_CORE_MUTEX_DEBUG)
pc = cpu_get_caller_pc();
#endif
irq_disable();
unsigned irq_state = irq_disable();
DEBUG("PID[%" PRIkernel_pid "] mutex_lock_internal(block=%u).\n",
thread_getpid(), (unsigned)block);
@ -121,14 +122,14 @@ bool mutex_lock_internal(mutex_t *mutex, bool block)
#endif
DEBUG("PID[%" PRIkernel_pid "] mutex_lock(): early out.\n",
thread_getpid());
irq_enable();
irq_restore(irq_state);
}
else {
if (!block) {
irq_enable();
irq_restore(irq_state);
return false;
}
_block(mutex, pc);
_block(mutex, irq_state, pc);
}
return true;
@ -136,12 +137,11 @@ bool mutex_lock_internal(mutex_t *mutex, bool block)
int mutex_lock_cancelable(mutex_cancel_t *mc)
{
assert(irq_is_enabled());
uinttxtptr_t pc = 0;
#if IS_USED(MODULE_CORE_MUTEX_DEBUG)
pc = cpu_get_caller_pc();
#endif
irq_disable();
unsigned irq_state = irq_disable();
DEBUG("PID[%" PRIkernel_pid "] mutex_lock_cancelable()\n",
thread_getpid());
@ -149,7 +149,7 @@ int mutex_lock_cancelable(mutex_cancel_t *mc)
if (mc->cancelled) {
DEBUG("PID[%" PRIkernel_pid "] mutex_lock_cancelable cancelled "
"early.\n", thread_getpid());
irq_enable();
irq_restore(irq_state);
return -ECANCELED;
}
@ -171,11 +171,11 @@ int mutex_lock_cancelable(mutex_cancel_t *mc)
#endif
DEBUG("PID[%" PRIkernel_pid "] mutex_lock_cancelable() early out.\n",
thread_getpid());
irq_enable();
irq_restore(irq_state);
return 0;
}
else {
_block(mutex, pc);
_block(mutex, irq_state, pc);
if (mc->cancelled) {
DEBUG("PID[%" PRIkernel_pid "] mutex_lock_cancelable() "
"cancelled.\n", thread_getpid());
@ -237,10 +237,9 @@ void mutex_unlock(mutex_t *mutex)
void mutex_unlock_and_sleep(mutex_t *mutex)
{
assert(irq_is_enabled());
DEBUG("PID[%" PRIkernel_pid "] mutex_unlock_and_sleep(): queue.next: %p\n",
thread_getpid(), (void *)mutex->queue.next);
irq_disable();
unsigned irqstate = irq_disable();
if (mutex->queue.next) {
if (mutex->queue.next == MUTEX_LOCKED) {
@ -262,7 +261,7 @@ void mutex_unlock_and_sleep(mutex_t *mutex)
DEBUG("PID[%" PRIkernel_pid "] mutex_unlock_and_sleep(): going to sleep.\n",
thread_getpid());
sched_set_status(thread_get_active(), STATUS_SLEEPING);
irq_enable();
irq_restore(irqstate);
thread_yield_higher();
}

View File

@ -125,7 +125,7 @@ static void _update_head_offset(evtimer_t *evtimer)
void evtimer_add(evtimer_t *evtimer, evtimer_event_t *event)
{
irq_disable();
unsigned state = irq_disable();
DEBUG("evtimer_add(): adding event with offset %" PRIu32 "\n", event->offset);
@ -134,7 +134,7 @@ void evtimer_add(evtimer_t *evtimer, evtimer_event_t *event)
if (evtimer->events == event) {
_set_timer(evtimer);
}
irq_enable();
irq_restore(state);
if (sched_context_switch_request) {
thread_yield_higher();
}