1#pragma once
2
3#ifdef NNSDK
4#include <nn/os.h>
5#endif
6
7#include "heap/seadDisposer.h"
8
9namespace sead
10{
11class Heap;
12
13class Semaphore : public IDisposer
14{
15public:
16 Semaphore();
17 explicit Semaphore(s32 initial_count);
18 Semaphore(s32 initial_count, s32 max_count);
19
20 explicit Semaphore(Heap* heap);
21 Semaphore(Heap* heap, s32 initial_count);
22 Semaphore(Heap* heap, s32 initial_count, s32 max_count);
23
24 Semaphore(Heap* heap, HeapNullOption heap_null_option);
25 Semaphore(Heap* heap, HeapNullOption heap_null_option, s32 initial_count);
26 Semaphore(Heap* heap, HeapNullOption heap_null_option, s32 initial_count, s32 max_count);
27
28 ~Semaphore() override;
29
30 Semaphore(const Semaphore&) = delete;
31 Semaphore& operator=(const Semaphore&) = delete;
32
33 void initialize(s32 initial_count) { initialize(initial_count, max_count: initial_count); }
34 void initialize(s32 initial_count, s32 max_count);
35 void lock();
36 bool tryLock();
37 void unlock();
38
39 bool try_lock() { return tryLock(); }
40
41private:
42 void setInitialized([[maybe_unused]] bool initialized)
43 {
44#ifdef SEAD_DEBUG
45 mInitialized = initialized;
46#endif
47 }
48
49#ifdef NNSDK
50 nn::os::SemaphoreType mSemaphoreInner;
51#else
52#error "Unknown platform"
53#endif
54
55#ifdef SEAD_DEBUG
56 bool mInitialized = false;
57#endif
58};
59} // namespace sead
60