8 #ifndef WPIUTIL_SUPPORT_SAFETHREAD_H_ 9 #define WPIUTIL_SUPPORT_SAFETHREAD_H_ 12 #include <condition_variable> 23 virtual void Main() = 0;
26 std::atomic_bool m_active;
27 std::condition_variable m_cond;
36 if (!m_thread)
return;
37 std::unique_lock<std::mutex>(m_thread->m_mutex).swap(m_lock);
38 if (!m_thread->m_active) {
44 explicit operator bool()
const {
return m_thread !=
nullptr; }
45 std::unique_lock<std::mutex>& GetLock() {
return m_lock; }
49 std::unique_lock<std::mutex> m_lock;
58 T& operator*()
const {
return *
static_cast<T*
>(m_thread); }
59 T* operator->()
const {
return static_cast<T*
>(m_thread); }
71 : m_thread(other.m_thread.exchange(
nullptr)) {}
73 SafeThread* otherthr = other.m_thread.exchange(
nullptr);
74 SafeThread* curthr = m_thread.exchange(otherthr);
75 other.m_thread.exchange(curthr);
80 explicit operator bool()
const {
return m_thread.load(); }
84 SafeThread* GetThread()
const {
return m_thread.load(); }
85 std::thread::native_handle_type GetNativeThreadHandle()
const {
86 return m_nativeHandle;
90 std::atomic<SafeThread*> m_thread;
91 std::atomic<std::thread::native_handle_type> m_nativeHandle;
94 inline void SafeThreadOwnerBase::Start(
SafeThread* thr) {
97 if (!m_thread.compare_exchange_strong(curthr, newthr)) {
101 std::thread stdThread([=]() {
105 m_nativeHandle = stdThread.native_handle();
109 inline void SafeThreadOwnerBase::Stop() {
112 thr->m_active =
false;
113 thr->m_cond.notify_one();
118 template <
typename T>
121 void Start() { Start(
new T); }
122 void Start(T* thr) { detail::SafeThreadOwnerBase::Start(thr); }
125 Proxy GetThread()
const {
126 return Proxy(detail::SafeThreadOwnerBase::GetThread());
132 #endif // WPIUTIL_SUPPORT_SAFETHREAD_H_ Definition: SafeThread.h:55
Definition: SafeThread.h:19
Definition: SafeThread.h:119
Definition: SocketError.cpp:18
Definition: SafeThread.h:63
Definition: SafeThread.h:33