8 #ifndef WPIUTIL_WPI_SAFETHREAD_H_
9 #define WPIUTIL_WPI_SAFETHREAD_H_
16 #include "wpi/condition_variable.h"
17 #include "wpi/mutex.h"
25 virtual void Main() = 0;
27 mutable wpi::mutex m_mutex;
28 std::atomic_bool m_active{
true};
29 wpi::condition_variable m_cond;
30 std::thread::id m_threadId;
39 explicit operator bool()
const {
return m_thread !=
nullptr; }
40 std::unique_lock<wpi::mutex>& GetLock() {
return m_lock; }
43 std::shared_ptr<SafeThread> m_thread;
44 std::unique_lock<wpi::mutex> m_lock;
54 T& operator*()
const {
return *static_cast<T*>(m_thread.get()); }
55 T* operator->()
const {
return static_cast<T*>(m_thread.get()); }
79 explicit operator bool()
const;
81 std::thread::native_handle_type GetNativeThreadHandle();
83 void SetJoinAtExit(
bool joinAtExit) { m_joinAtExit = joinAtExit; }
86 void Start(std::shared_ptr<SafeThread> thr);
87 std::shared_ptr<SafeThread> GetThreadSharedPtr()
const;
90 mutable wpi::mutex m_mutex;
91 std::thread m_stdThread;
92 std::weak_ptr<SafeThread> m_thread;
93 std::atomic_bool m_joinAtExit{
true};
100 template <
typename T>
103 template <
typename... Args>
104 void Start(Args&&... args) {
105 detail::SafeThreadOwnerBase::Start(
106 std::make_shared<T>(std::forward<Args>(args)...));
110 Proxy GetThread()
const {
111 return Proxy(detail::SafeThreadOwnerBase::GetThreadSharedPtr());
114 std::shared_ptr<T> GetThreadSharedPtr()
const {
115 return std::static_pointer_cast<T>(
116 detail::SafeThreadOwnerBase::GetThreadSharedPtr());
122 #endif // WPIUTIL_WPI_SAFETHREAD_H_