aboutsummaryrefslogtreecommitdiff
path: root/src/threading.cpp
diff options
context:
space:
mode:
authorblob1807 <12388588+blob1807@users.noreply.github.com>2024-02-21 00:43:27 +1000
committerblob1807 <12388588+blob1807@users.noreply.github.com>2024-02-21 00:43:27 +1000
commit004cd4933d2d80cd3416edc3feae585baff3a68b (patch)
treeddbb077c955089f02a02ef6640ad1e1b72713576 /src/threading.cpp
parent14ee2181cbf270863d0aa7e1be36814c1ded1354 (diff)
parentb43c1f2b5bf4f092fe4407f33f8fe563321518a7 (diff)
Merge branch 'master' of https://github.com/blob1807/Odin
Diffstat (limited to 'src/threading.cpp')
-rw-r--r--src/threading.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/threading.cpp b/src/threading.cpp
index c283da425..725b58c89 100644
--- a/src/threading.cpp
+++ b/src/threading.cpp
@@ -107,6 +107,22 @@ gb_internal void thread_set_name (Thread *t, char const *name);
gb_internal void yield_thread(void);
gb_internal void yield_process(void);
+struct Wait_Signal {
+ Futex futex;
+};
+
+gb_internal void wait_signal_until_available(Wait_Signal *ws) {
+ if (ws->futex.load() == 0) {
+ futex_wait(&ws->futex, 1);
+ }
+}
+
+gb_internal void wait_signal_set(Wait_Signal *ws) {
+ ws->futex.store(1);
+ futex_broadcast(&ws->futex);
+}
+
+
struct MutexGuard {
MutexGuard() = delete;
@@ -119,17 +135,25 @@ struct MutexGuard {
explicit MutexGuard(RecursiveMutex *rm) noexcept : rm{rm} {
mutex_lock(this->rm);
}
+ explicit MutexGuard(RwMutex *rwm) noexcept : rwm{rwm} {
+ rw_mutex_lock(this->rwm);
+ }
explicit MutexGuard(BlockingMutex &bm) noexcept : bm{&bm} {
mutex_lock(this->bm);
}
explicit MutexGuard(RecursiveMutex &rm) noexcept : rm{&rm} {
mutex_lock(this->rm);
}
+ explicit MutexGuard(RwMutex &rwm) noexcept : rwm{&rwm} {
+ rw_mutex_lock(this->rwm);
+ }
~MutexGuard() noexcept {
if (this->bm) {
mutex_unlock(this->bm);
} else if (this->rm) {
mutex_unlock(this->rm);
+ } else if (this->rwm) {
+ rw_mutex_unlock(this->rwm);
}
}
@@ -137,10 +161,12 @@ struct MutexGuard {
BlockingMutex *bm;
RecursiveMutex *rm;
+ RwMutex *rwm;
};
#define MUTEX_GUARD_BLOCK(m) if (MutexGuard GB_DEFER_3(_mutex_guard_){m})
#define MUTEX_GUARD(m) mutex_lock(m); defer (mutex_unlock(m))
+#define RW_MUTEX_GUARD(m) rw_mutex_lock(m); defer (rw_mutex_unlock(m))
struct RecursiveMutex {