wpiutil: SafeThread: Add thread id, support getting shared_ptr (#1722)

Rename base class function from GetThread to GetThreadSharedPtr.
This commit is contained in:
Peter Johnson
2019-06-20 19:51:09 -07:00
committed by GitHub
parent 61426d08de
commit ee8a33c568
2 changed files with 12 additions and 4 deletions

View File

@@ -1,5 +1,5 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) 2015-2018 FIRST. All Rights Reserved. */
/* Copyright (c) 2015-2019 FIRST. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
@@ -32,6 +32,7 @@ void detail::SafeThreadOwnerBase::Start(std::shared_ptr<SafeThread> thr) {
std::lock_guard<wpi::mutex> lock(m_mutex);
if (auto thr = m_thread.lock()) return;
m_stdThread = std::thread([=] { thr->Main(); });
thr->m_threadId = m_stdThread.get_id();
m_thread = thr;
}
@@ -80,7 +81,8 @@ detail::SafeThreadOwnerBase::GetNativeThreadHandle() {
return m_stdThread.native_handle();
}
std::shared_ptr<SafeThread> detail::SafeThreadOwnerBase::GetThread() const {
std::shared_ptr<SafeThread> detail::SafeThreadOwnerBase::GetThreadSharedPtr()
const {
std::lock_guard<wpi::mutex> lock(m_mutex);
return m_thread.lock();
}

View File

@@ -27,6 +27,7 @@ class SafeThread {
mutable wpi::mutex m_mutex;
std::atomic_bool m_active{true};
wpi::condition_variable m_cond;
std::thread::id m_threadId;
};
namespace detail {
@@ -83,7 +84,7 @@ class SafeThreadOwnerBase {
protected:
void Start(std::shared_ptr<SafeThread> thr);
std::shared_ptr<SafeThread> GetThread() const;
std::shared_ptr<SafeThread> GetThreadSharedPtr() const;
private:
mutable wpi::mutex m_mutex;
@@ -107,7 +108,12 @@ class SafeThreadOwner : public detail::SafeThreadOwnerBase {
using Proxy = typename detail::SafeThreadProxy<T>;
Proxy GetThread() const {
return Proxy(detail::SafeThreadOwnerBase::GetThread());
return Proxy(detail::SafeThreadOwnerBase::GetThreadSharedPtr());
}
std::shared_ptr<T> GetThreadSharedPtr() const {
return std::static_pointer_cast<T>(
detail::SafeThreadOwnerBase::GetThreadSharedPtr());
}
};