Browse Source

Disable thread.terminate on Darwin for now.

Jeroen van Rijn 3 years ago
parent
commit
f4ad4c7aa6
1 changed files with 14 additions and 7 deletions
  1. 14 7
      core/thread/thread_unix.odin

+ 14 - 7
core/thread/thread_unix.odin

@@ -31,8 +31,10 @@ _create :: proc(procedure: Thread_Proc, priority := Thread_Priority.Normal) -> ^
 	__linux_thread_entry_proc :: proc "c" (t: rawptr) -> rawptr {
 		t := (^Thread)(t)
 
-		// We need to give the thread a moment to start up before we enable cancellation.
-		can_set_thread_cancel_state := unix.pthread_setcancelstate(unix.PTHREAD_CANCEL_DISABLE, nil) == 0
+		when ODIN_OS != .Darwin {
+			// We need to give the thread a moment to start up before we enable cancellation.
+			can_set_thread_cancel_state := unix.pthread_setcancelstate(unix.PTHREAD_CANCEL_DISABLE, nil) == 0
+		}
 
 		context = runtime.default_context()
 
@@ -47,10 +49,12 @@ _create :: proc(procedure: Thread_Proc, priority := Thread_Priority.Normal) -> ^
 		init_context := t.init_context
 		context =	init_context.? or_else runtime.default_context()
 
-		// Enable thread's cancelability.
-		if can_set_thread_cancel_state {
-			unix.pthread_setcanceltype (unix.PTHREAD_CANCEL_ASYNCHRONOUS, nil)
-			unix.pthread_setcancelstate(unix.PTHREAD_CANCEL_DISABLE,      nil)
+		when ODIN_OS != .Darwin {
+			// Enable thread's cancelability.
+			if can_set_thread_cancel_state {
+				unix.pthread_setcanceltype (unix.PTHREAD_CANCEL_ASYNCHRONOUS, nil)
+				unix.pthread_setcancelstate(unix.PTHREAD_CANCEL_DISABLE,      nil)
+			}
 		}
 
 		t.procedure(t)
@@ -150,7 +154,10 @@ _destroy :: proc(t: ^Thread) {
 }
 
 _terminate :: proc(t: ^Thread, exit_code: int) {
-	unix.pthread_cancel(t.unix_thread)
+	// `pthread_cancel` is unreliable on Darwin for unknown reasons.
+	when ODIN_OS != .Darwin {
+		unix.pthread_cancel(t.unix_thread)
+	}
 }
 
 _yield :: proc() {