mirror of
https://github.com/Ed94/Odin.git
synced 2026-07-13 14:51:26 -07:00
Make default context.temp_allocator thread safe when using package thread
This commit is contained in:
@@ -1,8 +1,9 @@
|
||||
// +build linux, darwin
|
||||
package thread;
|
||||
|
||||
import "core:sys/unix"
|
||||
import "core:runtime"
|
||||
import "core:sync"
|
||||
import "core:sys/unix"
|
||||
|
||||
// NOTE(tetra): Aligned here because of core/unix/pthread_linux.odin/pthread_t.
|
||||
// Also see core/sys/darwin/mach_darwin.odin/semaphore_t.
|
||||
@@ -62,6 +63,13 @@ create :: proc(procedure: Thread_Proc, priority := Thread_Priority.Normal) -> ^T
|
||||
context = c;
|
||||
|
||||
t.procedure(t);
|
||||
|
||||
if !t.use_init_context {
|
||||
if context.temp_allocator.data == &runtime.global_scratch_allocator_data {
|
||||
runtime.global_scratch_allocator_destroy(auto_cast context.temp_allocator.data);
|
||||
}
|
||||
}
|
||||
|
||||
sync.atomic_store(&t.done, true, .Sequentially_Consistent);
|
||||
return nil;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package thread
|
||||
|
||||
import "core:runtime"
|
||||
import "core:sync"
|
||||
import "core:sys/win32"
|
||||
|
||||
@@ -34,6 +35,13 @@ create :: proc(procedure: Thread_Proc, priority := Thread_Priority.Normal) -> ^T
|
||||
context = c;
|
||||
|
||||
t.procedure(t);
|
||||
|
||||
if !t.use_init_context {
|
||||
if context.temp_allocator.data == &runtime.global_scratch_allocator_data {
|
||||
runtime.global_scratch_allocator_destroy(auto_cast context.temp_allocator.data);
|
||||
}
|
||||
}
|
||||
|
||||
sync.atomic_store(&t.done, true, .Sequentially_Consistent);
|
||||
return 0;
|
||||
}
|
||||
@@ -69,9 +77,11 @@ is_done :: proc(using thread: ^Thread) -> bool {
|
||||
}
|
||||
|
||||
join :: proc(using thread: ^Thread) {
|
||||
win32.wait_for_single_object(win32_thread, win32.INFINITE);
|
||||
win32.close_handle(win32_thread);
|
||||
win32_thread = win32.INVALID_HANDLE;
|
||||
if win32_thread != win32.INVALID_HANDLE {
|
||||
win32.wait_for_single_object(win32_thread, win32.INFINITE);
|
||||
win32.close_handle(win32_thread);
|
||||
win32_thread = win32.INVALID_HANDLE;
|
||||
}
|
||||
}
|
||||
|
||||
destroy :: proc(thread: ^Thread) {
|
||||
@@ -81,4 +91,4 @@ destroy :: proc(thread: ^Thread) {
|
||||
|
||||
terminate :: proc(using thread : ^Thread, exit_code : u32) {
|
||||
win32.terminate_thread(win32_thread, exit_code);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user