ReXGlue SDK
Loading...
Searching...
No Matches
sync.h
Go to the documentation of this file.
1
13
14#pragma once
15
16#include <chrono>
17#include <cstddef>
18#include <memory>
19#include <utility>
20#include <vector>
21
22#include <rex/platform.h>
23#include <rex/types.h>
24
25namespace rex::platform {
26
29 public:
32
33 Fence(const Fence&) = delete;
34 Fence& operator=(const Fence&) = delete;
35
36 ~Fence();
37
39 void Signal();
40
42 void Wait();
43
44 private:
45 struct Impl;
46 std::unique_ptr<Impl> impl_;
47};
48
49enum class WaitResult : u8 {
50 kSuccess,
54 kFailed,
55};
56
58class WaitHandle {
59 public:
60 virtual ~WaitHandle() = default;
61
65 virtual void* GetNativeHandle() const = 0;
66
67 protected:
68 WaitHandle() = default;
69};
70
76REX_API WaitResult Wait(WaitHandle* wait_handle, bool is_alertable,
77 std::chrono::milliseconds timeout = std::chrono::milliseconds::max());
78
86 WaitHandle* wait_handle_to_signal, WaitHandle* wait_handle_to_wait_on, bool is_alertable,
87 std::chrono::milliseconds timeout = std::chrono::milliseconds::max());
88
95REX_API std::pair<WaitResult, size_t> WaitMultiple(
96 WaitHandle* wait_handles[], size_t wait_handle_count, bool wait_all, bool is_alertable,
97 std::chrono::milliseconds timeout = std::chrono::milliseconds::max());
98
104inline WaitResult WaitAll(WaitHandle* wait_handles[], size_t wait_handle_count, bool is_alertable,
105 std::chrono::milliseconds timeout = std::chrono::milliseconds::max()) {
106 return WaitMultiple(wait_handles, wait_handle_count, true, is_alertable, timeout).first;
107}
108
113inline WaitResult WaitAll(std::vector<WaitHandle*> wait_handles, bool is_alertable,
114 std::chrono::milliseconds timeout = std::chrono::milliseconds::max()) {
115 return WaitAll(wait_handles.data(), wait_handles.size(), is_alertable, timeout);
116}
117
124inline std::pair<WaitResult, size_t> WaitAny(
125 WaitHandle* wait_handles[], size_t wait_handle_count, bool is_alertable,
126 std::chrono::milliseconds timeout = std::chrono::milliseconds::max()) {
127 return WaitMultiple(wait_handles, wait_handle_count, false, is_alertable, timeout);
128}
129
135inline std::pair<WaitResult, size_t> WaitAny(
136 std::vector<WaitHandle*> wait_handles, bool is_alertable,
137 std::chrono::milliseconds timeout = std::chrono::milliseconds::max()) {
138 return WaitAny(wait_handles.data(), wait_handles.size(), is_alertable, timeout);
139}
140
142class REX_API Event : public WaitHandle {
143 public:
149 static std::unique_ptr<Event> CreateManualResetEvent(bool initial_state);
150
156 static std::unique_ptr<Event> CreateAutoResetEvent(bool initial_state);
157
159 virtual void Set() = 0;
160
161 virtual void Reset() = 0;
162
164 virtual void Pulse() = 0;
165};
166
168class REX_API Semaphore : public WaitHandle {
169 public:
176 static std::unique_ptr<Semaphore> Create(int initial_count, int maximum_count);
177
185 virtual bool Release(int release_count, int* out_previous_count) = 0;
186};
187
189class REX_API Mutant : public WaitHandle {
190 public:
197 static std::unique_ptr<Mutant> Create(bool initial_owner);
198
204 virtual bool Release() = 0;
205};
206
207} // namespace rex::platform
Definition sync.h:142
virtual void Pulse()=0
virtual void Set()=0
static std::unique_ptr< Event > CreateAutoResetEvent(bool initial_state)
static std::unique_ptr< Event > CreateManualResetEvent(bool initial_state)
Definition sync.h:189
static std::unique_ptr< Mutant > Create(bool initial_owner)
virtual bool Release()=0
Definition sync.h:168
static std::unique_ptr< Semaphore > Create(int initial_count, int maximum_count)
virtual bool Release(int release_count, int *out_previous_count)=0
Definition sync.h:58
virtual void * GetNativeHandle() const =0
Definition platform.h:345
WaitResult WaitAll(WaitHandle *wait_handles[], size_t wait_handle_count, bool is_alertable, std::chrono::milliseconds timeout=std::chrono::milliseconds::max())
Definition sync.h:104
std::pair< WaitResult, size_t > WaitAny(WaitHandle *wait_handles[], size_t wait_handle_count, bool is_alertable, std::chrono::milliseconds timeout=std::chrono::milliseconds::max())
Definition sync.h:124
WaitResult SignalAndWait(WaitHandle *wait_handle_to_signal, WaitHandle *wait_handle_to_wait_on, bool is_alertable, std::chrono::milliseconds timeout=std::chrono::milliseconds::max())
WaitResult Wait(WaitHandle *wait_handle, bool is_alertable, std::chrono::milliseconds timeout=std::chrono::milliseconds::max())
std::pair< WaitResult, size_t > WaitMultiple(WaitHandle *wait_handles[], size_t wait_handle_count, bool wait_all, bool is_alertable, std::chrono::milliseconds timeout=std::chrono::milliseconds::max())
WaitResult
Definition sync.h:49
@ kTimeout
Definition sync.h:52
@ kUserCallback
Definition sync.h:51
@ kAbandoned
Definition sync.h:53
Platform flags, packing macros and export markers.
#define REX_API
Definition platform.h:177
Integer types, byte order wrappers and size literals.