aboutsummaryrefslogtreecommitdiff
path: root/src/stacks.c
diff options
context:
space:
mode:
authorVolker RĂ¼melin <vr_qemu@t-online.de>2021-06-04 20:01:20 +0200
committerKevin O'Connor <kevin@koconnor.net>2021-06-09 11:05:19 -0400
commite3c30795823672eec9bde75187e184f23ed98d70 (patch)
tree6e07dcd386083cef608f629a5070a61c40503803 /src/stacks.c
parentf501bcbeef616c40125889b657f7ff42eeec8a8d (diff)
downloadseabios-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>
Diffstat (limited to 'src/stacks.c')
-rw-r--r--src/stacks.c5
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