Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/core/StarThread.cpp
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
commit6352e8e3196f78388b6c771073f9e03eaa612673 (patch)
treee23772f79a7fbc41bc9108951e9e136857484bf4 /source/core/StarThread.cpp
parent6741a057e5639280d85d0f88ba26f000baa58f61 (diff)
everything everywhere
all at once
Diffstat (limited to 'source/core/StarThread.cpp')
-rw-r--r--source/core/StarThread.cpp121
1 files changed, 121 insertions, 0 deletions
diff --git a/source/core/StarThread.cpp b/source/core/StarThread.cpp
new file mode 100644
index 0000000..e76d25c
--- /dev/null
+++ b/source/core/StarThread.cpp
@@ -0,0 +1,121 @@
+#include "StarThread.hpp"
+#include "StarFormat.hpp"
+
+namespace Star {
+
+ReadersWriterMutex::ReadersWriterMutex()
+ : m_readers(), m_writers(), m_readWaiters(), m_writeWaiters() {}
+
+void ReadersWriterMutex::readLock() {
+ MutexLocker locker(m_mutex);
+ if (m_writers || m_writeWaiters) {
+ m_readWaiters++;
+ while (m_writers || m_writeWaiters)
+ m_readCond.wait(m_mutex);
+ m_readWaiters--;
+ }
+ m_readers++;
+}
+
+bool ReadersWriterMutex::tryReadLock() {
+ MutexLocker locker(m_mutex);
+ if (m_writers || m_writeWaiters)
+ return false;
+ m_readers++;
+ return true;
+}
+
+void ReadersWriterMutex::readUnlock() {
+ MutexLocker locker(m_mutex);
+ m_readers--;
+ if (m_writeWaiters)
+ m_writeCond.signal();
+}
+
+void ReadersWriterMutex::writeLock() {
+ MutexLocker locker(m_mutex);
+ if (m_readers || m_writers) {
+ m_writeWaiters++;
+ while (m_readers || m_writers)
+ m_writeCond.wait(m_mutex);
+ m_writeWaiters--;
+ }
+ m_writers = 1;
+}
+
+bool ReadersWriterMutex::tryWriteLock() {
+ MutexLocker locker(m_mutex);
+ if (m_readers || m_writers)
+ return false;
+ m_writers = 1;
+ return true;
+}
+
+void ReadersWriterMutex::writeUnlock() {
+ MutexLocker locker(m_mutex);
+ m_writers = 0;
+ if (m_writeWaiters)
+ m_writeCond.signal();
+ else if (m_readWaiters)
+ m_readCond.broadcast();
+}
+
+ReadLocker::ReadLocker(ReadersWriterMutex& rwlock, bool startLocked) : m_lock(rwlock), m_locked(false) {
+ if (startLocked)
+ lock();
+}
+
+ReadLocker::~ReadLocker() {
+ unlock();
+}
+
+void ReadLocker::unlock() {
+ if (m_locked)
+ m_lock.readUnlock();
+ m_locked = false;
+}
+
+void ReadLocker::lock() {
+ if (!m_locked)
+ m_lock.readLock();
+ m_locked = true;
+}
+
+bool ReadLocker::tryLock() {
+ if (!m_locked) {
+ m_locked = m_lock.tryReadLock();
+ return m_locked;
+ }
+ return true;
+}
+
+WriteLocker::WriteLocker(ReadersWriterMutex& rwlock, bool startLocked) : m_lock(rwlock), m_locked(false) {
+ if (startLocked)
+ lock();
+}
+
+WriteLocker::~WriteLocker() {
+ unlock();
+}
+
+void WriteLocker::unlock() {
+ if (m_locked)
+ m_lock.writeUnlock();
+ m_locked = false;
+}
+
+void WriteLocker::lock() {
+ if (!m_locked)
+ m_lock.writeLock();
+ m_locked = true;
+}
+
+bool WriteLocker::tryLock() {
+ if (!m_locked) {
+ m_locked = m_lock.tryWriteLock();
+ return m_locked;
+ }
+ return true;
+}
+
+}