mirror of
https://github.com/RPCS3/rpcs3.git
synced 2024-12-28 09:23:34 +00:00
48 lines
639 B
C++
48 lines
639 B
C++
#pragma once
|
|
|
|
#include "types.h"
|
|
#include "Atomic.h"
|
|
|
|
// Binary semaphore
|
|
class benaphore
|
|
{
|
|
struct internal;
|
|
|
|
// Reserved value (-1) enforces *_hard() calls
|
|
atomic_t<u32> m_value{};
|
|
|
|
atomic_t<internal*> m_data{};
|
|
|
|
void wait_hard();
|
|
void post_hard();
|
|
|
|
public:
|
|
constexpr benaphore() = default;
|
|
|
|
~benaphore();
|
|
|
|
// Initialize internal data
|
|
void initialize_once();
|
|
|
|
void wait()
|
|
{
|
|
if (UNLIKELY(!m_value.compare_and_swap_test(1, 0)))
|
|
{
|
|
wait_hard();
|
|
}
|
|
}
|
|
|
|
bool try_wait()
|
|
{
|
|
return m_value.compare_and_swap_test(1, 0);
|
|
}
|
|
|
|
void post()
|
|
{
|
|
if (UNLIKELY(!m_value.compare_and_swap_test(0, 1)))
|
|
{
|
|
post_hard();
|
|
}
|
|
}
|
|
};
|