Skip to content
Snippets Groups Projects
Commit 62bb4cc5 authored by Kaspar Schleiser's avatar Kaspar Schleiser
Browse files

cpu/native: fix race condition in thread_yield_higher()

Error case:
1. thread_yield_higher() stores the thread's ucontext
2. creates an "isr ucontext" for isr_thread_yield, switches to it

Case 1: no signals are pending, continues in isr_thread_yield()
3a. sched_run is called
4a. return to sched_active_thread ucontext

Case 2: signals pending (the crashing scenario), continues in native_irq_handler()
3b. handles signals
4b. if sched_context_switch_request is set, call sched_run
5b. return to sched_active_thread ucontext

4b misses the call to sched_run(), leading to a possible return into a
non-ready thread.
parent 579925b8
No related branches found
No related tags found
No related merge requests found
......@@ -208,6 +208,8 @@ void isr_thread_yield(void)
void thread_yield_higher(void)
{
sched_context_switch_request = 1;
if (_native_in_isr == 0) {
ucontext_t *ctx = (ucontext_t *)(sched_active_thread->sp);
_native_in_isr = 1;
......@@ -224,9 +226,6 @@ void thread_yield_higher(void)
}
irq_enable();
}
else {
sched_context_switch_request = 1;
}
}
void native_cpu_init(void)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment