aboutsummaryrefslogtreecommitdiff
path: root/core/testing/signal_handler_libc.odin
diff options
context:
space:
mode:
authorFeoramund <161657516+Feoramund@users.noreply.github.com>2024-09-09 19:09:16 -0400
committerFeoramund <161657516+Feoramund@users.noreply.github.com>2024-09-10 14:52:20 -0400
commit3a6010918033e1548e84d57a07074cdbf802ff9b (patch)
tree969bc7b87c1aacd587c6797b86f098ece29feab0 /core/testing/signal_handler_libc.odin
parent074314b8874886f8956e9a7e9a773ac059051030 (diff)
Fix signalling test child threads crashing test 0
A thread made inside a test does not share the test index of its parent, so any time one of those threads failed an assert, it would tell the runner to shutdown test index zero.
Diffstat (limited to 'core/testing/signal_handler_libc.odin')
-rw-r--r--core/testing/signal_handler_libc.odin11
1 files changed, 11 insertions, 0 deletions
diff --git a/core/testing/signal_handler_libc.odin b/core/testing/signal_handler_libc.odin
index 27d1a0735..e2d170595 100644
--- a/core/testing/signal_handler_libc.odin
+++ b/core/testing/signal_handler_libc.odin
@@ -26,6 +26,8 @@ import "core:os"
@(private="file", thread_local)
local_test_index: libc.sig_atomic_t
+@(private="file", thread_local)
+local_test_index_set: bool
// Windows does not appear to have a SIGTRAP, so this is defined here, instead
// of in the libc package, just so there's no confusion about it being
@@ -45,6 +47,13 @@ stop_runner_callback :: proc "c" (sig: libc.int) {
@(private="file")
stop_test_callback :: proc "c" (sig: libc.int) {
+ if !local_test_index_set {
+ // We're a thread created by a test thread.
+ //
+ // There's nothing we can do to inform the test runner about who
+ // signalled, so hopefully the test will handle their own sub-threads.
+ return
+ }
if local_test_index == -1 {
// We're the test runner, and we ourselves have caught a signal from
// which there is no recovery.
@@ -114,6 +123,7 @@ This is a dire bug and should be reported to the Odin developers.
_setup_signal_handler :: proc() {
local_test_index = -1
+ local_test_index_set = true
// Catch user interrupt / CTRL-C.
libc.signal(libc.SIGINT, stop_runner_callback)
@@ -135,6 +145,7 @@ _setup_signal_handler :: proc() {
_setup_task_signal_handler :: proc(test_index: int) {
local_test_index = cast(libc.sig_atomic_t)test_index
+ local_test_index_set = true
}
_should_stop_runner :: proc() -> bool {