Browse Source

Prevent test runner deadlock on NetBSD

Add `pthread_testcancel` to `core:sys/unix`
Feoramund 1 year ago
parent
commit
7764ab2ab0
2 changed files with 14 additions and 0 deletions
  1. 1 0
      core/sys/unix/pthread_unix.odin
  2. 13 0
      core/testing/signal_handler_libc.odin

+ 1 - 0
core/sys/unix/pthread_unix.odin

@@ -116,4 +116,5 @@ foreign pthread {
 	pthread_mutexattr_setpshared :: proc(attrs: ^pthread_mutexattr_t, value: c.int) -> c.int ---
 	pthread_mutexattr_getpshared :: proc(attrs: ^pthread_mutexattr_t, result: ^c.int) -> c.int ---
 
+	pthread_testcancel :: proc () ---
 }

+ 13 - 0
core/testing/signal_handler_libc.odin

@@ -6,6 +6,7 @@ import "base:intrinsics"
 import "core:c/libc"
 import "core:encoding/ansi"
 import "core:sync"
+@require import "core:sys/unix"
 
 @(private="file") stop_runner_flag: libc.sig_atomic_t
 
@@ -75,6 +76,18 @@ This is a dire bug and should be reported to the Odin developers.
 			// Idle until this thread is terminated by the runner,
 			// otherwise we may continue to generate signals.
 			intrinsics.cpu_relax()
+
+			when ODIN_OS != .Windows {
+				// NOTE(Feoramund): Some UNIX-like platforms may require this.
+				//
+				// During testing, I found that NetBSD 10.0 refused to
+				// terminate a task thread, even when its thread had been
+				// properly set to PTHREAD_CANCEL_ASYNCHRONOUS.
+				//
+				// The runner would stall after returning from `pthread_cancel`.
+			
+				unix.pthread_testcancel()
+			}
 		}
 	}
 }