|
|
|
@ -15,12 +15,13 @@ |
|
|
|
#include <condition_variable> |
|
|
|
#include <stop_token> |
|
|
|
#include <thread> |
|
|
|
#include <utility> |
|
|
|
|
|
|
|
namespace Common { |
|
|
|
|
|
|
|
template <typename Condvar, typename Lock, typename Pred> |
|
|
|
void CondvarWait(Condvar& cv, std::unique_lock<Lock>& lk, std::stop_token token, Pred&& pred) { |
|
|
|
cv.wait(lk, token, std::move(pred)); |
|
|
|
cv.wait(lk, token, std::forward<Pred>(pred)); |
|
|
|
} |
|
|
|
|
|
|
|
template <typename Rep, typename Period> |
|
|
|
@ -109,7 +110,7 @@ public: |
|
|
|
|
|
|
|
// Insert the callback. |
|
|
|
stop_state_callback ret = ++m_next_callback; |
|
|
|
m_callbacks.emplace(ret, move(f)); |
|
|
|
m_callbacks.emplace(ret, std::move(f)); |
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
@ -162,7 +163,7 @@ private: |
|
|
|
friend class stop_source; |
|
|
|
template <typename Callback> |
|
|
|
friend class stop_callback; |
|
|
|
stop_token(shared_ptr<polyfill::stop_state> stop_state) : m_stop_state(move(stop_state)) {} |
|
|
|
stop_token(shared_ptr<polyfill::stop_state> stop_state) : m_stop_state(std::move(stop_state)) {} |
|
|
|
|
|
|
|
private: |
|
|
|
shared_ptr<polyfill::stop_state> m_stop_state; |
|
|
|
@ -198,7 +199,7 @@ public: |
|
|
|
private: |
|
|
|
friend class jthread; |
|
|
|
explicit stop_source(shared_ptr<polyfill::stop_state> stop_state) |
|
|
|
: m_stop_state(move(stop_state)) {} |
|
|
|
: m_stop_state(std::move(stop_state)) {} |
|
|
|
|
|
|
|
private: |
|
|
|
shared_ptr<polyfill::stop_state> m_stop_state; |
|
|
|
@ -218,16 +219,16 @@ public: |
|
|
|
C&& cb) noexcept(is_nothrow_constructible_v<Callback, C>) |
|
|
|
: m_stop_state(st.m_stop_state) { |
|
|
|
if (m_stop_state) { |
|
|
|
m_callback = m_stop_state->insert_callback(move(cb)); |
|
|
|
m_callback = m_stop_state->insert_callback(std::move(cb)); |
|
|
|
} |
|
|
|
} |
|
|
|
template <typename C> |
|
|
|
requires constructible_from<Callback, C> |
|
|
|
explicit stop_callback(stop_token&& st, |
|
|
|
C&& cb) noexcept(is_nothrow_constructible_v<Callback, C>) |
|
|
|
: m_stop_state(move(st.m_stop_state)) { |
|
|
|
: m_stop_state(std::move(st.m_stop_state)) { |
|
|
|
if (m_stop_state) { |
|
|
|
m_callback = m_stop_state->insert_callback(move(cb)); |
|
|
|
m_callback = m_stop_state->insert_callback(std::move(cb)); |
|
|
|
} |
|
|
|
} |
|
|
|
~stop_callback() { |
|
|
|
@ -260,7 +261,7 @@ public: |
|
|
|
typename = enable_if_t<!is_same_v<remove_cvref_t<F>, jthread>>> |
|
|
|
explicit jthread(F&& f, Args&&... args) |
|
|
|
: m_stop_state(make_shared<polyfill::stop_state>()), |
|
|
|
m_thread(make_thread(move(f), move(args)...)) {} |
|
|
|
m_thread(make_thread(std::forward<F>(f), std::forward<Args>(args)...)) {} |
|
|
|
|
|
|
|
~jthread() { |
|
|
|
if (joinable()) { |
|
|
|
@ -317,9 +318,9 @@ private: |
|
|
|
template <typename F, typename... Args> |
|
|
|
thread make_thread(F&& f, Args&&... args) { |
|
|
|
if constexpr (is_invocable_v<decay_t<F>, stop_token, decay_t<Args>...>) { |
|
|
|
return thread(move(f), get_stop_token(), move(args)...); |
|
|
|
return thread(std::forward<F>(f), get_stop_token(), std::forward<Args>(args)...); |
|
|
|
} else { |
|
|
|
return thread(move(f), move(args)...); |
|
|
|
return thread(std::forward<F>(f), std::forward<Args>(args)...); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|