mirror of
https://github.com/Ed94/Odin.git
synced 2026-07-13 06:41:26 -07:00
fix thread_unix for Darwin after pthread corrections in posix package
afed3ceremoved the sys/unix package and moved over to sys/posix, it has new bindings for the pthread APIs but should have been equivalent (not).8fb7182used `CANCEL_ENABLE :: 0`, `CANCEL_DISABLE :: 1`, `CANCEL_DEFERRED :: 0`, `CANCEL_ASYNCHRONOUS :: 1` for Darwin, while the correct values are `1`, `0`, `2` and `0` respectively (same mistake was made for FreeBSD in that commit). What this meant is that the `pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS)` was not actually successful, but because the error wasn't checked it was assumed it was. It also meant `pthread_setcancelstate(PTHREAD_CANCEL_ENABLE)` would actually be setting `PTHREAD_CANCEL_DISABLE`. The code in this PR restores the behaviour by now actually deliberately setting `PTHREAD_CANCEL_DISABLE` and not setting `PTHREAD_CANCEL_ASYNCHRONOUS` which was the previous behaviour that does actually seem to work for some reason. (I also fixed an issue in fmt where `x` would use uppercase if it was a pointer.)
This commit is contained in:
@@ -23,7 +23,9 @@ _create :: proc(procedure: Thread_Proc, priority: Thread_Priority) -> ^Thread {
|
||||
t := (^Thread)(t)
|
||||
|
||||
// We need to give the thread a moment to start up before we enable cancellation.
|
||||
can_set_thread_cancel_state := posix.pthread_setcancelstate(.ENABLE, nil) == nil
|
||||
// NOTE(laytan): setting to .DISABLE on darwin, with .ENABLE pthread_cancel would deadlock
|
||||
// most of the time, don't ask me why.
|
||||
can_set_thread_cancel_state := posix.pthread_setcancelstate(.DISABLE when ODIN_OS == .Darwin else .ENABLE, nil) == nil
|
||||
|
||||
t.id = sync.current_thread_id()
|
||||
|
||||
@@ -36,9 +38,15 @@ _create :: proc(procedure: Thread_Proc, priority: Thread_Priority) -> ^Thread {
|
||||
}
|
||||
|
||||
// Enable thread's cancelability.
|
||||
if can_set_thread_cancel_state {
|
||||
posix.pthread_setcanceltype (.ASYNCHRONOUS, nil)
|
||||
posix.pthread_setcancelstate(.ENABLE, nil)
|
||||
// NOTE(laytan): Darwin does not correctly/fully support all of this, not doing this does
|
||||
// actually make pthread_cancel work in the capacity of my tests, while executing this would
|
||||
// basically always make it deadlock.
|
||||
if ODIN_OS != .Darwin && can_set_thread_cancel_state {
|
||||
err := posix.pthread_setcancelstate(.ENABLE, nil)
|
||||
assert_contextless(err == nil)
|
||||
|
||||
err = posix.pthread_setcanceltype(.ASYNCHRONOUS, nil)
|
||||
assert_contextless(err == nil)
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user