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