Add thread.join_multiple

This commit is contained in:
gingerBill
2020-07-14 21:08:04 +01:00
parent 96ad6d2084
commit b2beb9512f
2 changed files with 32 additions and 0 deletions

View File

@@ -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 = {};

View File

@@ -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();
}