Home | History | Annotate | Line # | Download | only in std
      1       1.1    mrg // <future> -*- C++ -*-
      2       1.1    mrg 
      3  1.1.1.18    mrg // Copyright (C) 2009-2024 Free Software Foundation, Inc.
      4       1.1    mrg //
      5       1.1    mrg // This file is part of the GNU ISO C++ Library.  This library is free
      6       1.1    mrg // software; you can redistribute it and/or modify it under the
      7       1.1    mrg // terms of the GNU General Public License as published by the
      8       1.1    mrg // Free Software Foundation; either version 3, or (at your option)
      9       1.1    mrg // any later version.
     10       1.1    mrg 
     11       1.1    mrg // This library is distributed in the hope that it will be useful,
     12       1.1    mrg // but WITHOUT ANY WARRANTY; without even the implied warranty of
     13       1.1    mrg // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14       1.1    mrg // GNU General Public License for more details.
     15       1.1    mrg 
     16       1.1    mrg // Under Section 7 of GPL version 3, you are granted additional
     17       1.1    mrg // permissions described in the GCC Runtime Library Exception, version
     18       1.1    mrg // 3.1, as published by the Free Software Foundation.
     19       1.1    mrg 
     20       1.1    mrg // You should have received a copy of the GNU General Public License and
     21       1.1    mrg // a copy of the GCC Runtime Library Exception along with this program;
     22       1.1    mrg // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     23       1.1    mrg // <http://www.gnu.org/licenses/>.
     24       1.1    mrg 
     25   1.1.1.2    mrg /** @file include/future
     26       1.1    mrg  *  This is a Standard C++ Library header.
     27       1.1    mrg  */
     28       1.1    mrg 
     29       1.1    mrg #ifndef _GLIBCXX_FUTURE
     30       1.1    mrg #define _GLIBCXX_FUTURE 1
     31       1.1    mrg 
     32       1.1    mrg #pragma GCC system_header
     33       1.1    mrg 
     34  1.1.1.18    mrg #include <bits/requires_hosted.h> // concurrency
     35  1.1.1.18    mrg 
     36   1.1.1.2    mrg #if __cplusplus < 201103L
     37       1.1    mrg # include <bits/c++0x_warning.h>
     38       1.1    mrg #else
     39       1.1    mrg 
     40  1.1.1.16    mrg #include <mutex>	      // call_once
     41  1.1.1.16    mrg #include <condition_variable> // __at_thread_exit_elt
     42       1.1    mrg #include <system_error>
     43  1.1.1.16    mrg #include <bits/atomic_base.h> // atomic_flag
     44  1.1.1.16    mrg #include <bits/allocated_ptr.h>
     45   1.1.1.6    mrg #include <bits/atomic_futex.h>
     46  1.1.1.16    mrg #include <bits/exception_defines.h>
     47   1.1.1.9    mrg #include <bits/invoke.h>
     48   1.1.1.2    mrg #include <bits/unique_ptr.h>
     49   1.1.1.2    mrg #include <bits/shared_ptr.h>
     50   1.1.1.9    mrg #include <bits/std_function.h>
     51  1.1.1.16    mrg #include <bits/std_thread.h>
     52   1.1.1.2    mrg #include <bits/uses_allocator.h>
     53   1.1.1.6    mrg #include <ext/aligned_buffer.h>
     54       1.1    mrg 
     55   1.1.1.2    mrg namespace std _GLIBCXX_VISIBILITY(default)
     56       1.1    mrg {
     57   1.1.1.2    mrg _GLIBCXX_BEGIN_NAMESPACE_VERSION
     58   1.1.1.2    mrg 
     59       1.1    mrg   /**
     60       1.1    mrg    * @defgroup futures Futures
     61       1.1    mrg    * @ingroup concurrency
     62       1.1    mrg    *
     63  1.1.1.16    mrg    * Futures and promises provide support for retrieving the result from
     64  1.1.1.16    mrg    * an asynchronous function, e.g. one that is running in another thread.
     65  1.1.1.16    mrg    * A `std::future` represents an asynchronous result that will become
     66  1.1.1.16    mrg    * ready at some later time. A consumer can wait on a future until the
     67  1.1.1.16    mrg    * result is ready to be accessed.
     68  1.1.1.16    mrg    *
     69  1.1.1.16    mrg    * @since C++11
     70       1.1    mrg    * @{
     71       1.1    mrg    */
     72       1.1    mrg 
     73       1.1    mrg   /// Error code for futures
     74       1.1    mrg   enum class future_errc
     75       1.1    mrg   {
     76   1.1.1.2    mrg     future_already_retrieved = 1,
     77       1.1    mrg     promise_already_satisfied,
     78   1.1.1.2    mrg     no_state,
     79   1.1.1.2    mrg     broken_promise
     80       1.1    mrg   };
     81       1.1    mrg 
     82  1.1.1.16    mrg   /// Specialization that allows `future_errc` to convert to `error_code`.
     83       1.1    mrg   template<>
     84       1.1    mrg     struct is_error_code_enum<future_errc> : public true_type { };
     85       1.1    mrg 
     86       1.1    mrg   /// Points to a statically-allocated object derived from error_category.
     87  1.1.1.16    mrg   [[__nodiscard__, __gnu__::__const__]]
     88   1.1.1.2    mrg   const error_category&
     89   1.1.1.2    mrg   future_category() noexcept;
     90       1.1    mrg 
     91  1.1.1.16    mrg   /// Overload of make_error_code for `future_errc`.
     92  1.1.1.16    mrg   [[__nodiscard__]]
     93   1.1.1.2    mrg   inline error_code
     94   1.1.1.2    mrg   make_error_code(future_errc __errc) noexcept
     95   1.1.1.2    mrg   { return error_code(static_cast<int>(__errc), future_category()); }
     96   1.1.1.2    mrg 
     97  1.1.1.16    mrg   /// Overload of make_error_condition for `future_errc`.
     98  1.1.1.16    mrg   [[__nodiscard__]]
     99   1.1.1.2    mrg   inline error_condition
    100   1.1.1.2    mrg   make_error_condition(future_errc __errc) noexcept
    101   1.1.1.2    mrg   { return error_condition(static_cast<int>(__errc), future_category()); }
    102       1.1    mrg 
    103       1.1    mrg   /**
    104       1.1    mrg    *  @brief Exception type thrown by futures.
    105       1.1    mrg    *  @ingroup exceptions
    106  1.1.1.16    mrg    *  @since C++11
    107       1.1    mrg    */
    108       1.1    mrg   class future_error : public logic_error
    109       1.1    mrg   {
    110       1.1    mrg   public:
    111   1.1.1.9    mrg     explicit
    112   1.1.1.9    mrg     future_error(future_errc __errc)
    113   1.1.1.9    mrg     : future_error(std::make_error_code(__errc))
    114       1.1    mrg     { }
    115       1.1    mrg 
    116   1.1.1.2    mrg     virtual ~future_error() noexcept;
    117       1.1    mrg 
    118   1.1.1.2    mrg     virtual const char*
    119   1.1.1.2    mrg     what() const noexcept;
    120       1.1    mrg 
    121   1.1.1.2    mrg     const error_code&
    122   1.1.1.2    mrg     code() const noexcept { return _M_code; }
    123   1.1.1.9    mrg 
    124   1.1.1.9    mrg   private:
    125   1.1.1.9    mrg     explicit
    126   1.1.1.9    mrg     future_error(error_code __ec)
    127   1.1.1.9    mrg     : logic_error("std::future_error: " + __ec.message()), _M_code(__ec)
    128   1.1.1.9    mrg     { }
    129   1.1.1.9    mrg 
    130   1.1.1.9    mrg     friend void __throw_future_error(int);
    131   1.1.1.9    mrg 
    132   1.1.1.9    mrg     error_code 			_M_code;
    133       1.1    mrg   };
    134       1.1    mrg 
    135       1.1    mrg   // Forward declarations.
    136       1.1    mrg   template<typename _Res>
    137       1.1    mrg     class future;
    138       1.1    mrg 
    139       1.1    mrg   template<typename _Res>
    140       1.1    mrg     class shared_future;
    141       1.1    mrg 
    142   1.1.1.2    mrg   template<typename _Signature>
    143       1.1    mrg     class packaged_task;
    144       1.1    mrg 
    145       1.1    mrg   template<typename _Res>
    146       1.1    mrg     class promise;
    147       1.1    mrg 
    148   1.1.1.2    mrg   /// Launch code for futures
    149   1.1.1.2    mrg   enum class launch
    150   1.1.1.2    mrg   {
    151   1.1.1.2    mrg     async = 1,
    152   1.1.1.2    mrg     deferred = 2
    153   1.1.1.2    mrg   };
    154   1.1.1.2    mrg 
    155  1.1.1.18    mrg   [[__nodiscard__]]
    156  1.1.1.16    mrg   constexpr launch operator&(launch __x, launch __y) noexcept
    157   1.1.1.2    mrg   {
    158   1.1.1.2    mrg     return static_cast<launch>(
    159   1.1.1.2    mrg 	static_cast<int>(__x) & static_cast<int>(__y));
    160   1.1.1.2    mrg   }
    161   1.1.1.2    mrg 
    162  1.1.1.18    mrg   [[__nodiscard__]]
    163  1.1.1.16    mrg   constexpr launch operator|(launch __x, launch __y) noexcept
    164   1.1.1.2    mrg   {
    165   1.1.1.2    mrg     return static_cast<launch>(
    166   1.1.1.2    mrg 	static_cast<int>(__x) | static_cast<int>(__y));
    167   1.1.1.2    mrg   }
    168   1.1.1.2    mrg 
    169  1.1.1.18    mrg   [[__nodiscard__]]
    170  1.1.1.16    mrg   constexpr launch operator^(launch __x, launch __y) noexcept
    171   1.1.1.2    mrg   {
    172   1.1.1.2    mrg     return static_cast<launch>(
    173   1.1.1.2    mrg 	static_cast<int>(__x) ^ static_cast<int>(__y));
    174   1.1.1.2    mrg   }
    175   1.1.1.2    mrg 
    176  1.1.1.18    mrg   [[__nodiscard__]]
    177  1.1.1.16    mrg   constexpr launch operator~(launch __x) noexcept
    178   1.1.1.2    mrg   { return static_cast<launch>(~static_cast<int>(__x)); }
    179   1.1.1.2    mrg 
    180  1.1.1.18    mrg   _GLIBCXX14_CONSTEXPR
    181  1.1.1.16    mrg   inline launch& operator&=(launch& __x, launch __y) noexcept
    182   1.1.1.2    mrg   { return __x = __x & __y; }
    183   1.1.1.2    mrg 
    184  1.1.1.18    mrg   _GLIBCXX14_CONSTEXPR
    185  1.1.1.16    mrg   inline launch& operator|=(launch& __x, launch __y) noexcept
    186   1.1.1.2    mrg   { return __x = __x | __y; }
    187   1.1.1.2    mrg 
    188  1.1.1.18    mrg   _GLIBCXX14_CONSTEXPR
    189  1.1.1.16    mrg   inline launch& operator^=(launch& __x, launch __y) noexcept
    190   1.1.1.2    mrg   { return __x = __x ^ __y; }
    191   1.1.1.2    mrg 
    192   1.1.1.2    mrg   /// Status code for futures
    193   1.1.1.2    mrg   enum class future_status
    194   1.1.1.2    mrg   {
    195   1.1.1.2    mrg     ready,
    196   1.1.1.2    mrg     timeout,
    197   1.1.1.2    mrg     deferred
    198   1.1.1.2    mrg   };
    199       1.1    mrg 
    200  1.1.1.16    mrg   /// @cond undocumented
    201   1.1.1.7    mrg   // _GLIBCXX_RESOLVE_LIB_DEFECTS
    202   1.1.1.7    mrg   // 2021. Further incorrect usages of result_of
    203       1.1    mrg   template<typename _Fn, typename... _Args>
    204  1.1.1.13    mrg     using __async_result_of = typename __invoke_result<
    205  1.1.1.13    mrg       typename decay<_Fn>::type, typename decay<_Args>::type...>::type;
    206  1.1.1.16    mrg   /// @endcond
    207   1.1.1.7    mrg 
    208   1.1.1.7    mrg   template<typename _Fn, typename... _Args>
    209   1.1.1.7    mrg     future<__async_result_of<_Fn, _Args...>>
    210       1.1    mrg     async(launch __policy, _Fn&& __fn, _Args&&... __args);
    211       1.1    mrg 
    212       1.1    mrg   template<typename _Fn, typename... _Args>
    213   1.1.1.7    mrg     future<__async_result_of<_Fn, _Args...>>
    214       1.1    mrg     async(_Fn&& __fn, _Args&&... __args);
    215       1.1    mrg 
    216  1.1.1.13    mrg #if defined(_GLIBCXX_HAS_GTHREADS)
    217       1.1    mrg 
    218  1.1.1.16    mrg   /// @cond undocumented
    219  1.1.1.16    mrg 
    220       1.1    mrg   /// Base class and enclosing scope.
    221       1.1    mrg   struct __future_base
    222       1.1    mrg   {
    223       1.1    mrg     /// Base class for results.
    224       1.1    mrg     struct _Result_base
    225       1.1    mrg     {
    226       1.1    mrg       exception_ptr		_M_error;
    227       1.1    mrg 
    228       1.1    mrg       _Result_base(const _Result_base&) = delete;
    229       1.1    mrg       _Result_base& operator=(const _Result_base&) = delete;
    230       1.1    mrg 
    231       1.1    mrg       // _M_destroy() allows derived classes to control deallocation
    232       1.1    mrg       virtual void _M_destroy() = 0;
    233       1.1    mrg 
    234       1.1    mrg       struct _Deleter
    235       1.1    mrg       {
    236       1.1    mrg 	void operator()(_Result_base* __fr) const { __fr->_M_destroy(); }
    237       1.1    mrg       };
    238       1.1    mrg 
    239       1.1    mrg     protected:
    240   1.1.1.2    mrg       _Result_base();
    241   1.1.1.2    mrg       virtual ~_Result_base();
    242       1.1    mrg     };
    243       1.1    mrg 
    244   1.1.1.6    mrg     /// A unique_ptr for result objects.
    245   1.1.1.6    mrg     template<typename _Res>
    246   1.1.1.6    mrg       using _Ptr = unique_ptr<_Res, _Result_base::_Deleter>;
    247   1.1.1.6    mrg 
    248   1.1.1.6    mrg     /// A result object that has storage for an object of type _Res.
    249       1.1    mrg     template<typename _Res>
    250       1.1    mrg       struct _Result : _Result_base
    251       1.1    mrg       {
    252       1.1    mrg       private:
    253   1.1.1.6    mrg 	__gnu_cxx::__aligned_buffer<_Res>	_M_storage;
    254   1.1.1.6    mrg 	bool 					_M_initialized;
    255       1.1    mrg 
    256       1.1    mrg       public:
    257   1.1.1.2    mrg 	typedef _Res result_type;
    258   1.1.1.2    mrg 
    259   1.1.1.2    mrg 	_Result() noexcept : _M_initialized() { }
    260   1.1.1.9    mrg 
    261       1.1    mrg 	~_Result()
    262       1.1    mrg 	{
    263       1.1    mrg 	  if (_M_initialized)
    264       1.1    mrg 	    _M_value().~_Res();
    265       1.1    mrg 	}
    266       1.1    mrg 
    267       1.1    mrg 	// Return lvalue, future will add const or rvalue-reference
    268   1.1.1.2    mrg 	_Res&
    269   1.1.1.6    mrg 	_M_value() noexcept { return *_M_storage._M_ptr(); }
    270       1.1    mrg 
    271       1.1    mrg 	void
    272       1.1    mrg 	_M_set(const _Res& __res)
    273       1.1    mrg 	{
    274   1.1.1.6    mrg 	  ::new (_M_storage._M_addr()) _Res(__res);
    275       1.1    mrg 	  _M_initialized = true;
    276       1.1    mrg 	}
    277       1.1    mrg 
    278       1.1    mrg 	void
    279       1.1    mrg 	_M_set(_Res&& __res)
    280       1.1    mrg 	{
    281   1.1.1.6    mrg 	  ::new (_M_storage._M_addr()) _Res(std::move(__res));
    282       1.1    mrg 	  _M_initialized = true;
    283       1.1    mrg 	}
    284       1.1    mrg 
    285       1.1    mrg       private:
    286       1.1    mrg 	void _M_destroy() { delete this; }
    287       1.1    mrg     };
    288       1.1    mrg 
    289   1.1.1.6    mrg     /// A result object that uses an allocator.
    290       1.1    mrg     template<typename _Res, typename _Alloc>
    291   1.1.1.2    mrg       struct _Result_alloc final : _Result<_Res>, _Alloc
    292       1.1    mrg       {
    293   1.1.1.6    mrg 	using __allocator_type = __alloc_rebind<_Alloc, _Result_alloc>;
    294       1.1    mrg 
    295       1.1    mrg         explicit
    296   1.1.1.2    mrg 	_Result_alloc(const _Alloc& __a) : _Result<_Res>(), _Alloc(__a)
    297   1.1.1.6    mrg 	{ }
    298   1.1.1.9    mrg 
    299       1.1    mrg       private:
    300       1.1    mrg 	void _M_destroy()
    301   1.1.1.6    mrg 	{
    302   1.1.1.6    mrg 	  __allocator_type __a(*this);
    303   1.1.1.6    mrg 	  __allocated_ptr<__allocator_type> __guard_ptr{ __a, this };
    304   1.1.1.6    mrg 	  this->~_Result_alloc();
    305   1.1.1.6    mrg 	}
    306   1.1.1.2    mrg       };
    307       1.1    mrg 
    308   1.1.1.6    mrg     // Create a result object that uses an allocator.
    309       1.1    mrg     template<typename _Res, typename _Allocator>
    310   1.1.1.2    mrg       static _Ptr<_Result_alloc<_Res, _Allocator>>
    311       1.1    mrg       _S_allocate_result(const _Allocator& __a)
    312       1.1    mrg       {
    313   1.1.1.6    mrg 	using __result_type = _Result_alloc<_Res, _Allocator>;
    314   1.1.1.6    mrg 	typename __result_type::__allocator_type __a2(__a);
    315   1.1.1.6    mrg 	auto __guard = std::__allocate_guarded(__a2);
    316   1.1.1.6    mrg 	__result_type* __p = ::new((void*)__guard.get()) __result_type{__a};
    317   1.1.1.6    mrg 	__guard = nullptr;
    318   1.1.1.6    mrg 	return _Ptr<__result_type>(__p);
    319       1.1    mrg       }
    320       1.1    mrg 
    321   1.1.1.6    mrg     // Keep it simple for std::allocator.
    322   1.1.1.2    mrg     template<typename _Res, typename _Tp>
    323   1.1.1.2    mrg       static _Ptr<_Result<_Res>>
    324  1.1.1.18    mrg       _S_allocate_result(const std::allocator<_Tp>&)
    325   1.1.1.2    mrg       {
    326   1.1.1.2    mrg 	return _Ptr<_Result<_Res>>(new _Result<_Res>);
    327   1.1.1.2    mrg       }
    328       1.1    mrg 
    329   1.1.1.6    mrg     // Base class for various types of shared state created by an
    330   1.1.1.6    mrg     // asynchronous provider (such as a std::promise) and shared with one
    331   1.1.1.6    mrg     // or more associated futures.
    332   1.1.1.6    mrg     class _State_baseV2
    333       1.1    mrg     {
    334   1.1.1.2    mrg       typedef _Ptr<_Result_base> _Ptr_type;
    335       1.1    mrg 
    336   1.1.1.6    mrg       enum _Status : unsigned {
    337   1.1.1.6    mrg 	__not_ready,
    338   1.1.1.6    mrg 	__ready
    339   1.1.1.6    mrg       };
    340   1.1.1.6    mrg 
    341       1.1    mrg       _Ptr_type			_M_result;
    342   1.1.1.6    mrg       __atomic_futex_unsigned<>	_M_status;
    343   1.1.1.6    mrg       atomic_flag         	_M_retrieved = ATOMIC_FLAG_INIT;
    344       1.1    mrg       once_flag			_M_once;
    345       1.1    mrg 
    346       1.1    mrg     public:
    347   1.1.1.6    mrg       _State_baseV2() noexcept : _M_result(), _M_status(_Status::__not_ready)
    348   1.1.1.6    mrg 	{ }
    349   1.1.1.6    mrg       _State_baseV2(const _State_baseV2&) = delete;
    350   1.1.1.6    mrg       _State_baseV2& operator=(const _State_baseV2&) = delete;
    351   1.1.1.6    mrg       virtual ~_State_baseV2() = default;
    352       1.1    mrg 
    353       1.1    mrg       _Result_base&
    354       1.1    mrg       wait()
    355       1.1    mrg       {
    356   1.1.1.6    mrg 	// Run any deferred function or join any asynchronous thread:
    357   1.1.1.6    mrg 	_M_complete_async();
    358   1.1.1.6    mrg 	// Acquire MO makes sure this synchronizes with the thread that made
    359   1.1.1.6    mrg 	// the future ready.
    360   1.1.1.6    mrg 	_M_status._M_load_when_equal(_Status::__ready, memory_order_acquire);
    361       1.1    mrg 	return *_M_result;
    362       1.1    mrg       }
    363       1.1    mrg 
    364       1.1    mrg       template<typename _Rep, typename _Period>
    365   1.1.1.2    mrg         future_status
    366       1.1    mrg         wait_for(const chrono::duration<_Rep, _Period>& __rel)
    367       1.1    mrg         {
    368   1.1.1.6    mrg 	  // First, check if the future has been made ready.  Use acquire MO
    369   1.1.1.6    mrg 	  // to synchronize with the thread that made it ready.
    370   1.1.1.6    mrg 	  if (_M_status._M_load(memory_order_acquire) == _Status::__ready)
    371   1.1.1.2    mrg 	    return future_status::ready;
    372  1.1.1.14    mrg 
    373   1.1.1.6    mrg 	  if (_M_is_deferred_future())
    374   1.1.1.6    mrg 	    return future_status::deferred;
    375  1.1.1.14    mrg 
    376  1.1.1.14    mrg 	  // Don't wait unless the relative time is greater than zero.
    377  1.1.1.14    mrg 	  if (__rel > __rel.zero()
    378  1.1.1.14    mrg 	      && _M_status._M_load_when_equal_for(_Status::__ready,
    379  1.1.1.14    mrg 						  memory_order_acquire,
    380  1.1.1.14    mrg 						  __rel))
    381   1.1.1.6    mrg 	    {
    382   1.1.1.6    mrg 	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
    383   1.1.1.6    mrg 	      // 2100.  timed waiting functions must also join
    384   1.1.1.6    mrg 	      // This call is a no-op by default except on an async future,
    385   1.1.1.6    mrg 	      // in which case the async thread is joined.  It's also not a
    386   1.1.1.6    mrg 	      // no-op for a deferred future, but such a future will never
    387   1.1.1.6    mrg 	      // reach this point because it returns future_status::deferred
    388   1.1.1.6    mrg 	      // instead of waiting for the future to become ready (see
    389   1.1.1.6    mrg 	      // above).  Async futures synchronize in this call, so we need
    390   1.1.1.6    mrg 	      // no further synchronization here.
    391   1.1.1.6    mrg 	      _M_complete_async();
    392   1.1.1.6    mrg 
    393   1.1.1.6    mrg 	      return future_status::ready;
    394   1.1.1.6    mrg 	    }
    395   1.1.1.2    mrg 	  return future_status::timeout;
    396       1.1    mrg 	}
    397       1.1    mrg 
    398       1.1    mrg       template<typename _Clock, typename _Duration>
    399   1.1.1.2    mrg         future_status
    400       1.1    mrg         wait_until(const chrono::time_point<_Clock, _Duration>& __abs)
    401       1.1    mrg         {
    402  1.1.1.14    mrg #if __cplusplus > 201703L
    403  1.1.1.14    mrg 	  static_assert(chrono::is_clock_v<_Clock>);
    404  1.1.1.14    mrg #endif
    405   1.1.1.6    mrg 	  // First, check if the future has been made ready.  Use acquire MO
    406   1.1.1.6    mrg 	  // to synchronize with the thread that made it ready.
    407   1.1.1.6    mrg 	  if (_M_status._M_load(memory_order_acquire) == _Status::__ready)
    408   1.1.1.2    mrg 	    return future_status::ready;
    409  1.1.1.14    mrg 
    410   1.1.1.6    mrg 	  if (_M_is_deferred_future())
    411   1.1.1.6    mrg 	    return future_status::deferred;
    412  1.1.1.14    mrg 
    413   1.1.1.6    mrg 	  if (_M_status._M_load_when_equal_until(_Status::__ready,
    414  1.1.1.14    mrg 						 memory_order_acquire,
    415  1.1.1.14    mrg 						 __abs))
    416   1.1.1.6    mrg 	    {
    417   1.1.1.6    mrg 	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
    418   1.1.1.6    mrg 	      // 2100.  timed waiting functions must also join
    419   1.1.1.6    mrg 	      // See wait_for(...) above.
    420   1.1.1.6    mrg 	      _M_complete_async();
    421   1.1.1.6    mrg 
    422   1.1.1.6    mrg 	      return future_status::ready;
    423   1.1.1.6    mrg 	    }
    424   1.1.1.2    mrg 	  return future_status::timeout;
    425       1.1    mrg 	}
    426       1.1    mrg 
    427   1.1.1.6    mrg       // Provide a result to the shared state and make it ready.
    428   1.1.1.6    mrg       // Calls at most once: _M_result = __res();
    429       1.1    mrg       void
    430       1.1    mrg       _M_set_result(function<_Ptr_type()> __res, bool __ignore_failure = false)
    431       1.1    mrg       {
    432   1.1.1.6    mrg 	bool __did_set = false;
    433       1.1    mrg         // all calls to this function are serialized,
    434       1.1    mrg         // side-effects of invoking __res only happen once
    435   1.1.1.6    mrg 	call_once(_M_once, &_State_baseV2::_M_do_set, this,
    436   1.1.1.6    mrg 		  std::__addressof(__res), std::__addressof(__did_set));
    437   1.1.1.6    mrg 	if (__did_set)
    438   1.1.1.6    mrg 	  // Use release MO to synchronize with observers of the ready state.
    439   1.1.1.6    mrg 	  _M_status._M_store_notify_all(_Status::__ready,
    440   1.1.1.6    mrg 					memory_order_release);
    441   1.1.1.4    mrg 	else if (!__ignore_failure)
    442       1.1    mrg           __throw_future_error(int(future_errc::promise_already_satisfied));
    443       1.1    mrg       }
    444       1.1    mrg 
    445   1.1.1.6    mrg       // Provide a result to the shared state but delay making it ready
    446   1.1.1.6    mrg       // until the calling thread exits.
    447   1.1.1.6    mrg       // Calls at most once: _M_result = __res();
    448   1.1.1.6    mrg       void
    449   1.1.1.6    mrg       _M_set_delayed_result(function<_Ptr_type()> __res,
    450   1.1.1.6    mrg 			    weak_ptr<_State_baseV2> __self)
    451   1.1.1.6    mrg       {
    452   1.1.1.6    mrg 	bool __did_set = false;
    453   1.1.1.6    mrg 	unique_ptr<_Make_ready> __mr{new _Make_ready};
    454   1.1.1.6    mrg         // all calls to this function are serialized,
    455   1.1.1.6    mrg         // side-effects of invoking __res only happen once
    456   1.1.1.6    mrg 	call_once(_M_once, &_State_baseV2::_M_do_set, this,
    457   1.1.1.6    mrg 		  std::__addressof(__res), std::__addressof(__did_set));
    458   1.1.1.6    mrg 	if (!__did_set)
    459   1.1.1.6    mrg           __throw_future_error(int(future_errc::promise_already_satisfied));
    460   1.1.1.6    mrg 	__mr->_M_shared_state = std::move(__self);
    461   1.1.1.6    mrg 	__mr->_M_set();
    462   1.1.1.6    mrg 	__mr.release();
    463   1.1.1.6    mrg       }
    464   1.1.1.6    mrg 
    465   1.1.1.6    mrg       // Abandon this shared state.
    466       1.1    mrg       void
    467       1.1    mrg       _M_break_promise(_Ptr_type __res)
    468       1.1    mrg       {
    469       1.1    mrg 	if (static_cast<bool>(__res))
    470       1.1    mrg 	  {
    471   1.1.1.9    mrg 	    __res->_M_error =
    472   1.1.1.9    mrg 	      make_exception_ptr(future_error(future_errc::broken_promise));
    473   1.1.1.6    mrg 	    // This function is only called when the last asynchronous result
    474   1.1.1.6    mrg 	    // provider is abandoning this shared state, so noone can be
    475   1.1.1.6    mrg 	    // trying to make the shared state ready at the same time, and
    476   1.1.1.6    mrg 	    // we can access _M_result directly instead of through call_once.
    477   1.1.1.6    mrg 	    _M_result.swap(__res);
    478   1.1.1.6    mrg 	    // Use release MO to synchronize with observers of the ready state.
    479   1.1.1.6    mrg 	    _M_status._M_store_notify_all(_Status::__ready,
    480   1.1.1.6    mrg 					  memory_order_release);
    481       1.1    mrg 	  }
    482       1.1    mrg       }
    483       1.1    mrg 
    484   1.1.1.6    mrg       // Called when this object is first passed to a future.
    485       1.1    mrg       void
    486       1.1    mrg       _M_set_retrieved_flag()
    487       1.1    mrg       {
    488       1.1    mrg 	if (_M_retrieved.test_and_set())
    489       1.1    mrg 	  __throw_future_error(int(future_errc::future_already_retrieved));
    490       1.1    mrg       }
    491       1.1    mrg 
    492       1.1    mrg       template<typename _Res, typename _Arg>
    493       1.1    mrg         struct _Setter;
    494       1.1    mrg 
    495       1.1    mrg       // set lvalues
    496       1.1    mrg       template<typename _Res, typename _Arg>
    497       1.1    mrg         struct _Setter<_Res, _Arg&>
    498       1.1    mrg         {
    499       1.1    mrg           // check this is only used by promise<R>::set_value(const R&)
    500   1.1.1.6    mrg           // or promise<R&>::set_value(R&)
    501       1.1    mrg           static_assert(is_same<_Res, _Arg&>::value  // promise<R&>
    502   1.1.1.6    mrg               || is_same<const _Res, _Arg>::value,   // promise<R>
    503       1.1    mrg               "Invalid specialisation");
    504       1.1    mrg 
    505   1.1.1.6    mrg 	  // Used by std::promise to copy construct the result.
    506   1.1.1.6    mrg           typename promise<_Res>::_Ptr_type operator()() const
    507       1.1    mrg           {
    508   1.1.1.6    mrg             _M_promise->_M_storage->_M_set(*_M_arg);
    509       1.1    mrg             return std::move(_M_promise->_M_storage);
    510       1.1    mrg           }
    511       1.1    mrg           promise<_Res>*    _M_promise;
    512   1.1.1.6    mrg           _Arg*             _M_arg;
    513       1.1    mrg         };
    514       1.1    mrg 
    515       1.1    mrg       // set rvalues
    516       1.1    mrg       template<typename _Res>
    517       1.1    mrg         struct _Setter<_Res, _Res&&>
    518       1.1    mrg         {
    519   1.1.1.6    mrg 	  // Used by std::promise to move construct the result.
    520   1.1.1.6    mrg           typename promise<_Res>::_Ptr_type operator()() const
    521       1.1    mrg           {
    522   1.1.1.6    mrg             _M_promise->_M_storage->_M_set(std::move(*_M_arg));
    523       1.1    mrg             return std::move(_M_promise->_M_storage);
    524       1.1    mrg           }
    525       1.1    mrg           promise<_Res>*    _M_promise;
    526   1.1.1.6    mrg           _Res*             _M_arg;
    527       1.1    mrg         };
    528       1.1    mrg 
    529   1.1.1.8    mrg       // set void
    530   1.1.1.8    mrg       template<typename _Res>
    531   1.1.1.8    mrg 	struct _Setter<_Res, void>
    532   1.1.1.8    mrg 	{
    533   1.1.1.8    mrg 	  static_assert(is_void<_Res>::value, "Only used for promise<void>");
    534   1.1.1.8    mrg 
    535   1.1.1.8    mrg 	  typename promise<_Res>::_Ptr_type operator()() const
    536   1.1.1.8    mrg 	  { return std::move(_M_promise->_M_storage); }
    537   1.1.1.8    mrg 
    538   1.1.1.8    mrg 	  promise<_Res>*    _M_promise;
    539   1.1.1.8    mrg 	};
    540   1.1.1.8    mrg 
    541       1.1    mrg       struct __exception_ptr_tag { };
    542       1.1    mrg 
    543       1.1    mrg       // set exceptions
    544       1.1    mrg       template<typename _Res>
    545       1.1    mrg         struct _Setter<_Res, __exception_ptr_tag>
    546       1.1    mrg         {
    547   1.1.1.6    mrg 	  // Used by std::promise to store an exception as the result.
    548   1.1.1.6    mrg           typename promise<_Res>::_Ptr_type operator()() const
    549       1.1    mrg           {
    550   1.1.1.6    mrg             _M_promise->_M_storage->_M_error = *_M_ex;
    551       1.1    mrg             return std::move(_M_promise->_M_storage);
    552       1.1    mrg           }
    553       1.1    mrg 
    554       1.1    mrg           promise<_Res>*   _M_promise;
    555   1.1.1.6    mrg           exception_ptr*    _M_ex;
    556       1.1    mrg         };
    557       1.1    mrg 
    558       1.1    mrg       template<typename _Res, typename _Arg>
    559  1.1.1.15    mrg 	__attribute__((__always_inline__))
    560       1.1    mrg         static _Setter<_Res, _Arg&&>
    561  1.1.1.15    mrg         __setter(promise<_Res>* __prom, _Arg&& __arg) noexcept
    562       1.1    mrg         {
    563   1.1.1.7    mrg           return _Setter<_Res, _Arg&&>{ __prom, std::__addressof(__arg) };
    564       1.1    mrg         }
    565       1.1    mrg 
    566       1.1    mrg       template<typename _Res>
    567  1.1.1.15    mrg 	__attribute__((__always_inline__))
    568       1.1    mrg         static _Setter<_Res, __exception_ptr_tag>
    569  1.1.1.15    mrg         __setter(exception_ptr& __ex, promise<_Res>* __prom) noexcept
    570       1.1    mrg         {
    571  1.1.1.16    mrg           __glibcxx_assert(__ex != nullptr); // LWG 2276
    572   1.1.1.6    mrg           return _Setter<_Res, __exception_ptr_tag>{ __prom, &__ex };
    573       1.1    mrg         }
    574       1.1    mrg 
    575   1.1.1.8    mrg       template<typename _Res>
    576  1.1.1.15    mrg 	__attribute__((__always_inline__))
    577   1.1.1.8    mrg 	static _Setter<_Res, void>
    578  1.1.1.15    mrg 	__setter(promise<_Res>* __prom) noexcept
    579   1.1.1.8    mrg 	{
    580   1.1.1.8    mrg 	  return _Setter<_Res, void>{ __prom };
    581   1.1.1.8    mrg 	}
    582   1.1.1.8    mrg 
    583       1.1    mrg       template<typename _Tp>
    584   1.1.1.2    mrg         static void
    585       1.1    mrg         _S_check(const shared_ptr<_Tp>& __p)
    586       1.1    mrg         {
    587       1.1    mrg           if (!static_cast<bool>(__p))
    588       1.1    mrg             __throw_future_error((int)future_errc::no_state);
    589       1.1    mrg         }
    590       1.1    mrg 
    591       1.1    mrg     private:
    592   1.1.1.6    mrg       // The function invoked with std::call_once(_M_once, ...).
    593       1.1    mrg       void
    594   1.1.1.6    mrg       _M_do_set(function<_Ptr_type()>* __f, bool* __did_set)
    595       1.1    mrg       {
    596   1.1.1.6    mrg         _Ptr_type __res = (*__f)();
    597   1.1.1.6    mrg         // Notify the caller that we did try to set; if we do not throw an
    598   1.1.1.6    mrg         // exception, the caller will be aware that it did set (e.g., see
    599   1.1.1.6    mrg         // _M_set_result).
    600   1.1.1.6    mrg 	*__did_set = true;
    601   1.1.1.6    mrg         _M_result.swap(__res); // nothrow
    602       1.1    mrg       }
    603       1.1    mrg 
    604   1.1.1.6    mrg       // Wait for completion of async function.
    605   1.1.1.6    mrg       virtual void _M_complete_async() { }
    606   1.1.1.6    mrg 
    607   1.1.1.6    mrg       // Return true if state corresponds to a deferred function.
    608   1.1.1.6    mrg       virtual bool _M_is_deferred_future() const { return false; }
    609       1.1    mrg 
    610   1.1.1.6    mrg       struct _Make_ready final : __at_thread_exit_elt
    611   1.1.1.6    mrg       {
    612   1.1.1.6    mrg 	weak_ptr<_State_baseV2> _M_shared_state;
    613   1.1.1.6    mrg 	static void _S_run(void*);
    614   1.1.1.6    mrg 	void _M_set();
    615   1.1.1.6    mrg       };
    616       1.1    mrg     };
    617       1.1    mrg 
    618   1.1.1.6    mrg #ifdef _GLIBCXX_ASYNC_ABI_COMPAT
    619   1.1.1.6    mrg     class _State_base;
    620   1.1.1.6    mrg     class _Async_state_common;
    621   1.1.1.6    mrg #else
    622   1.1.1.6    mrg     using _State_base = _State_baseV2;
    623   1.1.1.6    mrg     class _Async_state_commonV2;
    624   1.1.1.6    mrg #endif
    625   1.1.1.6    mrg 
    626   1.1.1.9    mrg     template<typename _BoundFn,
    627   1.1.1.9    mrg 	     typename _Res = decltype(std::declval<_BoundFn&>()())>
    628       1.1    mrg       class _Deferred_state;
    629       1.1    mrg 
    630   1.1.1.9    mrg     template<typename _BoundFn,
    631   1.1.1.9    mrg 	     typename _Res = decltype(std::declval<_BoundFn&>()())>
    632   1.1.1.2    mrg       class _Async_state_impl;
    633       1.1    mrg 
    634       1.1    mrg     template<typename _Signature>
    635  1.1.1.17    mrg       struct _Task_state_base;
    636   1.1.1.2    mrg 
    637   1.1.1.2    mrg     template<typename _Fn, typename _Alloc, typename _Signature>
    638  1.1.1.17    mrg       struct _Task_state;
    639       1.1    mrg 
    640   1.1.1.6    mrg     template<typename _Res_ptr, typename _Fn,
    641   1.1.1.2    mrg 	     typename _Res = typename _Res_ptr::element_type::result_type>
    642       1.1    mrg       struct _Task_setter;
    643       1.1    mrg 
    644   1.1.1.2    mrg     template<typename _Res_ptr, typename _BoundFn>
    645   1.1.1.6    mrg       static _Task_setter<_Res_ptr, _BoundFn>
    646   1.1.1.6    mrg       _S_task_setter(_Res_ptr& __ptr, _BoundFn& __call)
    647   1.1.1.2    mrg       {
    648   1.1.1.6    mrg 	return { std::__addressof(__ptr), std::__addressof(__call) };
    649   1.1.1.2    mrg       }
    650   1.1.1.2    mrg   };
    651       1.1    mrg 
    652       1.1    mrg   /// Partial specialization for reference types.
    653       1.1    mrg   template<typename _Res>
    654       1.1    mrg     struct __future_base::_Result<_Res&> : __future_base::_Result_base
    655       1.1    mrg     {
    656   1.1.1.2    mrg       typedef _Res& result_type;
    657   1.1.1.2    mrg 
    658   1.1.1.2    mrg       _Result() noexcept : _M_value_ptr() { }
    659       1.1    mrg 
    660   1.1.1.6    mrg       void
    661   1.1.1.6    mrg       _M_set(_Res& __res) noexcept
    662   1.1.1.6    mrg       { _M_value_ptr = std::addressof(__res); }
    663       1.1    mrg 
    664   1.1.1.2    mrg       _Res& _M_get() noexcept { return *_M_value_ptr; }
    665       1.1    mrg 
    666       1.1    mrg     private:
    667       1.1    mrg       _Res* 			_M_value_ptr;
    668   1.1.1.2    mrg 
    669       1.1    mrg       void _M_destroy() { delete this; }
    670       1.1    mrg     };
    671       1.1    mrg 
    672       1.1    mrg   /// Explicit specialization for void.
    673       1.1    mrg   template<>
    674       1.1    mrg     struct __future_base::_Result<void> : __future_base::_Result_base
    675       1.1    mrg     {
    676   1.1.1.2    mrg       typedef void result_type;
    677   1.1.1.2    mrg 
    678       1.1    mrg     private:
    679       1.1    mrg       void _M_destroy() { delete this; }
    680       1.1    mrg     };
    681       1.1    mrg 
    682  1.1.1.16    mrg   /// @endcond
    683  1.1.1.16    mrg 
    684   1.1.1.6    mrg #ifndef _GLIBCXX_ASYNC_ABI_COMPAT
    685   1.1.1.6    mrg 
    686  1.1.1.16    mrg   /// @cond undocumented
    687   1.1.1.6    mrg   // Allow _Setter objects to be stored locally in std::function
    688   1.1.1.6    mrg   template<typename _Res, typename _Arg>
    689   1.1.1.6    mrg     struct __is_location_invariant
    690   1.1.1.6    mrg     <__future_base::_State_base::_Setter<_Res, _Arg>>
    691   1.1.1.6    mrg     : true_type { };
    692   1.1.1.6    mrg 
    693   1.1.1.6    mrg   // Allow _Task_setter objects to be stored locally in std::function
    694   1.1.1.6    mrg   template<typename _Res_ptr, typename _Fn, typename _Res>
    695   1.1.1.6    mrg     struct __is_location_invariant
    696   1.1.1.6    mrg     <__future_base::_Task_setter<_Res_ptr, _Fn, _Res>>
    697   1.1.1.6    mrg     : true_type { };
    698  1.1.1.16    mrg   /// @endcond
    699       1.1    mrg 
    700       1.1    mrg   /// Common implementation for future and shared_future.
    701       1.1    mrg   template<typename _Res>
    702       1.1    mrg     class __basic_future : public __future_base
    703       1.1    mrg     {
    704       1.1    mrg     protected:
    705   1.1.1.2    mrg       typedef shared_ptr<_State_base>		__state_type;
    706       1.1    mrg       typedef __future_base::_Result<_Res>&	__result_type;
    707       1.1    mrg 
    708       1.1    mrg     private:
    709       1.1    mrg       __state_type 		_M_state;
    710       1.1    mrg 
    711       1.1    mrg     public:
    712       1.1    mrg       // Disable copying.
    713       1.1    mrg       __basic_future(const __basic_future&) = delete;
    714       1.1    mrg       __basic_future& operator=(const __basic_future&) = delete;
    715       1.1    mrg 
    716   1.1.1.2    mrg       bool
    717   1.1.1.2    mrg       valid() const noexcept { return static_cast<bool>(_M_state); }
    718       1.1    mrg 
    719   1.1.1.2    mrg       void
    720   1.1.1.2    mrg       wait() const
    721   1.1.1.2    mrg       {
    722   1.1.1.2    mrg         _State_base::_S_check(_M_state);
    723   1.1.1.2    mrg         _M_state->wait();
    724   1.1.1.2    mrg       }
    725       1.1    mrg 
    726       1.1    mrg       template<typename _Rep, typename _Period>
    727   1.1.1.2    mrg         future_status
    728       1.1    mrg         wait_for(const chrono::duration<_Rep, _Period>& __rel) const
    729   1.1.1.2    mrg         {
    730   1.1.1.2    mrg           _State_base::_S_check(_M_state);
    731   1.1.1.2    mrg           return _M_state->wait_for(__rel);
    732   1.1.1.2    mrg         }
    733       1.1    mrg 
    734       1.1    mrg       template<typename _Clock, typename _Duration>
    735   1.1.1.2    mrg         future_status
    736       1.1    mrg         wait_until(const chrono::time_point<_Clock, _Duration>& __abs) const
    737   1.1.1.2    mrg         {
    738   1.1.1.2    mrg           _State_base::_S_check(_M_state);
    739   1.1.1.2    mrg           return _M_state->wait_until(__abs);
    740   1.1.1.2    mrg         }
    741       1.1    mrg 
    742       1.1    mrg     protected:
    743       1.1    mrg       /// Wait for the state to be ready and rethrow any stored exception
    744       1.1    mrg       __result_type
    745   1.1.1.2    mrg       _M_get_result() const
    746       1.1    mrg       {
    747   1.1.1.2    mrg         _State_base::_S_check(_M_state);
    748       1.1    mrg         _Result_base& __res = _M_state->wait();
    749  1.1.1.16    mrg         if (!(__res._M_error == nullptr))
    750       1.1    mrg           rethrow_exception(__res._M_error);
    751       1.1    mrg         return static_cast<__result_type>(__res);
    752       1.1    mrg       }
    753       1.1    mrg 
    754   1.1.1.2    mrg       void _M_swap(__basic_future& __that) noexcept
    755       1.1    mrg       {
    756       1.1    mrg         _M_state.swap(__that._M_state);
    757       1.1    mrg       }
    758       1.1    mrg 
    759       1.1    mrg       // Construction of a future by promise::get_future()
    760       1.1    mrg       explicit
    761       1.1    mrg       __basic_future(const __state_type& __state) : _M_state(__state)
    762       1.1    mrg       {
    763   1.1.1.2    mrg         _State_base::_S_check(_M_state);
    764       1.1    mrg         _M_state->_M_set_retrieved_flag();
    765       1.1    mrg       }
    766       1.1    mrg 
    767       1.1    mrg       // Copy construction from a shared_future
    768       1.1    mrg       explicit
    769   1.1.1.2    mrg       __basic_future(const shared_future<_Res>&) noexcept;
    770       1.1    mrg 
    771       1.1    mrg       // Move construction from a shared_future
    772       1.1    mrg       explicit
    773   1.1.1.2    mrg       __basic_future(shared_future<_Res>&&) noexcept;
    774       1.1    mrg 
    775       1.1    mrg       // Move construction from a future
    776       1.1    mrg       explicit
    777   1.1.1.2    mrg       __basic_future(future<_Res>&&) noexcept;
    778       1.1    mrg 
    779   1.1.1.2    mrg       constexpr __basic_future() noexcept : _M_state() { }
    780       1.1    mrg 
    781       1.1    mrg       struct _Reset
    782       1.1    mrg       {
    783   1.1.1.2    mrg         explicit _Reset(__basic_future& __fut) noexcept : _M_fut(__fut) { }
    784       1.1    mrg         ~_Reset() { _M_fut._M_state.reset(); }
    785       1.1    mrg         __basic_future& _M_fut;
    786       1.1    mrg       };
    787       1.1    mrg     };
    788       1.1    mrg 
    789       1.1    mrg 
    790       1.1    mrg   /// Primary template for future.
    791       1.1    mrg   template<typename _Res>
    792       1.1    mrg     class future : public __basic_future<_Res>
    793       1.1    mrg     {
    794  1.1.1.16    mrg       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    795  1.1.1.16    mrg       // 3458. Is shared_future intended to work with arrays or function types?
    796  1.1.1.16    mrg       static_assert(!is_array<_Res>{}, "result type must not be an array");
    797  1.1.1.16    mrg       static_assert(!is_function<_Res>{}, "result type must not be a function");
    798  1.1.1.16    mrg       static_assert(is_destructible<_Res>{},
    799  1.1.1.16    mrg 		    "result type must be destructible");
    800  1.1.1.16    mrg 
    801       1.1    mrg       friend class promise<_Res>;
    802       1.1    mrg       template<typename> friend class packaged_task;
    803       1.1    mrg       template<typename _Fn, typename... _Args>
    804   1.1.1.7    mrg         friend future<__async_result_of<_Fn, _Args...>>
    805       1.1    mrg         async(launch, _Fn&&, _Args&&...);
    806       1.1    mrg 
    807       1.1    mrg       typedef __basic_future<_Res> _Base_type;
    808       1.1    mrg       typedef typename _Base_type::__state_type __state_type;
    809       1.1    mrg 
    810       1.1    mrg       explicit
    811       1.1    mrg       future(const __state_type& __state) : _Base_type(__state) { }
    812       1.1    mrg 
    813       1.1    mrg     public:
    814   1.1.1.2    mrg       constexpr future() noexcept : _Base_type() { }
    815       1.1    mrg 
    816       1.1    mrg       /// Move constructor
    817   1.1.1.2    mrg       future(future&& __uf) noexcept : _Base_type(std::move(__uf)) { }
    818       1.1    mrg 
    819       1.1    mrg       // Disable copying
    820       1.1    mrg       future(const future&) = delete;
    821       1.1    mrg       future& operator=(const future&) = delete;
    822       1.1    mrg 
    823   1.1.1.2    mrg       future& operator=(future&& __fut) noexcept
    824       1.1    mrg       {
    825       1.1    mrg         future(std::move(__fut))._M_swap(*this);
    826       1.1    mrg         return *this;
    827       1.1    mrg       }
    828       1.1    mrg 
    829       1.1    mrg       /// Retrieving the value
    830       1.1    mrg       _Res
    831       1.1    mrg       get()
    832       1.1    mrg       {
    833       1.1    mrg         typename _Base_type::_Reset __reset(*this);
    834       1.1    mrg         return std::move(this->_M_get_result()._M_value());
    835       1.1    mrg       }
    836   1.1.1.2    mrg 
    837   1.1.1.9    mrg       shared_future<_Res> share() noexcept;
    838       1.1    mrg     };
    839   1.1.1.2    mrg 
    840       1.1    mrg   /// Partial specialization for future<R&>
    841       1.1    mrg   template<typename _Res>
    842       1.1    mrg     class future<_Res&> : public __basic_future<_Res&>
    843       1.1    mrg     {
    844       1.1    mrg       friend class promise<_Res&>;
    845       1.1    mrg       template<typename> friend class packaged_task;
    846       1.1    mrg       template<typename _Fn, typename... _Args>
    847   1.1.1.7    mrg         friend future<__async_result_of<_Fn, _Args...>>
    848       1.1    mrg         async(launch, _Fn&&, _Args&&...);
    849       1.1    mrg 
    850       1.1    mrg       typedef __basic_future<_Res&> _Base_type;
    851       1.1    mrg       typedef typename _Base_type::__state_type __state_type;
    852       1.1    mrg 
    853       1.1    mrg       explicit
    854       1.1    mrg       future(const __state_type& __state) : _Base_type(__state) { }
    855       1.1    mrg 
    856       1.1    mrg     public:
    857   1.1.1.2    mrg       constexpr future() noexcept : _Base_type() { }
    858       1.1    mrg 
    859       1.1    mrg       /// Move constructor
    860   1.1.1.2    mrg       future(future&& __uf) noexcept : _Base_type(std::move(__uf)) { }
    861       1.1    mrg 
    862       1.1    mrg       // Disable copying
    863       1.1    mrg       future(const future&) = delete;
    864       1.1    mrg       future& operator=(const future&) = delete;
    865       1.1    mrg 
    866   1.1.1.2    mrg       future& operator=(future&& __fut) noexcept
    867       1.1    mrg       {
    868       1.1    mrg         future(std::move(__fut))._M_swap(*this);
    869       1.1    mrg         return *this;
    870       1.1    mrg       }
    871       1.1    mrg 
    872       1.1    mrg       /// Retrieving the value
    873   1.1.1.2    mrg       _Res&
    874       1.1    mrg       get()
    875       1.1    mrg       {
    876       1.1    mrg         typename _Base_type::_Reset __reset(*this);
    877       1.1    mrg         return this->_M_get_result()._M_get();
    878       1.1    mrg       }
    879   1.1.1.2    mrg 
    880   1.1.1.9    mrg       shared_future<_Res&> share() noexcept;
    881       1.1    mrg     };
    882       1.1    mrg 
    883       1.1    mrg   /// Explicit specialization for future<void>
    884       1.1    mrg   template<>
    885       1.1    mrg     class future<void> : public __basic_future<void>
    886       1.1    mrg     {
    887       1.1    mrg       friend class promise<void>;
    888       1.1    mrg       template<typename> friend class packaged_task;
    889       1.1    mrg       template<typename _Fn, typename... _Args>
    890   1.1.1.7    mrg         friend future<__async_result_of<_Fn, _Args...>>
    891       1.1    mrg         async(launch, _Fn&&, _Args&&...);
    892       1.1    mrg 
    893       1.1    mrg       typedef __basic_future<void> _Base_type;
    894       1.1    mrg       typedef typename _Base_type::__state_type __state_type;
    895       1.1    mrg 
    896       1.1    mrg       explicit
    897       1.1    mrg       future(const __state_type& __state) : _Base_type(__state) { }
    898       1.1    mrg 
    899       1.1    mrg     public:
    900   1.1.1.2    mrg       constexpr future() noexcept : _Base_type() { }
    901       1.1    mrg 
    902       1.1    mrg       /// Move constructor
    903   1.1.1.2    mrg       future(future&& __uf) noexcept : _Base_type(std::move(__uf)) { }
    904       1.1    mrg 
    905       1.1    mrg       // Disable copying
    906       1.1    mrg       future(const future&) = delete;
    907       1.1    mrg       future& operator=(const future&) = delete;
    908       1.1    mrg 
    909   1.1.1.2    mrg       future& operator=(future&& __fut) noexcept
    910       1.1    mrg       {
    911       1.1    mrg         future(std::move(__fut))._M_swap(*this);
    912       1.1    mrg         return *this;
    913       1.1    mrg       }
    914       1.1    mrg 
    915       1.1    mrg       /// Retrieving the value
    916   1.1.1.2    mrg       void
    917       1.1    mrg       get()
    918       1.1    mrg       {
    919       1.1    mrg         typename _Base_type::_Reset __reset(*this);
    920       1.1    mrg         this->_M_get_result();
    921       1.1    mrg       }
    922   1.1.1.2    mrg 
    923   1.1.1.9    mrg       shared_future<void> share() noexcept;
    924       1.1    mrg     };
    925       1.1    mrg 
    926       1.1    mrg 
    927       1.1    mrg   /// Primary template for shared_future.
    928       1.1    mrg   template<typename _Res>
    929       1.1    mrg     class shared_future : public __basic_future<_Res>
    930       1.1    mrg     {
    931  1.1.1.16    mrg       // _GLIBCXX_RESOLVE_LIB_DEFECTS
    932  1.1.1.16    mrg       // 3458. Is shared_future intended to work with arrays or function types?
    933  1.1.1.16    mrg       static_assert(!is_array<_Res>{}, "result type must not be an array");
    934  1.1.1.16    mrg       static_assert(!is_function<_Res>{}, "result type must not be a function");
    935  1.1.1.16    mrg       static_assert(is_destructible<_Res>{},
    936  1.1.1.16    mrg 		    "result type must be destructible");
    937  1.1.1.16    mrg 
    938       1.1    mrg       typedef __basic_future<_Res> _Base_type;
    939       1.1    mrg 
    940       1.1    mrg     public:
    941   1.1.1.2    mrg       constexpr shared_future() noexcept : _Base_type() { }
    942       1.1    mrg 
    943       1.1    mrg       /// Copy constructor
    944   1.1.1.8    mrg       shared_future(const shared_future& __sf) noexcept : _Base_type(__sf) { }
    945       1.1    mrg 
    946       1.1    mrg       /// Construct from a future rvalue
    947   1.1.1.2    mrg       shared_future(future<_Res>&& __uf) noexcept
    948       1.1    mrg       : _Base_type(std::move(__uf))
    949       1.1    mrg       { }
    950       1.1    mrg 
    951       1.1    mrg       /// Construct from a shared_future rvalue
    952   1.1.1.2    mrg       shared_future(shared_future&& __sf) noexcept
    953       1.1    mrg       : _Base_type(std::move(__sf))
    954       1.1    mrg       { }
    955       1.1    mrg 
    956   1.1.1.8    mrg       shared_future& operator=(const shared_future& __sf) noexcept
    957       1.1    mrg       {
    958       1.1    mrg         shared_future(__sf)._M_swap(*this);
    959       1.1    mrg         return *this;
    960       1.1    mrg       }
    961       1.1    mrg 
    962   1.1.1.2    mrg       shared_future& operator=(shared_future&& __sf) noexcept
    963       1.1    mrg       {
    964       1.1    mrg         shared_future(std::move(__sf))._M_swap(*this);
    965       1.1    mrg         return *this;
    966       1.1    mrg       }
    967       1.1    mrg 
    968       1.1    mrg       /// Retrieving the value
    969       1.1    mrg       const _Res&
    970   1.1.1.2    mrg       get() const { return this->_M_get_result()._M_value(); }
    971       1.1    mrg     };
    972   1.1.1.2    mrg 
    973       1.1    mrg   /// Partial specialization for shared_future<R&>
    974       1.1    mrg   template<typename _Res>
    975       1.1    mrg     class shared_future<_Res&> : public __basic_future<_Res&>
    976       1.1    mrg     {
    977       1.1    mrg       typedef __basic_future<_Res&>           _Base_type;
    978       1.1    mrg 
    979       1.1    mrg     public:
    980   1.1.1.2    mrg       constexpr shared_future() noexcept : _Base_type() { }
    981       1.1    mrg 
    982       1.1    mrg       /// Copy constructor
    983       1.1    mrg       shared_future(const shared_future& __sf) : _Base_type(__sf) { }
    984       1.1    mrg 
    985       1.1    mrg       /// Construct from a future rvalue
    986   1.1.1.2    mrg       shared_future(future<_Res&>&& __uf) noexcept
    987       1.1    mrg       : _Base_type(std::move(__uf))
    988       1.1    mrg       { }
    989       1.1    mrg 
    990       1.1    mrg       /// Construct from a shared_future rvalue
    991   1.1.1.2    mrg       shared_future(shared_future&& __sf) noexcept
    992       1.1    mrg       : _Base_type(std::move(__sf))
    993       1.1    mrg       { }
    994       1.1    mrg 
    995       1.1    mrg       shared_future& operator=(const shared_future& __sf)
    996       1.1    mrg       {
    997       1.1    mrg         shared_future(__sf)._M_swap(*this);
    998       1.1    mrg         return *this;
    999       1.1    mrg       }
   1000       1.1    mrg 
   1001   1.1.1.2    mrg       shared_future& operator=(shared_future&& __sf) noexcept
   1002       1.1    mrg       {
   1003       1.1    mrg         shared_future(std::move(__sf))._M_swap(*this);
   1004       1.1    mrg         return *this;
   1005       1.1    mrg       }
   1006       1.1    mrg 
   1007       1.1    mrg       /// Retrieving the value
   1008   1.1.1.2    mrg       _Res&
   1009   1.1.1.2    mrg       get() const { return this->_M_get_result()._M_get(); }
   1010       1.1    mrg     };
   1011       1.1    mrg 
   1012       1.1    mrg   /// Explicit specialization for shared_future<void>
   1013       1.1    mrg   template<>
   1014       1.1    mrg     class shared_future<void> : public __basic_future<void>
   1015       1.1    mrg     {
   1016       1.1    mrg       typedef __basic_future<void> _Base_type;
   1017       1.1    mrg 
   1018       1.1    mrg     public:
   1019   1.1.1.2    mrg       constexpr shared_future() noexcept : _Base_type() { }
   1020       1.1    mrg 
   1021       1.1    mrg       /// Copy constructor
   1022       1.1    mrg       shared_future(const shared_future& __sf) : _Base_type(__sf) { }
   1023       1.1    mrg 
   1024       1.1    mrg       /// Construct from a future rvalue
   1025   1.1.1.2    mrg       shared_future(future<void>&& __uf) noexcept
   1026       1.1    mrg       : _Base_type(std::move(__uf))
   1027       1.1    mrg       { }
   1028       1.1    mrg 
   1029       1.1    mrg       /// Construct from a shared_future rvalue
   1030   1.1.1.2    mrg       shared_future(shared_future&& __sf) noexcept
   1031       1.1    mrg       : _Base_type(std::move(__sf))
   1032       1.1    mrg       { }
   1033       1.1    mrg 
   1034       1.1    mrg       shared_future& operator=(const shared_future& __sf)
   1035       1.1    mrg       {
   1036       1.1    mrg         shared_future(__sf)._M_swap(*this);
   1037       1.1    mrg         return *this;
   1038       1.1    mrg       }
   1039       1.1    mrg 
   1040   1.1.1.2    mrg       shared_future& operator=(shared_future&& __sf) noexcept
   1041       1.1    mrg       {
   1042       1.1    mrg         shared_future(std::move(__sf))._M_swap(*this);
   1043       1.1    mrg         return *this;
   1044       1.1    mrg       }
   1045       1.1    mrg 
   1046       1.1    mrg       // Retrieving the value
   1047   1.1.1.2    mrg       void
   1048   1.1.1.2    mrg       get() const { this->_M_get_result(); }
   1049       1.1    mrg     };
   1050       1.1    mrg 
   1051       1.1    mrg   // Now we can define the protected __basic_future constructors.
   1052       1.1    mrg   template<typename _Res>
   1053       1.1    mrg     inline __basic_future<_Res>::
   1054   1.1.1.2    mrg     __basic_future(const shared_future<_Res>& __sf) noexcept
   1055       1.1    mrg     : _M_state(__sf._M_state)
   1056       1.1    mrg     { }
   1057       1.1    mrg 
   1058       1.1    mrg   template<typename _Res>
   1059       1.1    mrg     inline __basic_future<_Res>::
   1060   1.1.1.2    mrg     __basic_future(shared_future<_Res>&& __sf) noexcept
   1061       1.1    mrg     : _M_state(std::move(__sf._M_state))
   1062       1.1    mrg     { }
   1063       1.1    mrg 
   1064       1.1    mrg   template<typename _Res>
   1065       1.1    mrg     inline __basic_future<_Res>::
   1066   1.1.1.2    mrg     __basic_future(future<_Res>&& __uf) noexcept
   1067       1.1    mrg     : _M_state(std::move(__uf._M_state))
   1068       1.1    mrg     { }
   1069       1.1    mrg 
   1070   1.1.1.9    mrg   // _GLIBCXX_RESOLVE_LIB_DEFECTS
   1071   1.1.1.9    mrg   // 2556. Wide contract for future::share()
   1072   1.1.1.2    mrg   template<typename _Res>
   1073   1.1.1.2    mrg     inline shared_future<_Res>
   1074   1.1.1.9    mrg     future<_Res>::share() noexcept
   1075   1.1.1.2    mrg     { return shared_future<_Res>(std::move(*this)); }
   1076   1.1.1.2    mrg 
   1077   1.1.1.2    mrg   template<typename _Res>
   1078   1.1.1.2    mrg     inline shared_future<_Res&>
   1079   1.1.1.9    mrg     future<_Res&>::share() noexcept
   1080   1.1.1.2    mrg     { return shared_future<_Res&>(std::move(*this)); }
   1081   1.1.1.2    mrg 
   1082   1.1.1.2    mrg   inline shared_future<void>
   1083   1.1.1.9    mrg   future<void>::share() noexcept
   1084   1.1.1.2    mrg   { return shared_future<void>(std::move(*this)); }
   1085       1.1    mrg 
   1086       1.1    mrg   /// Primary template for promise
   1087       1.1    mrg   template<typename _Res>
   1088       1.1    mrg     class promise
   1089       1.1    mrg     {
   1090  1.1.1.16    mrg       // _GLIBCXX_RESOLVE_LIB_DEFECTS
   1091  1.1.1.16    mrg       // 3466: Specify the requirements for promise/future/[...] consistently
   1092  1.1.1.16    mrg       static_assert(!is_array<_Res>{}, "result type must not be an array");
   1093  1.1.1.16    mrg       static_assert(!is_function<_Res>{}, "result type must not be a function");
   1094  1.1.1.16    mrg       static_assert(is_destructible<_Res>{},
   1095  1.1.1.16    mrg 		    "result type must be destructible");
   1096  1.1.1.16    mrg 
   1097   1.1.1.2    mrg       typedef __future_base::_State_base 	_State;
   1098       1.1    mrg       typedef __future_base::_Result<_Res>	_Res_type;
   1099   1.1.1.2    mrg       typedef __future_base::_Ptr<_Res_type>	_Ptr_type;
   1100  1.1.1.16    mrg       template<typename, typename> friend struct _State::_Setter;
   1101   1.1.1.8    mrg       friend _State;
   1102   1.1.1.2    mrg 
   1103       1.1    mrg       shared_ptr<_State>                        _M_future;
   1104       1.1    mrg       _Ptr_type                                 _M_storage;
   1105       1.1    mrg 
   1106       1.1    mrg     public:
   1107       1.1    mrg       promise()
   1108       1.1    mrg       : _M_future(std::make_shared<_State>()),
   1109       1.1    mrg 	_M_storage(new _Res_type())
   1110       1.1    mrg       { }
   1111       1.1    mrg 
   1112   1.1.1.2    mrg       promise(promise&& __rhs) noexcept
   1113       1.1    mrg       : _M_future(std::move(__rhs._M_future)),
   1114       1.1    mrg 	_M_storage(std::move(__rhs._M_storage))
   1115       1.1    mrg       { }
   1116       1.1    mrg 
   1117       1.1    mrg       template<typename _Allocator>
   1118       1.1    mrg         promise(allocator_arg_t, const _Allocator& __a)
   1119       1.1    mrg         : _M_future(std::allocate_shared<_State>(__a)),
   1120   1.1.1.2    mrg 	  _M_storage(__future_base::_S_allocate_result<_Res>(__a))
   1121   1.1.1.2    mrg         { }
   1122   1.1.1.2    mrg 
   1123   1.1.1.2    mrg       template<typename _Allocator>
   1124   1.1.1.2    mrg         promise(allocator_arg_t, const _Allocator&, promise&& __rhs)
   1125   1.1.1.2    mrg         : _M_future(std::move(__rhs._M_future)),
   1126   1.1.1.2    mrg 	  _M_storage(std::move(__rhs._M_storage))
   1127       1.1    mrg         { }
   1128       1.1    mrg 
   1129       1.1    mrg       promise(const promise&) = delete;
   1130       1.1    mrg 
   1131       1.1    mrg       ~promise()
   1132       1.1    mrg       {
   1133       1.1    mrg         if (static_cast<bool>(_M_future) && !_M_future.unique())
   1134       1.1    mrg           _M_future->_M_break_promise(std::move(_M_storage));
   1135       1.1    mrg       }
   1136       1.1    mrg 
   1137       1.1    mrg       // Assignment
   1138       1.1    mrg       promise&
   1139   1.1.1.2    mrg       operator=(promise&& __rhs) noexcept
   1140       1.1    mrg       {
   1141       1.1    mrg         promise(std::move(__rhs)).swap(*this);
   1142       1.1    mrg         return *this;
   1143       1.1    mrg       }
   1144       1.1    mrg 
   1145       1.1    mrg       promise& operator=(const promise&) = delete;
   1146       1.1    mrg 
   1147       1.1    mrg       void
   1148   1.1.1.2    mrg       swap(promise& __rhs) noexcept
   1149       1.1    mrg       {
   1150       1.1    mrg         _M_future.swap(__rhs._M_future);
   1151       1.1    mrg         _M_storage.swap(__rhs._M_storage);
   1152       1.1    mrg       }
   1153       1.1    mrg 
   1154       1.1    mrg       // Retrieving the result
   1155       1.1    mrg       future<_Res>
   1156       1.1    mrg       get_future()
   1157       1.1    mrg       { return future<_Res>(_M_future); }
   1158       1.1    mrg 
   1159       1.1    mrg       // Setting the result
   1160       1.1    mrg       void
   1161       1.1    mrg       set_value(const _Res& __r)
   1162  1.1.1.15    mrg       { _M_state()._M_set_result(_State::__setter(this, __r)); }
   1163   1.1.1.6    mrg 
   1164   1.1.1.6    mrg       void
   1165   1.1.1.6    mrg       set_value(_Res&& __r)
   1166  1.1.1.15    mrg       { _M_state()._M_set_result(_State::__setter(this, std::move(__r))); }
   1167   1.1.1.6    mrg 
   1168   1.1.1.6    mrg       void
   1169   1.1.1.6    mrg       set_exception(exception_ptr __p)
   1170  1.1.1.15    mrg       { _M_state()._M_set_result(_State::__setter(__p, this)); }
   1171   1.1.1.6    mrg 
   1172   1.1.1.6    mrg       void
   1173   1.1.1.6    mrg       set_value_at_thread_exit(const _Res& __r)
   1174       1.1    mrg       {
   1175  1.1.1.15    mrg 	_M_state()._M_set_delayed_result(_State::__setter(this, __r),
   1176   1.1.1.6    mrg 					 _M_future);
   1177       1.1    mrg       }
   1178       1.1    mrg 
   1179       1.1    mrg       void
   1180   1.1.1.6    mrg       set_value_at_thread_exit(_Res&& __r)
   1181       1.1    mrg       {
   1182  1.1.1.15    mrg 	_M_state()._M_set_delayed_result(
   1183   1.1.1.6    mrg 	    _State::__setter(this, std::move(__r)), _M_future);
   1184       1.1    mrg       }
   1185       1.1    mrg 
   1186       1.1    mrg       void
   1187   1.1.1.6    mrg       set_exception_at_thread_exit(exception_ptr __p)
   1188       1.1    mrg       {
   1189  1.1.1.15    mrg 	_M_state()._M_set_delayed_result(_State::__setter(__p, this),
   1190   1.1.1.6    mrg 					 _M_future);
   1191       1.1    mrg       }
   1192  1.1.1.15    mrg 
   1193  1.1.1.15    mrg     private:
   1194  1.1.1.15    mrg       _State&
   1195  1.1.1.15    mrg       _M_state()
   1196  1.1.1.15    mrg       {
   1197  1.1.1.15    mrg 	__future_base::_State_base::_S_check(_M_future);
   1198  1.1.1.15    mrg 	return *_M_future;
   1199  1.1.1.15    mrg       }
   1200       1.1    mrg     };
   1201       1.1    mrg 
   1202       1.1    mrg   template<typename _Res>
   1203       1.1    mrg     inline void
   1204   1.1.1.2    mrg     swap(promise<_Res>& __x, promise<_Res>& __y) noexcept
   1205       1.1    mrg     { __x.swap(__y); }
   1206       1.1    mrg 
   1207   1.1.1.2    mrg   template<typename _Res, typename _Alloc>
   1208   1.1.1.2    mrg     struct uses_allocator<promise<_Res>, _Alloc>
   1209   1.1.1.2    mrg     : public true_type { };
   1210   1.1.1.2    mrg 
   1211   1.1.1.2    mrg 
   1212       1.1    mrg   /// Partial specialization for promise<R&>
   1213       1.1    mrg   template<typename _Res>
   1214       1.1    mrg     class promise<_Res&>
   1215       1.1    mrg     {
   1216   1.1.1.2    mrg       typedef __future_base::_State_base	_State;
   1217       1.1    mrg       typedef __future_base::_Result<_Res&>	_Res_type;
   1218   1.1.1.2    mrg       typedef __future_base::_Ptr<_Res_type> 	_Ptr_type;
   1219  1.1.1.16    mrg       template<typename, typename> friend struct _State::_Setter;
   1220   1.1.1.8    mrg       friend _State;
   1221       1.1    mrg 
   1222       1.1    mrg       shared_ptr<_State>                        _M_future;
   1223       1.1    mrg       _Ptr_type                                 _M_storage;
   1224       1.1    mrg 
   1225       1.1    mrg     public:
   1226       1.1    mrg       promise()
   1227       1.1    mrg       : _M_future(std::make_shared<_State>()),
   1228       1.1    mrg 	_M_storage(new _Res_type())
   1229       1.1    mrg       { }
   1230       1.1    mrg 
   1231   1.1.1.2    mrg       promise(promise&& __rhs) noexcept
   1232   1.1.1.2    mrg       : _M_future(std::move(__rhs._M_future)),
   1233       1.1    mrg 	_M_storage(std::move(__rhs._M_storage))
   1234       1.1    mrg       { }
   1235       1.1    mrg 
   1236       1.1    mrg       template<typename _Allocator>
   1237       1.1    mrg         promise(allocator_arg_t, const _Allocator& __a)
   1238       1.1    mrg         : _M_future(std::allocate_shared<_State>(__a)),
   1239   1.1.1.2    mrg 	  _M_storage(__future_base::_S_allocate_result<_Res&>(__a))
   1240   1.1.1.2    mrg         { }
   1241   1.1.1.2    mrg 
   1242   1.1.1.2    mrg       template<typename _Allocator>
   1243   1.1.1.2    mrg         promise(allocator_arg_t, const _Allocator&, promise&& __rhs)
   1244   1.1.1.2    mrg         : _M_future(std::move(__rhs._M_future)),
   1245   1.1.1.2    mrg 	  _M_storage(std::move(__rhs._M_storage))
   1246       1.1    mrg         { }
   1247       1.1    mrg 
   1248       1.1    mrg       promise(const promise&) = delete;
   1249       1.1    mrg 
   1250       1.1    mrg       ~promise()
   1251       1.1    mrg       {
   1252       1.1    mrg         if (static_cast<bool>(_M_future) && !_M_future.unique())
   1253       1.1    mrg           _M_future->_M_break_promise(std::move(_M_storage));
   1254       1.1    mrg       }
   1255       1.1    mrg 
   1256       1.1    mrg       // Assignment
   1257       1.1    mrg       promise&
   1258   1.1.1.2    mrg       operator=(promise&& __rhs) noexcept
   1259       1.1    mrg       {
   1260       1.1    mrg         promise(std::move(__rhs)).swap(*this);
   1261       1.1    mrg         return *this;
   1262       1.1    mrg       }
   1263       1.1    mrg 
   1264       1.1    mrg       promise& operator=(const promise&) = delete;
   1265       1.1    mrg 
   1266       1.1    mrg       void
   1267   1.1.1.2    mrg       swap(promise& __rhs) noexcept
   1268       1.1    mrg       {
   1269       1.1    mrg         _M_future.swap(__rhs._M_future);
   1270       1.1    mrg         _M_storage.swap(__rhs._M_storage);
   1271       1.1    mrg       }
   1272       1.1    mrg 
   1273       1.1    mrg       // Retrieving the result
   1274       1.1    mrg       future<_Res&>
   1275       1.1    mrg       get_future()
   1276       1.1    mrg       { return future<_Res&>(_M_future); }
   1277       1.1    mrg 
   1278       1.1    mrg       // Setting the result
   1279       1.1    mrg       void
   1280       1.1    mrg       set_value(_Res& __r)
   1281  1.1.1.15    mrg       { _M_state()._M_set_result(_State::__setter(this, __r)); }
   1282   1.1.1.6    mrg 
   1283   1.1.1.6    mrg       void
   1284   1.1.1.6    mrg       set_exception(exception_ptr __p)
   1285  1.1.1.15    mrg       { _M_state()._M_set_result(_State::__setter(__p, this)); }
   1286   1.1.1.6    mrg 
   1287   1.1.1.6    mrg       void
   1288   1.1.1.6    mrg       set_value_at_thread_exit(_Res& __r)
   1289       1.1    mrg       {
   1290  1.1.1.15    mrg 	_M_state()._M_set_delayed_result(_State::__setter(this, __r),
   1291   1.1.1.6    mrg 					 _M_future);
   1292       1.1    mrg       }
   1293       1.1    mrg 
   1294       1.1    mrg       void
   1295   1.1.1.6    mrg       set_exception_at_thread_exit(exception_ptr __p)
   1296       1.1    mrg       {
   1297  1.1.1.15    mrg 	_M_state()._M_set_delayed_result(_State::__setter(__p, this),
   1298   1.1.1.6    mrg 					 _M_future);
   1299       1.1    mrg       }
   1300  1.1.1.15    mrg 
   1301  1.1.1.15    mrg     private:
   1302  1.1.1.15    mrg       _State&
   1303  1.1.1.15    mrg       _M_state()
   1304  1.1.1.15    mrg       {
   1305  1.1.1.15    mrg 	__future_base::_State_base::_S_check(_M_future);
   1306  1.1.1.15    mrg 	return *_M_future;
   1307  1.1.1.15    mrg       }
   1308       1.1    mrg     };
   1309       1.1    mrg 
   1310       1.1    mrg   /// Explicit specialization for promise<void>
   1311       1.1    mrg   template<>
   1312       1.1    mrg     class promise<void>
   1313       1.1    mrg     {
   1314   1.1.1.2    mrg       typedef __future_base::_State_base	_State;
   1315       1.1    mrg       typedef __future_base::_Result<void>	_Res_type;
   1316   1.1.1.2    mrg       typedef __future_base::_Ptr<_Res_type> 	_Ptr_type;
   1317  1.1.1.16    mrg       template<typename, typename> friend struct _State::_Setter;
   1318   1.1.1.8    mrg       friend _State;
   1319       1.1    mrg 
   1320       1.1    mrg       shared_ptr<_State>                        _M_future;
   1321       1.1    mrg       _Ptr_type                                 _M_storage;
   1322       1.1    mrg 
   1323       1.1    mrg     public:
   1324       1.1    mrg       promise()
   1325       1.1    mrg       : _M_future(std::make_shared<_State>()),
   1326       1.1    mrg 	_M_storage(new _Res_type())
   1327       1.1    mrg       { }
   1328       1.1    mrg 
   1329   1.1.1.2    mrg       promise(promise&& __rhs) noexcept
   1330       1.1    mrg       : _M_future(std::move(__rhs._M_future)),
   1331       1.1    mrg 	_M_storage(std::move(__rhs._M_storage))
   1332       1.1    mrg       { }
   1333       1.1    mrg 
   1334       1.1    mrg       template<typename _Allocator>
   1335       1.1    mrg         promise(allocator_arg_t, const _Allocator& __a)
   1336       1.1    mrg         : _M_future(std::allocate_shared<_State>(__a)),
   1337   1.1.1.2    mrg 	  _M_storage(__future_base::_S_allocate_result<void>(__a))
   1338   1.1.1.2    mrg         { }
   1339   1.1.1.2    mrg 
   1340   1.1.1.2    mrg       // _GLIBCXX_RESOLVE_LIB_DEFECTS
   1341   1.1.1.2    mrg       // 2095.  missing constructors needed for uses-allocator construction
   1342   1.1.1.2    mrg       template<typename _Allocator>
   1343   1.1.1.2    mrg         promise(allocator_arg_t, const _Allocator&, promise&& __rhs)
   1344   1.1.1.2    mrg         : _M_future(std::move(__rhs._M_future)),
   1345   1.1.1.2    mrg 	  _M_storage(std::move(__rhs._M_storage))
   1346       1.1    mrg         { }
   1347       1.1    mrg 
   1348       1.1    mrg       promise(const promise&) = delete;
   1349       1.1    mrg 
   1350       1.1    mrg       ~promise()
   1351       1.1    mrg       {
   1352       1.1    mrg         if (static_cast<bool>(_M_future) && !_M_future.unique())
   1353       1.1    mrg           _M_future->_M_break_promise(std::move(_M_storage));
   1354       1.1    mrg       }
   1355       1.1    mrg 
   1356       1.1    mrg       // Assignment
   1357       1.1    mrg       promise&
   1358   1.1.1.2    mrg       operator=(promise&& __rhs) noexcept
   1359       1.1    mrg       {
   1360       1.1    mrg         promise(std::move(__rhs)).swap(*this);
   1361       1.1    mrg         return *this;
   1362       1.1    mrg       }
   1363       1.1    mrg 
   1364       1.1    mrg       promise& operator=(const promise&) = delete;
   1365       1.1    mrg 
   1366       1.1    mrg       void
   1367   1.1.1.2    mrg       swap(promise& __rhs) noexcept
   1368       1.1    mrg       {
   1369       1.1    mrg         _M_future.swap(__rhs._M_future);
   1370       1.1    mrg         _M_storage.swap(__rhs._M_storage);
   1371       1.1    mrg       }
   1372       1.1    mrg 
   1373       1.1    mrg       // Retrieving the result
   1374       1.1    mrg       future<void>
   1375       1.1    mrg       get_future()
   1376       1.1    mrg       { return future<void>(_M_future); }
   1377       1.1    mrg 
   1378       1.1    mrg       // Setting the result
   1379   1.1.1.8    mrg       void
   1380   1.1.1.8    mrg       set_value()
   1381  1.1.1.15    mrg       { _M_state()._M_set_result(_State::__setter(this)); }
   1382       1.1    mrg 
   1383       1.1    mrg       void
   1384       1.1    mrg       set_exception(exception_ptr __p)
   1385  1.1.1.15    mrg       { _M_state()._M_set_result(_State::__setter(__p, this)); }
   1386   1.1.1.6    mrg 
   1387   1.1.1.6    mrg       void
   1388   1.1.1.8    mrg       set_value_at_thread_exit()
   1389  1.1.1.15    mrg       { _M_state()._M_set_delayed_result(_State::__setter(this), _M_future); }
   1390   1.1.1.6    mrg 
   1391   1.1.1.6    mrg       void
   1392   1.1.1.6    mrg       set_exception_at_thread_exit(exception_ptr __p)
   1393       1.1    mrg       {
   1394  1.1.1.15    mrg 	_M_state()._M_set_delayed_result(_State::__setter(__p, this),
   1395   1.1.1.6    mrg 					 _M_future);
   1396       1.1    mrg       }
   1397  1.1.1.15    mrg 
   1398  1.1.1.15    mrg     private:
   1399  1.1.1.15    mrg       _State&
   1400  1.1.1.15    mrg       _M_state()
   1401  1.1.1.15    mrg       {
   1402  1.1.1.15    mrg 	__future_base::_State_base::_S_check(_M_future);
   1403  1.1.1.15    mrg 	return *_M_future;
   1404  1.1.1.15    mrg       }
   1405       1.1    mrg     };
   1406       1.1    mrg 
   1407  1.1.1.16    mrg   /// @cond undocumented
   1408   1.1.1.6    mrg   template<typename _Ptr_type, typename _Fn, typename _Res>
   1409       1.1    mrg     struct __future_base::_Task_setter
   1410       1.1    mrg     {
   1411   1.1.1.6    mrg       // Invoke the function and provide the result to the caller.
   1412   1.1.1.6    mrg       _Ptr_type operator()() const
   1413       1.1    mrg       {
   1414   1.1.1.2    mrg 	__try
   1415       1.1    mrg 	  {
   1416   1.1.1.6    mrg 	    (*_M_result)->_M_set((*_M_fn)());
   1417   1.1.1.6    mrg 	  }
   1418   1.1.1.6    mrg 	__catch(const __cxxabiv1::__forced_unwind&)
   1419   1.1.1.6    mrg 	  {
   1420   1.1.1.6    mrg 	    __throw_exception_again; // will cause broken_promise
   1421       1.1    mrg 	  }
   1422       1.1    mrg 	__catch(...)
   1423       1.1    mrg 	  {
   1424   1.1.1.6    mrg 	    (*_M_result)->_M_error = current_exception();
   1425       1.1    mrg 	  }
   1426   1.1.1.6    mrg 	return std::move(*_M_result);
   1427       1.1    mrg       }
   1428   1.1.1.6    mrg       _Ptr_type*	_M_result;
   1429   1.1.1.6    mrg       _Fn*		_M_fn;
   1430       1.1    mrg     };
   1431       1.1    mrg 
   1432   1.1.1.6    mrg   template<typename _Ptr_type, typename _Fn>
   1433   1.1.1.6    mrg     struct __future_base::_Task_setter<_Ptr_type, _Fn, void>
   1434       1.1    mrg     {
   1435   1.1.1.6    mrg       _Ptr_type operator()() const
   1436       1.1    mrg       {
   1437   1.1.1.2    mrg 	__try
   1438       1.1    mrg 	  {
   1439   1.1.1.6    mrg 	    (*_M_fn)();
   1440   1.1.1.6    mrg 	  }
   1441   1.1.1.6    mrg 	__catch(const __cxxabiv1::__forced_unwind&)
   1442   1.1.1.6    mrg 	  {
   1443   1.1.1.6    mrg 	    __throw_exception_again; // will cause broken_promise
   1444       1.1    mrg 	  }
   1445       1.1    mrg 	__catch(...)
   1446       1.1    mrg 	  {
   1447   1.1.1.6    mrg 	    (*_M_result)->_M_error = current_exception();
   1448       1.1    mrg 	  }
   1449   1.1.1.6    mrg 	return std::move(*_M_result);
   1450       1.1    mrg       }
   1451   1.1.1.6    mrg       _Ptr_type*	_M_result;
   1452   1.1.1.6    mrg       _Fn*		_M_fn;
   1453       1.1    mrg     };
   1454       1.1    mrg 
   1455   1.1.1.6    mrg   // Holds storage for a packaged_task's result.
   1456       1.1    mrg   template<typename _Res, typename... _Args>
   1457   1.1.1.2    mrg     struct __future_base::_Task_state_base<_Res(_Args...)>
   1458   1.1.1.2    mrg     : __future_base::_State_base
   1459       1.1    mrg     {
   1460       1.1    mrg       typedef _Res _Res_type;
   1461       1.1    mrg 
   1462   1.1.1.2    mrg       template<typename _Alloc>
   1463   1.1.1.2    mrg 	_Task_state_base(const _Alloc& __a)
   1464   1.1.1.2    mrg 	: _M_result(_S_allocate_result<_Res>(__a))
   1465   1.1.1.2    mrg 	{ }
   1466       1.1    mrg 
   1467   1.1.1.6    mrg       // Invoke the stored task and make the state ready.
   1468   1.1.1.2    mrg       virtual void
   1469   1.1.1.6    mrg       _M_run(_Args&&... __args) = 0;
   1470   1.1.1.6    mrg 
   1471   1.1.1.6    mrg       // Invoke the stored task and make the state ready at thread exit.
   1472   1.1.1.6    mrg       virtual void
   1473   1.1.1.6    mrg       _M_run_delayed(_Args&&... __args, weak_ptr<_State_base>) = 0;
   1474       1.1    mrg 
   1475   1.1.1.2    mrg       virtual shared_ptr<_Task_state_base>
   1476   1.1.1.2    mrg       _M_reset() = 0;
   1477   1.1.1.2    mrg 
   1478   1.1.1.2    mrg       typedef __future_base::_Ptr<_Result<_Res>> _Ptr_type;
   1479   1.1.1.2    mrg       _Ptr_type _M_result;
   1480   1.1.1.2    mrg     };
   1481   1.1.1.2    mrg 
   1482   1.1.1.6    mrg   // Holds a packaged_task's stored task.
   1483   1.1.1.2    mrg   template<typename _Fn, typename _Alloc, typename _Res, typename... _Args>
   1484   1.1.1.2    mrg     struct __future_base::_Task_state<_Fn, _Alloc, _Res(_Args...)> final
   1485   1.1.1.2    mrg     : __future_base::_Task_state_base<_Res(_Args...)>
   1486   1.1.1.2    mrg     {
   1487   1.1.1.3  skrll       template<typename _Fn2>
   1488   1.1.1.3  skrll 	_Task_state(_Fn2&& __fn, const _Alloc& __a)
   1489   1.1.1.3  skrll 	: _Task_state_base<_Res(_Args...)>(__a),
   1490   1.1.1.3  skrll 	  _M_impl(std::forward<_Fn2>(__fn), __a)
   1491   1.1.1.3  skrll 	{ }
   1492   1.1.1.2    mrg 
   1493   1.1.1.2    mrg     private:
   1494   1.1.1.2    mrg       virtual void
   1495   1.1.1.6    mrg       _M_run(_Args&&... __args)
   1496       1.1    mrg       {
   1497  1.1.1.14    mrg 	auto __boundfn = [&] () -> _Res {
   1498  1.1.1.14    mrg 	    return std::__invoke_r<_Res>(_M_impl._M_fn,
   1499  1.1.1.14    mrg 					 std::forward<_Args>(__args)...);
   1500   1.1.1.9    mrg 	};
   1501   1.1.1.6    mrg 	this->_M_set_result(_S_task_setter(this->_M_result, __boundfn));
   1502   1.1.1.6    mrg       }
   1503   1.1.1.6    mrg 
   1504   1.1.1.6    mrg       virtual void
   1505   1.1.1.6    mrg       _M_run_delayed(_Args&&... __args, weak_ptr<_State_base> __self)
   1506   1.1.1.6    mrg       {
   1507  1.1.1.14    mrg 	auto __boundfn = [&] () -> _Res {
   1508  1.1.1.14    mrg 	    return std::__invoke_r<_Res>(_M_impl._M_fn,
   1509  1.1.1.14    mrg 					 std::forward<_Args>(__args)...);
   1510   1.1.1.9    mrg 	};
   1511   1.1.1.6    mrg 	this->_M_set_delayed_result(_S_task_setter(this->_M_result, __boundfn),
   1512   1.1.1.6    mrg 				    std::move(__self));
   1513       1.1    mrg       }
   1514       1.1    mrg 
   1515   1.1.1.2    mrg       virtual shared_ptr<_Task_state_base<_Res(_Args...)>>
   1516   1.1.1.2    mrg       _M_reset();
   1517       1.1    mrg 
   1518   1.1.1.2    mrg       struct _Impl : _Alloc
   1519   1.1.1.2    mrg       {
   1520   1.1.1.3  skrll 	template<typename _Fn2>
   1521   1.1.1.3  skrll 	  _Impl(_Fn2&& __fn, const _Alloc& __a)
   1522   1.1.1.3  skrll 	  : _Alloc(__a), _M_fn(std::forward<_Fn2>(__fn)) { }
   1523   1.1.1.2    mrg 	_Fn _M_fn;
   1524   1.1.1.2    mrg       } _M_impl;
   1525       1.1    mrg     };
   1526       1.1    mrg 
   1527  1.1.1.14    mrg   template<typename _Signature, typename _Fn,
   1528  1.1.1.14    mrg 	   typename _Alloc = std::allocator<int>>
   1529   1.1.1.3  skrll     static shared_ptr<__future_base::_Task_state_base<_Signature>>
   1530  1.1.1.14    mrg     __create_task_state(_Fn&& __fn, const _Alloc& __a = _Alloc())
   1531   1.1.1.3  skrll     {
   1532   1.1.1.3  skrll       typedef typename decay<_Fn>::type _Fn2;
   1533   1.1.1.3  skrll       typedef __future_base::_Task_state<_Fn2, _Alloc, _Signature> _State;
   1534   1.1.1.3  skrll       return std::allocate_shared<_State>(__a, std::forward<_Fn>(__fn), __a);
   1535   1.1.1.3  skrll     }
   1536   1.1.1.2    mrg 
   1537   1.1.1.2    mrg   template<typename _Fn, typename _Alloc, typename _Res, typename... _Args>
   1538   1.1.1.2    mrg     shared_ptr<__future_base::_Task_state_base<_Res(_Args...)>>
   1539   1.1.1.2    mrg     __future_base::_Task_state<_Fn, _Alloc, _Res(_Args...)>::_M_reset()
   1540   1.1.1.2    mrg     {
   1541   1.1.1.2    mrg       return __create_task_state<_Res(_Args...)>(std::move(_M_impl._M_fn),
   1542   1.1.1.2    mrg 						 static_cast<_Alloc&>(_M_impl));
   1543   1.1.1.2    mrg     }
   1544  1.1.1.16    mrg   /// @endcond
   1545   1.1.1.2    mrg 
   1546       1.1    mrg   /// packaged_task
   1547       1.1    mrg   template<typename _Res, typename... _ArgTypes>
   1548       1.1    mrg     class packaged_task<_Res(_ArgTypes...)>
   1549       1.1    mrg     {
   1550   1.1.1.2    mrg       typedef __future_base::_Task_state_base<_Res(_ArgTypes...)> _State_type;
   1551       1.1    mrg       shared_ptr<_State_type>                   _M_state;
   1552       1.1    mrg 
   1553  1.1.1.13    mrg       // _GLIBCXX_RESOLVE_LIB_DEFECTS
   1554  1.1.1.13    mrg       // 3039. Unnecessary decay in thread and packaged_task
   1555  1.1.1.13    mrg       template<typename _Fn, typename _Fn2 = __remove_cvref_t<_Fn>>
   1556  1.1.1.13    mrg 	using __not_same
   1557  1.1.1.13    mrg 	  = typename enable_if<!is_same<packaged_task, _Fn2>::value>::type;
   1558  1.1.1.13    mrg 
   1559       1.1    mrg     public:
   1560       1.1    mrg       // Construction and destruction
   1561   1.1.1.2    mrg       packaged_task() noexcept { }
   1562       1.1    mrg 
   1563  1.1.1.13    mrg       template<typename _Fn, typename = __not_same<_Fn>>
   1564   1.1.1.2    mrg 	explicit
   1565   1.1.1.2    mrg 	packaged_task(_Fn&& __fn)
   1566  1.1.1.14    mrg 	: _M_state(
   1567  1.1.1.14    mrg 	    __create_task_state<_Res(_ArgTypes...)>(std::forward<_Fn>(__fn)))
   1568  1.1.1.18    mrg 	{
   1569  1.1.1.18    mrg #ifdef __cpp_lib_is_invocable // C++ >= 17
   1570  1.1.1.18    mrg 	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
   1571  1.1.1.18    mrg 	  // 4154. The Mandates for std::packaged_task's constructor
   1572  1.1.1.18    mrg 	  // from a callable entity should consider decaying
   1573  1.1.1.18    mrg 	  static_assert(is_invocable_r_v<_Res, decay_t<_Fn>&, _ArgTypes...>);
   1574  1.1.1.18    mrg #endif
   1575  1.1.1.18    mrg 	}
   1576   1.1.1.2    mrg 
   1577  1.1.1.14    mrg #if __cplusplus < 201703L
   1578   1.1.1.2    mrg       // _GLIBCXX_RESOLVE_LIB_DEFECTS
   1579  1.1.1.14    mrg       // 2097. packaged_task constructors should be constrained
   1580   1.1.1.7    mrg       // 2407. [this constructor should not be] explicit
   1581  1.1.1.14    mrg       // 2921. packaged_task and type-erased allocators
   1582  1.1.1.13    mrg       template<typename _Fn, typename _Alloc, typename = __not_same<_Fn>>
   1583   1.1.1.2    mrg 	packaged_task(allocator_arg_t, const _Alloc& __a, _Fn&& __fn)
   1584   1.1.1.2    mrg 	: _M_state(__create_task_state<_Res(_ArgTypes...)>(
   1585  1.1.1.13    mrg 		   std::forward<_Fn>(__fn), __a))
   1586   1.1.1.2    mrg 	{ }
   1587       1.1    mrg 
   1588  1.1.1.14    mrg       // _GLIBCXX_RESOLVE_LIB_DEFECTS
   1589  1.1.1.14    mrg       // 2095.  missing constructors needed for uses-allocator construction
   1590  1.1.1.14    mrg       template<typename _Allocator>
   1591  1.1.1.18    mrg 	packaged_task(allocator_arg_t, const _Allocator&) noexcept
   1592  1.1.1.14    mrg 	{ }
   1593  1.1.1.14    mrg 
   1594  1.1.1.14    mrg       template<typename _Allocator>
   1595  1.1.1.14    mrg 	packaged_task(allocator_arg_t, const _Allocator&,
   1596  1.1.1.14    mrg 		      const packaged_task&) = delete;
   1597  1.1.1.14    mrg 
   1598  1.1.1.14    mrg       template<typename _Allocator>
   1599  1.1.1.14    mrg 	packaged_task(allocator_arg_t, const _Allocator&,
   1600  1.1.1.14    mrg 		      packaged_task&& __other) noexcept
   1601  1.1.1.14    mrg 	{ this->swap(__other); }
   1602  1.1.1.14    mrg #endif
   1603  1.1.1.14    mrg 
   1604       1.1    mrg       ~packaged_task()
   1605       1.1    mrg       {
   1606       1.1    mrg         if (static_cast<bool>(_M_state) && !_M_state.unique())
   1607   1.1.1.2    mrg 	  _M_state->_M_break_promise(std::move(_M_state->_M_result));
   1608       1.1    mrg       }
   1609       1.1    mrg 
   1610       1.1    mrg       // No copy
   1611   1.1.1.2    mrg       packaged_task(const packaged_task&) = delete;
   1612   1.1.1.2    mrg       packaged_task& operator=(const packaged_task&) = delete;
   1613   1.1.1.2    mrg 
   1614       1.1    mrg       // Move support
   1615   1.1.1.2    mrg       packaged_task(packaged_task&& __other) noexcept
   1616       1.1    mrg       { this->swap(__other); }
   1617       1.1    mrg 
   1618   1.1.1.2    mrg       packaged_task& operator=(packaged_task&& __other) noexcept
   1619       1.1    mrg       {
   1620   1.1.1.2    mrg 	packaged_task(std::move(__other)).swap(*this);
   1621   1.1.1.2    mrg 	return *this;
   1622       1.1    mrg       }
   1623       1.1    mrg 
   1624       1.1    mrg       void
   1625   1.1.1.2    mrg       swap(packaged_task& __other) noexcept
   1626       1.1    mrg       { _M_state.swap(__other._M_state); }
   1627       1.1    mrg 
   1628   1.1.1.2    mrg       bool
   1629   1.1.1.2    mrg       valid() const noexcept
   1630   1.1.1.2    mrg       { return static_cast<bool>(_M_state); }
   1631       1.1    mrg 
   1632       1.1    mrg       // Result retrieval
   1633       1.1    mrg       future<_Res>
   1634       1.1    mrg       get_future()
   1635       1.1    mrg       { return future<_Res>(_M_state); }
   1636       1.1    mrg 
   1637       1.1    mrg       // Execution
   1638       1.1    mrg       void
   1639       1.1    mrg       operator()(_ArgTypes... __args)
   1640       1.1    mrg       {
   1641   1.1.1.2    mrg 	__future_base::_State_base::_S_check(_M_state);
   1642   1.1.1.6    mrg 	_M_state->_M_run(std::forward<_ArgTypes>(__args)...);
   1643   1.1.1.6    mrg       }
   1644   1.1.1.6    mrg 
   1645   1.1.1.6    mrg       void
   1646   1.1.1.6    mrg       make_ready_at_thread_exit(_ArgTypes... __args)
   1647   1.1.1.6    mrg       {
   1648   1.1.1.6    mrg 	__future_base::_State_base::_S_check(_M_state);
   1649   1.1.1.6    mrg 	_M_state->_M_run_delayed(std::forward<_ArgTypes>(__args)..., _M_state);
   1650       1.1    mrg       }
   1651       1.1    mrg 
   1652       1.1    mrg       void
   1653       1.1    mrg       reset()
   1654       1.1    mrg       {
   1655   1.1.1.2    mrg 	__future_base::_State_base::_S_check(_M_state);
   1656   1.1.1.2    mrg 	packaged_task __tmp;
   1657   1.1.1.2    mrg 	__tmp._M_state = _M_state;
   1658   1.1.1.2    mrg 	_M_state = _M_state->_M_reset();
   1659       1.1    mrg       }
   1660       1.1    mrg     };
   1661       1.1    mrg 
   1662  1.1.1.16    mrg   // _GLIBCXX_RESOLVE_LIB_DEFECTS
   1663  1.1.1.16    mrg   // 3117. Missing packaged_task deduction guides
   1664  1.1.1.16    mrg #if __cpp_deduction_guides >= 201606
   1665  1.1.1.16    mrg   template<typename _Res, typename... _ArgTypes>
   1666  1.1.1.16    mrg     packaged_task(_Res(*)(_ArgTypes...)) -> packaged_task<_Res(_ArgTypes...)>;
   1667  1.1.1.16    mrg 
   1668  1.1.1.18    mrg   template<typename _Fun, typename _Signature
   1669  1.1.1.18    mrg 	     = __function_guide_t<_Fun, decltype(&_Fun::operator())>>
   1670  1.1.1.16    mrg     packaged_task(_Fun) -> packaged_task<_Signature>;
   1671  1.1.1.16    mrg #endif
   1672  1.1.1.16    mrg 
   1673   1.1.1.2    mrg   /// swap
   1674       1.1    mrg   template<typename _Res, typename... _ArgTypes>
   1675       1.1    mrg     inline void
   1676       1.1    mrg     swap(packaged_task<_Res(_ArgTypes...)>& __x,
   1677   1.1.1.2    mrg 	 packaged_task<_Res(_ArgTypes...)>& __y) noexcept
   1678       1.1    mrg     { __x.swap(__y); }
   1679   1.1.1.2    mrg 
   1680  1.1.1.14    mrg #if __cplusplus < 201703L
   1681  1.1.1.14    mrg   // _GLIBCXX_RESOLVE_LIB_DEFECTS
   1682  1.1.1.14    mrg   // 2976. Dangling uses_allocator specialization for packaged_task
   1683   1.1.1.2    mrg   template<typename _Res, typename _Alloc>
   1684   1.1.1.2    mrg     struct uses_allocator<packaged_task<_Res>, _Alloc>
   1685   1.1.1.2    mrg     : public true_type { };
   1686  1.1.1.14    mrg #endif
   1687   1.1.1.2    mrg 
   1688  1.1.1.16    mrg   /// @cond undocumented
   1689  1.1.1.16    mrg 
   1690   1.1.1.6    mrg   // Shared state created by std::async().
   1691   1.1.1.6    mrg   // Holds a deferred function and storage for its result.
   1692   1.1.1.2    mrg   template<typename _BoundFn, typename _Res>
   1693   1.1.1.2    mrg     class __future_base::_Deferred_state final
   1694   1.1.1.2    mrg     : public __future_base::_State_base
   1695       1.1    mrg     {
   1696       1.1    mrg     public:
   1697  1.1.1.16    mrg       template<typename... _Args>
   1698  1.1.1.16    mrg 	explicit
   1699  1.1.1.16    mrg 	_Deferred_state(_Args&&... __args)
   1700  1.1.1.16    mrg 	: _M_result(new _Result<_Res>()),
   1701  1.1.1.16    mrg 	  _M_fn(std::forward<_Args>(__args)...)
   1702  1.1.1.16    mrg 	{ }
   1703       1.1    mrg 
   1704       1.1    mrg     private:
   1705   1.1.1.2    mrg       typedef __future_base::_Ptr<_Result<_Res>> _Ptr_type;
   1706       1.1    mrg       _Ptr_type _M_result;
   1707   1.1.1.2    mrg       _BoundFn _M_fn;
   1708       1.1    mrg 
   1709   1.1.1.6    mrg       // Run the deferred function.
   1710       1.1    mrg       virtual void
   1711   1.1.1.6    mrg       _M_complete_async()
   1712       1.1    mrg       {
   1713   1.1.1.6    mrg 	// Multiple threads can call a waiting function on the future and
   1714   1.1.1.6    mrg 	// reach this point at the same time. The call_once in _M_set_result
   1715   1.1.1.6    mrg 	// ensures only the first one run the deferred function, stores the
   1716   1.1.1.6    mrg 	// result in _M_result, swaps that with the base _M_result and makes
   1717   1.1.1.6    mrg 	// the state ready. Tell _M_set_result to ignore failure so all later
   1718   1.1.1.6    mrg 	// calls do nothing.
   1719   1.1.1.2    mrg         _M_set_result(_S_task_setter(_M_result, _M_fn), true);
   1720       1.1    mrg       }
   1721   1.1.1.6    mrg 
   1722   1.1.1.6    mrg       // Caller should check whether the state is ready first, because this
   1723   1.1.1.6    mrg       // function will return true even after the deferred function has run.
   1724   1.1.1.6    mrg       virtual bool _M_is_deferred_future() const { return true; }
   1725       1.1    mrg     };
   1726       1.1    mrg 
   1727   1.1.1.6    mrg   // Common functionality hoisted out of the _Async_state_impl template.
   1728   1.1.1.6    mrg   class __future_base::_Async_state_commonV2
   1729   1.1.1.6    mrg     : public __future_base::_State_base
   1730   1.1.1.2    mrg   {
   1731   1.1.1.2    mrg   protected:
   1732   1.1.1.6    mrg     ~_Async_state_commonV2() = default;
   1733       1.1    mrg 
   1734   1.1.1.6    mrg     // Make waiting functions block until the thread completes, as if joined.
   1735   1.1.1.6    mrg     //
   1736   1.1.1.6    mrg     // This function is used by wait() to satisfy the first requirement below
   1737   1.1.1.6    mrg     // and by wait_for() / wait_until() to satisfy the second.
   1738   1.1.1.6    mrg     //
   1739   1.1.1.6    mrg     // [futures.async]:
   1740   1.1.1.6    mrg     //
   1741  1.1.1.13    mrg     // - a call to a waiting function on an asynchronous return object that
   1742   1.1.1.6    mrg     // shares the shared state created by this async call shall block until
   1743   1.1.1.6    mrg     // the associated thread has completed, as if joined, or else time out.
   1744   1.1.1.6    mrg     //
   1745  1.1.1.13    mrg     // - the associated thread completion synchronizes with the return from
   1746   1.1.1.6    mrg     // the first function that successfully detects the ready status of the
   1747   1.1.1.6    mrg     // shared state or with the return from the last function that releases
   1748   1.1.1.6    mrg     // the shared state, whichever happens first.
   1749   1.1.1.6    mrg     virtual void _M_complete_async() { _M_join(); }
   1750       1.1    mrg 
   1751   1.1.1.7    mrg     void _M_join() { std::call_once(_M_once, &thread::join, &_M_thread); }
   1752       1.1    mrg 
   1753   1.1.1.2    mrg     thread _M_thread;
   1754   1.1.1.2    mrg     once_flag _M_once;
   1755   1.1.1.2    mrg   };
   1756   1.1.1.2    mrg 
   1757   1.1.1.6    mrg   // Shared state created by std::async().
   1758   1.1.1.6    mrg   // Starts a new thread that runs a function and makes the shared state ready.
   1759   1.1.1.2    mrg   template<typename _BoundFn, typename _Res>
   1760   1.1.1.2    mrg     class __future_base::_Async_state_impl final
   1761   1.1.1.6    mrg     : public __future_base::_Async_state_commonV2
   1762   1.1.1.2    mrg     {
   1763   1.1.1.2    mrg     public:
   1764  1.1.1.16    mrg       template<typename... _Args>
   1765  1.1.1.16    mrg 	explicit
   1766  1.1.1.16    mrg 	_Async_state_impl(_Args&&... __args)
   1767  1.1.1.16    mrg 	: _M_result(new _Result<_Res>()),
   1768  1.1.1.16    mrg 	  _M_fn(std::forward<_Args>(__args)...)
   1769  1.1.1.16    mrg 	{
   1770  1.1.1.16    mrg 	  _M_thread = std::thread{&_Async_state_impl::_M_run, this};
   1771  1.1.1.16    mrg 	}
   1772       1.1    mrg 
   1773   1.1.1.6    mrg       // Must not destroy _M_result and _M_fn until the thread finishes.
   1774   1.1.1.6    mrg       // Call join() directly rather than through _M_join() because no other
   1775   1.1.1.6    mrg       // thread can be referring to this state if it is being destroyed.
   1776  1.1.1.16    mrg       ~_Async_state_impl()
   1777  1.1.1.16    mrg       {
   1778  1.1.1.16    mrg 	if (_M_thread.joinable())
   1779  1.1.1.16    mrg 	  _M_thread.join();
   1780  1.1.1.16    mrg       }
   1781   1.1.1.2    mrg 
   1782   1.1.1.2    mrg     private:
   1783  1.1.1.16    mrg       void
   1784  1.1.1.16    mrg       _M_run()
   1785  1.1.1.16    mrg       {
   1786  1.1.1.16    mrg 	__try
   1787  1.1.1.16    mrg 	  {
   1788  1.1.1.16    mrg 	    _M_set_result(_S_task_setter(_M_result, _M_fn));
   1789  1.1.1.16    mrg 	  }
   1790  1.1.1.16    mrg 	__catch (const __cxxabiv1::__forced_unwind&)
   1791  1.1.1.16    mrg 	  {
   1792  1.1.1.16    mrg 	    // make the shared state ready on thread cancellation
   1793  1.1.1.16    mrg 	    if (static_cast<bool>(_M_result))
   1794  1.1.1.16    mrg 	      this->_M_break_promise(std::move(_M_result));
   1795  1.1.1.16    mrg 	    __throw_exception_again;
   1796  1.1.1.16    mrg 	  }
   1797  1.1.1.16    mrg       }
   1798  1.1.1.16    mrg 
   1799   1.1.1.2    mrg       typedef __future_base::_Ptr<_Result<_Res>> _Ptr_type;
   1800       1.1    mrg       _Ptr_type _M_result;
   1801   1.1.1.2    mrg       _BoundFn _M_fn;
   1802       1.1    mrg     };
   1803  1.1.1.16    mrg   /// @endcond
   1804   1.1.1.2    mrg 
   1805   1.1.1.2    mrg   /// async
   1806       1.1    mrg   template<typename _Fn, typename... _Args>
   1807  1.1.1.13    mrg     _GLIBCXX_NODISCARD future<__async_result_of<_Fn, _Args...>>
   1808       1.1    mrg     async(launch __policy, _Fn&& __fn, _Args&&... __args)
   1809       1.1    mrg     {
   1810  1.1.1.16    mrg       using _Wr = std::thread::_Call_wrapper<_Fn, _Args...>;
   1811  1.1.1.16    mrg       using _As = __future_base::_Async_state_impl<_Wr>;
   1812  1.1.1.16    mrg       using _Ds = __future_base::_Deferred_state<_Wr>;
   1813  1.1.1.16    mrg 
   1814   1.1.1.2    mrg       std::shared_ptr<__future_base::_State_base> __state;
   1815   1.1.1.7    mrg       if ((__policy & launch::async) == launch::async)
   1816       1.1    mrg 	{
   1817   1.1.1.7    mrg 	  __try
   1818   1.1.1.7    mrg 	    {
   1819  1.1.1.16    mrg 	      __state = std::make_shared<_As>(std::forward<_Fn>(__fn),
   1820  1.1.1.16    mrg 					      std::forward<_Args>(__args)...);
   1821   1.1.1.7    mrg 	    }
   1822   1.1.1.7    mrg #if __cpp_exceptions
   1823   1.1.1.7    mrg 	  catch(const system_error& __e)
   1824   1.1.1.7    mrg 	    {
   1825   1.1.1.7    mrg 	      if (__e.code() != errc::resource_unavailable_try_again
   1826   1.1.1.7    mrg 		  || (__policy & launch::deferred) != launch::deferred)
   1827   1.1.1.7    mrg 		throw;
   1828   1.1.1.7    mrg 	    }
   1829   1.1.1.7    mrg #endif
   1830       1.1    mrg 	}
   1831   1.1.1.7    mrg       if (!__state)
   1832       1.1    mrg 	{
   1833  1.1.1.16    mrg 	  __state = std::make_shared<_Ds>(std::forward<_Fn>(__fn),
   1834  1.1.1.16    mrg 					  std::forward<_Args>(__args)...);
   1835       1.1    mrg 	}
   1836  1.1.1.16    mrg       return future<__async_result_of<_Fn, _Args...>>(std::move(__state));
   1837       1.1    mrg     }
   1838       1.1    mrg 
   1839   1.1.1.2    mrg   /// async, potential overload
   1840       1.1    mrg   template<typename _Fn, typename... _Args>
   1841  1.1.1.13    mrg     _GLIBCXX_NODISCARD inline future<__async_result_of<_Fn, _Args...>>
   1842       1.1    mrg     async(_Fn&& __fn, _Args&&... __args)
   1843       1.1    mrg     {
   1844   1.1.1.7    mrg       return std::async(launch::async|launch::deferred,
   1845   1.1.1.7    mrg 			std::forward<_Fn>(__fn),
   1846   1.1.1.7    mrg 			std::forward<_Args>(__args)...);
   1847       1.1    mrg     }
   1848       1.1    mrg 
   1849   1.1.1.6    mrg #endif // _GLIBCXX_ASYNC_ABI_COMPAT
   1850  1.1.1.13    mrg #endif // _GLIBCXX_HAS_GTHREADS
   1851       1.1    mrg 
   1852  1.1.1.15    mrg   /// @} group futures
   1853   1.1.1.2    mrg _GLIBCXX_END_NAMESPACE_VERSION
   1854   1.1.1.2    mrg } // namespace
   1855       1.1    mrg 
   1856   1.1.1.2    mrg #endif // C++11
   1857       1.1    mrg 
   1858       1.1    mrg #endif // _GLIBCXX_FUTURE
   1859