mirror of
https://github.com/odin-lang/Odin.git
synced 2026-06-05 10:14:05 +00:00
Add thread.join_multiple
This commit is contained in:
@@ -156,6 +156,13 @@ join :: proc(t: ^Thread) {
|
||||
}
|
||||
}
|
||||
|
||||
join_multiple :: proc(threads: ..^Thread) {
|
||||
for t in threads {
|
||||
join(t);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
destroy :: proc(t: ^Thread) {
|
||||
join(t);
|
||||
t.unix_thread = {};
|
||||
|
||||
@@ -85,6 +85,30 @@ join :: proc(using thread: ^Thread) {
|
||||
}
|
||||
}
|
||||
|
||||
join_multiple :: proc(threads: ..^Thread) {
|
||||
MAXIMUM_WAIT_OBJECTS :: 64;
|
||||
|
||||
handles: [MAXIMUM_WAIT_OBJECTS]win32.HANDLE;
|
||||
|
||||
for k := 0; k < len(threads); k += MAXIMUM_WAIT_OBJECTS {
|
||||
count := min(len(threads) - k, MAXIMUM_WAIT_OBJECTS);
|
||||
n, j := u32(0), 0;
|
||||
for i in 0..<count {
|
||||
handle := threads[i+k].win32_thread;
|
||||
if handle != win32.INVALID_HANDLE {
|
||||
handles[j] = handle;
|
||||
j += 1;
|
||||
}
|
||||
}
|
||||
win32.WaitForMultipleObjects(n, &handles[0], true, win32.INFINITE);
|
||||
}
|
||||
|
||||
for t in threads {
|
||||
win32.CloseHandle(t.win32_thread);
|
||||
t.win32_thread = win32.INVALID_HANDLE;
|
||||
}
|
||||
}
|
||||
|
||||
destroy :: proc(thread: ^Thread) {
|
||||
join(thread);
|
||||
free(thread);
|
||||
@@ -97,3 +121,4 @@ terminate :: proc(using thread : ^Thread, exit_code: u32) {
|
||||
yield :: proc() {
|
||||
win32.SwitchToThread();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user