diff options
author | Volker RĂ¼melin <vr_qemu@t-online.de> | 2021-06-04 20:01:20 +0200 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2021-06-09 11:05:19 -0400 |
commit | e3c30795823672eec9bde75187e184f23ed98d70 (patch) | |
tree | 6e07dcd386083cef608f629a5070a61c40503803 | |
parent | f501bcbeef616c40125889b657f7ff42eeec8a8d (diff) | |
download | seabios-hppa-e3c30795823672eec9bde75187e184f23ed98d70.zip seabios-hppa-e3c30795823672eec9bde75187e184f23ed98d70.tar.gz seabios-hppa-e3c30795823672eec9bde75187e184f23ed98d70.tar.bz2 |
stacks: call check_irqs() after switch_next()
In function run_thread() the function check_irqs() gets called
after the thread switch for atomic handoff reasons. In yield()
it's the other way round.
If check_irqs() is called after run_thread() and check_irqs()
is called before switch_next() in yield(), it can happen in a
constructed case that a background thread runs twice without
a check_irqs() call in between. Call check_irqs() after
switch_next() in yield() to prevent this.
Signed-off-by: Volker RĂ¼melin <vr_qemu@t-online.de>
-rw-r--r-- | src/stacks.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/src/stacks.c b/src/stacks.c index df32325..4c8e5df 100644 --- a/src/stacks.c +++ b/src/stacks.c @@ -629,12 +629,11 @@ yield(void) return; } struct thread_info *cur = getCurThread(); + // Switch to the next thread + switch_next(cur); if (cur == &MainThread) // Permit irqs to fire check_irqs(); - - // Switch to the next thread - switch_next(cur); } void VISIBLE16 |