Browse Source

cover openbsd too

Colin Davidson 2 years ago
parent
commit
98e5523f2f
1 changed files with 34 additions and 0 deletions
  1. 34 0
      src/threading.cpp

+ 34 - 0
src/threading.cpp

@@ -504,6 +504,40 @@ gb_internal void tpool_wait_on_addr(Futex *addr, Footex val) {
 	}
 }
 
+#elif defined(GB_SYSTEM_OPENBSD)
+
+#include <sys/futex.h>
+
+typedef std::atomic<int32_t> Futex;
+typedef volatile int32_t Footex;
+
+gb_internal void tpool_wake_addr(Futex *addr) {
+	int ret = futex((volatile uint32_t *)addr, FUTEX_WAKE | FUTEX_PRIVATE_FLAG, 1, NULL, NULL);
+	if (ret == -1) {
+		perror("Futex wake");
+		GB_PANIC("futex wake fail");
+	}
+}
+
+gb_internal void tpool_wait_on_addr(Futex *addr, Footex val) {
+	for (;;) {
+		int ret = futex((volatile uint32_t *)addr, FUTEX_WAIT | FUTEX_PRIVATE_FLAG, val, NULL, NULL);
+		if (ret != -1) {
+			if (*addr != val) {
+				return;
+			}
+
+		} else {
+			if (errno == ETIMEDOUT || errno == EINTR) {
+				continue;
+			}
+
+			perror("Futex wait");
+			GB_PANIC("Failed in futex wait!\n");
+		}
+	}
+}
+
 #elif defined(GB_SYSTEM_OSX)
 
 typedef std::atomic<int64_t> Futex;