summary refs log tree commit diff
path: root/src/ThreadRole.hpp
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2024-02-15 11:18:17 +0100
committerMel <einebeere@gmail.com>2024-02-15 11:18:17 +0100
commit0a5e412541937ead88377cabdb565ecfe65c0afc (patch)
treecf2daa159cf466ab50d639bdb209e8603e763138 /src/ThreadRole.hpp
parent6a30c3e4f22de4d0f8f32107f614f597f5f39cc1 (diff)
downloadmeowcraft-0a5e412541937ead88377cabdb565ecfe65c0afc.tar.zst
meowcraft-0a5e412541937ead88377cabdb565ecfe65c0afc.zip
Give all threads specific thread roles and assert thread safety
Diffstat (limited to 'src/ThreadRole.hpp')
-rw-r--r--src/ThreadRole.hpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/ThreadRole.hpp b/src/ThreadRole.hpp
new file mode 100644
index 0000000..4c668e5
--- /dev/null
+++ b/src/ThreadRole.hpp
@@ -0,0 +1,30 @@
+#pragma once
+
+#include "Common/Assert.hpp"
+
+namespace MC {
+
+enum class ThreadRole {
+    None,
+    Logic,
+    Render,
+    Worker
+};
+
+// Hide the global from direct access
+namespace ThreadRoleDetail {
+    thread_local inline ThreadRole g_thread_role = ThreadRole::None;
+}
+
+#define THREAD_ROLE (MC::ThreadRoleDetail::g_thread_role)
+
+#define HELLO_I_AM(role) do { \
+    ASSERT(THREAD_ROLE == MC::ThreadRole::None, "Thread role already set"); \
+    THREAD_ROLE = (role); \
+} while (0)
+
+#define ASSERT_MAIN_THREAD() ASSERT(THREAD_ROLE == MC::ThreadRole::Logic, "Thread is not main")
+#define ASSERT_THREAD_IS(role) ASSERT(THREAD_ROLE == (role), "Thread role mismatch")
+#define ASSERT_THREAD_IS_NOT(role) ASSERT(THREAD_ROLE != (role), "Thread role mismatch")
+
+}
\ No newline at end of file