mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-05 23:28:48 +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) {
|
destroy :: proc(t: ^Thread) {
|
||||||
join(t);
|
join(t);
|
||||||
t.unix_thread = {};
|
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) {
|
destroy :: proc(thread: ^Thread) {
|
||||||
join(thread);
|
join(thread);
|
||||||
free(thread);
|
free(thread);
|
||||||
@@ -97,3 +121,4 @@ terminate :: proc(using thread : ^Thread, exit_code: u32) {
|
|||||||
yield :: proc() {
|
yield :: proc() {
|
||||||
win32.SwitchToThread();
|
win32.SwitchToThread();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user