20 GAIA_PROF_MUTEX(std::mutex, m_mtx);
21 std::condition_variable m_cv;
24 pthread_cond_t m_hCondHandle;
25 pthread_mutex_t m_hMutexHandle;
32 [[maybe_unused]]
int ret = pthread_mutex_init(&m_hMutexHandle,
nullptr);
33 GAIA_ASSERT(ret == 0);
35 ret = pthread_cond_init(&m_hCondHandle,
nullptr);
36 GAIA_ASSERT(ret == 0);
41 [[maybe_unused]]
int ret = pthread_cond_destroy(&m_hCondHandle);
42 GAIA_ASSERT(ret == 0);
44 ret = pthread_mutex_destroy(&m_hMutexHandle);
45 GAIA_ASSERT(ret == 0);
51 auto& mtx = GAIA_PROF_EXTRACT_MUTEX(m_mtx);
52 std::unique_lock lock(mtx);
53 GAIA_PROF_LOCK_MARK(m_mtx);
57 [[maybe_unused]]
int ret = pthread_mutex_lock(&m_hMutexHandle);
58 GAIA_ASSERT(ret == 0);
62 ret = pthread_cond_signal(&m_hCondHandle);
63 GAIA_ASSERT(ret == 0);
65 ret = pthread_mutex_unlock(&m_hMutexHandle);
66 GAIA_ASSERT(ret == 0);
72 auto& mtx = GAIA_PROF_EXTRACT_MUTEX(m_mtx);
73 std::unique_lock lock(mtx);
74 GAIA_PROF_LOCK_MARK(m_mtx);
77 [[maybe_unused]]
int ret = pthread_mutex_lock(&m_hMutexHandle);
78 GAIA_ASSERT(ret == 0);
80 ret = pthread_mutex_unlock(&m_hMutexHandle);
81 GAIA_ASSERT(ret == 0);
85 GAIA_NODISCARD
bool is_set() {
87 auto& mtx = GAIA_PROF_EXTRACT_MUTEX(m_mtx);
88 std::unique_lock lock(mtx);
89 GAIA_PROF_LOCK_MARK(m_mtx);
93 [[maybe_unused]]
int ret = pthread_mutex_lock(&m_hMutexHandle);
94 GAIA_ASSERT(ret == 0);
96 ret = pthread_mutex_unlock(&m_hMutexHandle);
97 GAIA_ASSERT(ret == 0);
104 auto& mtx = GAIA_PROF_EXTRACT_MUTEX(m_mtx);
105 std::unique_lock lock(mtx);
106 GAIA_PROF_LOCK_MARK(m_mtx);
107 m_cv.wait(lock, [&] {
111 [[maybe_unused]]
int ret{};
115 ret = pthread_cond_wait(&m_hCondHandle, &m_hMutexHandle);
116 }
while (!ret && !m_set);
118 GAIA_ASSERT(ret != EINVAL);
128 ret = pthread_mutex_lock(&m_hMutexHandle);
129 GAIA_ASSERT(ret == 0);
134 ret = pthread_mutex_unlock(&m_hMutexHandle);
135 GAIA_ASSERT(ret == 0);