Browse Source

Add thread.join_multiple

gingerBill 5 years ago
parent
commit
b2beb9512f
2 changed files with 32 additions and 0 deletions
  1. 7 0
      core/thread/thread_unix.odin
  2. 25 0
      core/thread/thread_windows.odin

+ 7 - 0
core/thread/thread_unix.odin

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

+ 25 - 0
core/thread/thread_windows.odin

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