On Thu, 21 Aug 2025 at 17:10, Tomasz Kamiński <tkami...@redhat.com> wrote:
>
> The move constructors for stop_source and stop_token are equivalent to
> copying and clearing the raw pointer, as they are wrappers for a
> counted-shared state.
>
> For jthread, the move constructor performs a member-wise move of stop_source
> and thread. While std::thread could also have a _Never_valueless_alt
> specialization due to its inexpensive move (only moving a handle), doing
> so now would change the ABI. This patch takes the opportunity to correct
> this behavior for jthread, before C++20 API is marked stable.

OK for trunk, thanks.

>
> libstdc++-v3/ChangeLog:
>
>         * include/std/stop_token (__variant::_Never_valueless_alt): Declare.
>         (__variant::_Never_valueless_alt<std::stop_token>)
>         (__variant::_Never_valueless_alt<std::stop_source>): Define.
>         * include/std/thread: (__variant::_Never_valueless_alt): Declare.
>         (__variant::_Never_valueless_alt<std::jthread>): Define.
> ---
>  libstdc++-v3/include/std/stop_token | 19 +++++++++++++++++++
>  libstdc++-v3/include/std/thread     | 14 ++++++++++++++
>  2 files changed, 33 insertions(+)
>
> diff --git a/libstdc++-v3/include/std/stop_token 
> b/libstdc++-v3/include/std/stop_token
> index 775ec6aa207..b593daff392 100644
> --- a/libstdc++-v3/include/std/stop_token
> +++ b/libstdc++-v3/include/std/stop_token
> @@ -648,6 +648,25 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>    template<typename _Callback>
>      stop_callback(stop_token, _Callback) -> stop_callback<_Callback>;
>
> +  /// @cond undocumented
> +  namespace __detail::__variant
> +  {
> +    template<typename> struct _Never_valueless_alt; // see <variant>
> +
> +    // Provide the strong exception-safety guarantee when emplacing a
> +    // stop_token or stop_source into a variant.
> +    template<>
> +      struct _Never_valueless_alt<std::stop_token>
> +      : true_type
> +      { };
> +
> +    template<>
> +      struct _Never_valueless_alt<std::stop_source>
> +      : true_type
> +      { };
> +  }  // namespace __detail::__variant
> +  /// @endcond
> +
>  _GLIBCXX_END_NAMESPACE_VERSION
>  } // namespace std
>  #endif // __glibcxx_jthread
> diff --git a/libstdc++-v3/include/std/thread b/libstdc++-v3/include/std/thread
> index 0de08c0bd3e..94ded714e9e 100644
> --- a/libstdc++-v3/include/std/thread
> +++ b/libstdc++-v3/include/std/thread
> @@ -294,6 +294,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>      stop_source _M_stop_source;
>      thread _M_thread;
>    };
> +
> +  /// @cond undocumented
> +  namespace __detail::__variant
> +  {
> +    template<typename> struct _Never_valueless_alt; // see <variant>
> +
> +    // Provide the strong exception-safety guarantee when emplacing a
> +    // jthread into a variant.
> +    template<>
> +      struct _Never_valueless_alt<std::jthread>
> +      : true_type
> +      { };
> +  }  // namespace __detail::__variant
> +  /// @endcond
>  #endif // __cpp_lib_jthread
>
>  #ifdef __cpp_lib_formatters // C++ >= 23
> --
> 2.50.1
>

Reply via email to