1#pragma once
2
3#include "thread/seadAtomic.h"
4#include "thread/seadSemaphore.h"
5
6namespace sead
7{
8class Thread;
9
10class ReadWriteLock
11{
12public:
13 ReadWriteLock();
14 ~ReadWriteLock();
15 void readLock();
16 void readUnlock();
17 void writeLock();
18 void writeUnlock();
19
20private:
21 class SemaphoreLock
22 {
23 public:
24 SemaphoreLock();
25 void lock();
26 void unlock();
27
28 private:
29 Semaphore mSemaphore{0, 0x7FFF};
30 Atomic<u32> mLockCount{0};
31 };
32
33 Atomic<u32> mNumReaders{0};
34 Atomic<u32> mNumWriters{0};
35 SemaphoreLock mReadLock;
36 SemaphoreLock mWriteLock;
37 Thread* mWriterThread = nullptr;
38 u32 mWritingThreadCount{0};
39};
40} // namespace sead
41