Home | History | Annotate | Download | only in include
      1 // <future> -*- C++ -*-
      2 
      3 // Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
      4 //
      5 // This file is part of the GNU ISO C++ Library.  This library is free
      6 // software; you can redistribute it and/or modify it under the
      7 // terms of the GNU General Public License as published by the
      8 // Free Software Foundation; either version 3, or (at your option)
      9 // any later version.
     10 
     11 // This library is distributed in the hope that it will be useful,
     12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14 // GNU General Public License for more details.
     15 
     16 // Under Section 7 of GPL version 3, you are granted additional
     17 // permissions described in the GCC Runtime Library Exception, version
     18 // 3.1, as published by the Free Software Foundation.
     19 
     20 // You should have received a copy of the GNU General Public License and
     21 // a copy of the GCC Runtime Library Exception along with this program;
     22 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     23 // <http://www.gnu.org/licenses/>.
     24 
     25 /** @file include/future
     26  *  This is a Standard C++ Library header.
     27  */
     28 
     29 #ifndef _GLIBCXX_FUTURE
     30 #define _GLIBCXX_FUTURE 1
     31 
     32 #pragma GCC system_header
     33 
     34 #ifndef __GXX_EXPERIMENTAL_CXX0X__
     35 # include <bits/c++0x_warning.h>
     36 #else
     37 
     38 #include <functional>
     39 #include <memory>
     40 #include <mutex>
     41 #include <thread>
     42 #include <condition_variable>
     43 #include <system_error>
     44 #include <exception>
     45 #include <atomic>
     46 #include <bits/functexcept.h>
     47 
     48 namespace std _GLIBCXX_VISIBILITY(default)
     49 {
     50 _GLIBCXX_BEGIN_NAMESPACE_VERSION
     51 
     52   /**
     53    * @defgroup futures Futures
     54    * @ingroup concurrency
     55    *
     56    * Classes for futures support.
     57    * @{
     58    */
     59 
     60   /// Error code for futures
     61   enum class future_errc
     62   {
     63     future_already_retrieved = 1,
     64     promise_already_satisfied,
     65     no_state,
     66     broken_promise
     67   };
     68 
     69   /// Specialization.
     70   template<>
     71     struct is_error_code_enum<future_errc> : public true_type { };
     72 
     73   /// Points to a statically-allocated object derived from error_category.
     74   const error_category&
     75   future_category() noexcept;
     76 
     77   /// Overload for make_error_code.
     78   inline error_code
     79   make_error_code(future_errc __errc) noexcept
     80   { return error_code(static_cast<int>(__errc), future_category()); }
     81 
     82   /// Overload for make_error_condition.
     83   inline error_condition
     84   make_error_condition(future_errc __errc) noexcept
     85   { return error_condition(static_cast<int>(__errc), future_category()); }
     86 
     87   /**
     88    *  @brief Exception type thrown by futures.
     89    *  @ingroup exceptions
     90    */
     91   class future_error : public logic_error
     92   {
     93     error_code 			_M_code;
     94 
     95   public:
     96     explicit future_error(error_code __ec)
     97     : logic_error("std::future_error"), _M_code(__ec)
     98     { }
     99 
    100     virtual ~future_error() noexcept;
    101 
    102     virtual const char*
    103     what() const noexcept;
    104 
    105     const error_code&
    106     code() const noexcept { return _M_code; }
    107   };
    108 
    109   // Forward declarations.
    110   template<typename _Res>
    111     class future;
    112 
    113   template<typename _Res>
    114     class shared_future;
    115 
    116   template<typename _Res>
    117     class atomic_future;
    118 
    119   template<typename _Signature>
    120     class packaged_task;
    121 
    122   template<typename _Res>
    123     class promise;
    124 
    125   /// Launch code for futures
    126   enum class launch
    127   {
    128     async = 1,
    129     deferred = 2
    130   };
    131 
    132   constexpr launch operator&(launch __x, launch __y)
    133   {
    134     return static_cast<launch>(
    135 	static_cast<int>(__x) & static_cast<int>(__y));
    136   }
    137 
    138   constexpr launch operator|(launch __x, launch __y)
    139   {
    140     return static_cast<launch>(
    141 	static_cast<int>(__x) | static_cast<int>(__y));
    142   }
    143 
    144   constexpr launch operator^(launch __x, launch __y)
    145   {
    146     return static_cast<launch>(
    147 	static_cast<int>(__x) ^ static_cast<int>(__y));
    148   }
    149 
    150   constexpr launch operator~(launch __x)
    151   { return static_cast<launch>(~static_cast<int>(__x)); }
    152 
    153   inline launch& operator&=(launch& __x, launch __y)
    154   { return __x = __x & __y; }
    155 
    156   inline launch& operator|=(launch& __x, launch __y)
    157   { return __x = __x | __y; }
    158 
    159   inline launch& operator^=(launch& __x, launch __y)
    160   { return __x = __x ^ __y; }
    161 
    162   /// Status code for futures
    163   enum class future_status
    164   {
    165     ready,
    166     timeout,
    167     deferred
    168   };
    169 
    170   template<typename _Fn, typename... _Args>
    171     future<typename result_of<_Fn(_Args...)>::type>
    172     async(launch __policy, _Fn&& __fn, _Args&&... __args);
    173 
    174   template<typename _FnCheck, typename _Fn, typename... _Args>
    175     struct __async_sfinae_helper
    176     {
    177       typedef future<typename result_of<_Fn(_Args...)>::type> type;
    178     };
    179 
    180   template<typename _Fn, typename... _Args>
    181     struct __async_sfinae_helper<launch, _Fn, _Args...>
    182     { };
    183 
    184   template<typename _Fn, typename... _Args>
    185     typename
    186     __async_sfinae_helper<typename decay<_Fn>::type, _Fn, _Args...>::type
    187     async(_Fn&& __fn, _Args&&... __args);
    188 
    189 #if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1) \
    190   && (ATOMIC_INT_LOCK_FREE > 1)
    191 
    192   /// Base class and enclosing scope.
    193   struct __future_base
    194   {
    195     /// Base class for results.
    196     struct _Result_base
    197     {
    198       exception_ptr		_M_error;
    199 
    200       _Result_base(const _Result_base&) = delete;
    201       _Result_base& operator=(const _Result_base&) = delete;
    202 
    203       // _M_destroy() allows derived classes to control deallocation
    204       virtual void _M_destroy() = 0;
    205 
    206       struct _Deleter
    207       {
    208 	void operator()(_Result_base* __fr) const { __fr->_M_destroy(); }
    209       };
    210 
    211     protected:
    212       _Result_base();
    213       virtual ~_Result_base();
    214     };
    215 
    216     /// Result.
    217     template<typename _Res>
    218       struct _Result : _Result_base
    219       {
    220       private:
    221 	typedef alignment_of<_Res>				__a_of;
    222 	typedef aligned_storage<sizeof(_Res), __a_of::value>	__align_storage;
    223 	typedef typename __align_storage::type			__align_type;
    224 
    225 	__align_type		_M_storage;
    226 	bool 			_M_initialized;
    227 
    228       public:
    229 	_Result() noexcept : _M_initialized() { }
    230 	
    231 	~_Result()
    232 	{
    233 	  if (_M_initialized)
    234 	    _M_value().~_Res();
    235 	}
    236 
    237 	// Return lvalue, future will add const or rvalue-reference
    238 	_Res&
    239 	_M_value() noexcept { return *static_cast<_Res*>(_M_addr()); }
    240 
    241 	void
    242 	_M_set(const _Res& __res)
    243 	{
    244 	  ::new (_M_addr()) _Res(__res);
    245 	  _M_initialized = true;
    246 	}
    247 
    248 	void
    249 	_M_set(_Res&& __res)
    250 	{
    251 	  ::new (_M_addr()) _Res(std::move(__res));
    252 	  _M_initialized = true;
    253 	}
    254 
    255       private:
    256 	void _M_destroy() { delete this; }
    257 
    258 	void* _M_addr() noexcept { return static_cast<void*>(&_M_storage); }
    259     };
    260 
    261     /// A unique_ptr based on the instantiating type.
    262     template<typename _Res>
    263       using _Ptr = unique_ptr<_Res, _Result_base::_Deleter>;
    264 
    265     /// Result_alloc.
    266     template<typename _Res, typename _Alloc>
    267       struct _Result_alloc final : _Result<_Res>, _Alloc
    268       {
    269         typedef typename allocator_traits<_Alloc>::template
    270           rebind_alloc<_Result_alloc> __allocator_type;
    271 
    272         explicit
    273 	_Result_alloc(const _Alloc& __a) : _Result<_Res>(), _Alloc(__a)
    274         { }
    275 	
    276       private:
    277 	void _M_destroy()
    278         {
    279 	  typedef allocator_traits<__allocator_type> __traits;
    280           __allocator_type __a(*this);
    281 	  __traits::destroy(__a, this);
    282 	  __traits::deallocate(__a, this, 1);
    283         }
    284       };
    285 
    286     template<typename _Res, typename _Allocator>
    287       static _Ptr<_Result_alloc<_Res, _Allocator>>
    288       _S_allocate_result(const _Allocator& __a)
    289       {
    290         typedef _Result_alloc<_Res, _Allocator>	__result_type;
    291 	typedef allocator_traits<typename __result_type::__allocator_type>
    292 	  __traits;
    293         typename __traits::allocator_type __a2(__a);
    294         __result_type* __p = __traits::allocate(__a2, 1);
    295         __try
    296 	{
    297 	  __traits::construct(__a2, __p, __a);
    298         }
    299         __catch(...)
    300         {
    301 	  __traits::deallocate(__a2, __p, 1);
    302           __throw_exception_again;
    303         }
    304         return _Ptr<__result_type>(__p);
    305       }
    306 
    307 
    308     /// Base class for state between a promise and one or more
    309     /// associated futures.
    310     class _State_base
    311     {
    312       typedef _Ptr<_Result_base> _Ptr_type;
    313 
    314       _Ptr_type			_M_result;
    315       mutex               	_M_mutex;
    316       condition_variable  	_M_cond;
    317       atomic_flag         	_M_retrieved;
    318       once_flag			_M_once;
    319 
    320     public:
    321       _State_base() noexcept : _M_result(), _M_retrieved(ATOMIC_FLAG_INIT) { }
    322       _State_base(const _State_base&) = delete;
    323       _State_base& operator=(const _State_base&) = delete;
    324       virtual ~_State_base();
    325 
    326       _Result_base&
    327       wait()
    328       {
    329 	_M_run_deferred();
    330 	unique_lock<mutex> __lock(_M_mutex);
    331 	_M_cond.wait(__lock, [&] { return _M_ready(); });
    332 	return *_M_result;
    333       }
    334 
    335       template<typename _Rep, typename _Period>
    336         future_status
    337         wait_for(const chrono::duration<_Rep, _Period>& __rel)
    338         {
    339 	  unique_lock<mutex> __lock(_M_mutex);
    340 	  if (_M_cond.wait_for(__lock, __rel, [&] { return _M_ready(); }))
    341 	    return future_status::ready;
    342 	  return future_status::timeout;
    343 	}
    344 
    345       template<typename _Clock, typename _Duration>
    346         future_status
    347         wait_until(const chrono::time_point<_Clock, _Duration>& __abs)
    348         {
    349 	  unique_lock<mutex> __lock(_M_mutex);
    350 	  if (_M_cond.wait_until(__lock, __abs, [&] { return _M_ready(); }))
    351 	    return future_status::ready;
    352 	  return future_status::timeout;
    353 	}
    354 
    355       void
    356       _M_set_result(function<_Ptr_type()> __res, bool __ignore_failure = false)
    357       {
    358         bool __set = __ignore_failure;
    359         // all calls to this function are serialized,
    360         // side-effects of invoking __res only happen once
    361         call_once(_M_once, &_State_base::_M_do_set, this, ref(__res),
    362             ref(__set));
    363         if (!__set)
    364           __throw_future_error(int(future_errc::promise_already_satisfied));
    365       }
    366 
    367       void
    368       _M_break_promise(_Ptr_type __res)
    369       {
    370 	if (static_cast<bool>(__res))
    371 	  {
    372 	    error_code __ec(make_error_code(future_errc::broken_promise));
    373 	    __res->_M_error = copy_exception(future_error(__ec));
    374 	    {
    375 	      lock_guard<mutex> __lock(_M_mutex);
    376 	      _M_result.swap(__res);
    377 	    }
    378 	    _M_cond.notify_all();
    379 	  }
    380       }
    381 
    382       // Called when this object is passed to a future.
    383       void
    384       _M_set_retrieved_flag()
    385       {
    386 	if (_M_retrieved.test_and_set())
    387 	  __throw_future_error(int(future_errc::future_already_retrieved));
    388       }
    389 
    390       template<typename _Res, typename _Arg>
    391         struct _Setter;
    392 
    393       // set lvalues
    394       template<typename _Res, typename _Arg>
    395         struct _Setter<_Res, _Arg&>
    396         {
    397           // check this is only used by promise<R>::set_value(const R&)
    398           // or promise<R>::set_value(R&)
    399           static_assert(is_same<_Res, _Arg&>::value  // promise<R&>
    400               || is_same<const _Res, _Arg>::value,  // promise<R>
    401               "Invalid specialisation");
    402 
    403           typename promise<_Res>::_Ptr_type operator()()
    404           {
    405             _State_base::_S_check(_M_promise->_M_future);
    406             _M_promise->_M_storage->_M_set(_M_arg);
    407             return std::move(_M_promise->_M_storage);
    408           }
    409           promise<_Res>*    _M_promise;
    410           _Arg&             _M_arg;
    411         };
    412 
    413       // set rvalues
    414       template<typename _Res>
    415         struct _Setter<_Res, _Res&&>
    416         {
    417           typename promise<_Res>::_Ptr_type operator()()
    418           {
    419             _State_base::_S_check(_M_promise->_M_future);
    420             _M_promise->_M_storage->_M_set(std::move(_M_arg));
    421             return std::move(_M_promise->_M_storage);
    422           }
    423           promise<_Res>*    _M_promise;
    424           _Res&             _M_arg;
    425         };
    426 
    427       struct __exception_ptr_tag { };
    428 
    429       // set exceptions
    430       template<typename _Res>
    431         struct _Setter<_Res, __exception_ptr_tag>
    432         {
    433           typename promise<_Res>::_Ptr_type operator()()
    434           {
    435             _State_base::_S_check(_M_promise->_M_future);
    436             _M_promise->_M_storage->_M_error = _M_ex;
    437             return std::move(_M_promise->_M_storage);
    438           }
    439 
    440           promise<_Res>*   _M_promise;
    441           exception_ptr&    _M_ex;
    442         };
    443 
    444       template<typename _Res, typename _Arg>
    445         static _Setter<_Res, _Arg&&>
    446         __setter(promise<_Res>* __prom, _Arg&& __arg)
    447         {
    448           return _Setter<_Res, _Arg&&>{ __prom, __arg };
    449         }
    450 
    451       template<typename _Res>
    452         static _Setter<_Res, __exception_ptr_tag>
    453         __setter(exception_ptr& __ex, promise<_Res>* __prom)
    454         {
    455           return _Setter<_Res, __exception_ptr_tag>{ __prom, __ex };
    456         }
    457 
    458       static _Setter<void, void>
    459       __setter(promise<void>* __prom);
    460 
    461       template<typename _Tp>
    462         static bool
    463         _S_check(const shared_ptr<_Tp>& __p)
    464         {
    465           if (!static_cast<bool>(__p))
    466             __throw_future_error((int)future_errc::no_state);
    467         }
    468 
    469     private:
    470       void
    471       _M_do_set(function<_Ptr_type()>& __f, bool& __set)
    472       {
    473         _Ptr_type __res = __f();
    474         {
    475           lock_guard<mutex> __lock(_M_mutex);
    476           _M_result.swap(__res);
    477         }
    478         _M_cond.notify_all();
    479         __set = true;
    480       }
    481 
    482       bool _M_ready() const noexcept { return static_cast<bool>(_M_result); }
    483 
    484       // Misnamed: waits for completion of async function.
    485       virtual void _M_run_deferred() { }
    486     };
    487 
    488     template<typename _BoundFn, typename = typename _BoundFn::result_type>
    489       class _Deferred_state;
    490 
    491     class _Async_state_common;
    492 
    493     template<typename _BoundFn, typename = typename _BoundFn::result_type>
    494       class _Async_state_impl;
    495 
    496     template<typename _Signature>
    497       class _Task_state;
    498 
    499     template<typename _BoundFn>
    500       static std::shared_ptr<_State_base>
    501       _S_make_deferred_state(_BoundFn&& __fn);
    502 
    503     template<typename _BoundFn>
    504       static std::shared_ptr<_State_base>
    505       _S_make_async_state(_BoundFn&& __fn);
    506 
    507     template<typename _Res_ptr, typename _Res>
    508       struct _Task_setter;
    509 
    510     template<typename _Res_ptr, typename _BoundFn>
    511       class _Task_setter_helper
    512       {
    513 	typedef typename remove_reference<_BoundFn>::type::result_type __res;
    514       public:
    515 	typedef _Task_setter<_Res_ptr, __res> __type;
    516       };
    517 
    518     template<typename _Res_ptr, typename _BoundFn>
    519       static typename _Task_setter_helper<_Res_ptr, _BoundFn>::__type
    520       _S_task_setter(_Res_ptr& __ptr, _BoundFn&& __call)
    521       {
    522 	typedef _Task_setter_helper<_Res_ptr, _BoundFn> __helper_type;
    523 	typedef typename __helper_type::__type _Setter;
    524 	return _Setter{ __ptr, std::ref(__call) };
    525       }
    526   };
    527 
    528   /// Partial specialization for reference types.
    529   template<typename _Res>
    530     struct __future_base::_Result<_Res&> : __future_base::_Result_base
    531     {
    532       _Result() noexcept : _M_value_ptr() { }
    533 
    534       void _M_set(_Res& __res) noexcept { _M_value_ptr = &__res; }
    535 
    536       _Res& _M_get() noexcept { return *_M_value_ptr; }
    537 
    538     private:
    539       _Res* 			_M_value_ptr;
    540 
    541       void _M_destroy() { delete this; }
    542     };
    543 
    544   /// Explicit specialization for void.
    545   template<>
    546     struct __future_base::_Result<void> : __future_base::_Result_base
    547     {
    548     private:
    549       void _M_destroy() { delete this; }
    550     };
    551 
    552 
    553   /// Common implementation for future and shared_future.
    554   template<typename _Res>
    555     class __basic_future : public __future_base
    556     {
    557     protected:
    558       typedef shared_ptr<_State_base>		__state_type;
    559       typedef __future_base::_Result<_Res>&	__result_type;
    560 
    561     private:
    562       __state_type 		_M_state;
    563 
    564     public:
    565       // Disable copying.
    566       __basic_future(const __basic_future&) = delete;
    567       __basic_future& operator=(const __basic_future&) = delete;
    568 
    569       bool
    570       valid() const noexcept { return static_cast<bool>(_M_state); }
    571 
    572       void
    573       wait() const
    574       {
    575         _State_base::_S_check(_M_state);
    576         _M_state->wait();
    577       }
    578 
    579       template<typename _Rep, typename _Period>
    580         future_status
    581         wait_for(const chrono::duration<_Rep, _Period>& __rel) const
    582         {
    583           _State_base::_S_check(_M_state);
    584           return _M_state->wait_for(__rel);
    585         }
    586 
    587       template<typename _Clock, typename _Duration>
    588         future_status
    589         wait_until(const chrono::time_point<_Clock, _Duration>& __abs) const
    590         {
    591           _State_base::_S_check(_M_state);
    592           return _M_state->wait_until(__abs);
    593         }
    594 
    595     protected:
    596       /// Wait for the state to be ready and rethrow any stored exception
    597       __result_type
    598       _M_get_result()
    599       {
    600         _State_base::_S_check(_M_state);
    601         _Result_base& __res = _M_state->wait();
    602         if (!(__res._M_error == 0))
    603           rethrow_exception(__res._M_error);
    604         return static_cast<__result_type>(__res);
    605       }
    606 
    607       void _M_swap(__basic_future& __that) noexcept
    608       {
    609         _M_state.swap(__that._M_state);
    610       }
    611 
    612       // Construction of a future by promise::get_future()
    613       explicit
    614       __basic_future(const __state_type& __state) : _M_state(__state)
    615       {
    616         _State_base::_S_check(_M_state);
    617         _M_state->_M_set_retrieved_flag();
    618       }
    619 
    620       // Copy construction from a shared_future
    621       explicit
    622       __basic_future(const shared_future<_Res>&) noexcept;
    623 
    624       // Move construction from a shared_future
    625       explicit
    626       __basic_future(shared_future<_Res>&&) noexcept;
    627 
    628       // Move construction from a future
    629       explicit
    630       __basic_future(future<_Res>&&) noexcept;
    631 
    632       constexpr __basic_future() noexcept : _M_state() { }
    633 
    634       struct _Reset
    635       {
    636         explicit _Reset(__basic_future& __fut) noexcept : _M_fut(__fut) { }
    637         ~_Reset() { _M_fut._M_state.reset(); }
    638         __basic_future& _M_fut;
    639       };
    640     };
    641 
    642 
    643   /// Primary template for future.
    644   template<typename _Res>
    645     class future : public __basic_future<_Res>
    646     {
    647       friend class promise<_Res>;
    648       template<typename> friend class packaged_task;
    649       template<typename _Fn, typename... _Args>
    650         friend future<typename result_of<_Fn(_Args...)>::type>
    651         async(launch, _Fn&&, _Args&&...);
    652 
    653       typedef __basic_future<_Res> _Base_type;
    654       typedef typename _Base_type::__state_type __state_type;
    655 
    656       explicit
    657       future(const __state_type& __state) : _Base_type(__state) { }
    658 
    659     public:
    660       constexpr future() noexcept : _Base_type() { }
    661 
    662       /// Move constructor
    663       future(future&& __uf) noexcept : _Base_type(std::move(__uf)) { }
    664 
    665       // Disable copying
    666       future(const future&) = delete;
    667       future& operator=(const future&) = delete;
    668 
    669       future& operator=(future&& __fut) noexcept
    670       {
    671         future(std::move(__fut))._M_swap(*this);
    672         return *this;
    673       }
    674 
    675       /// Retrieving the value
    676       _Res
    677       get()
    678       {
    679         typename _Base_type::_Reset __reset(*this);
    680         return std::move(this->_M_get_result()._M_value());
    681       }
    682 
    683       shared_future<_Res> share();
    684     };
    685 
    686   /// Partial specialization for future<R&>
    687   template<typename _Res>
    688     class future<_Res&> : public __basic_future<_Res&>
    689     {
    690       friend class promise<_Res&>;
    691       template<typename> friend class packaged_task;
    692       template<typename _Fn, typename... _Args>
    693         friend future<typename result_of<_Fn(_Args...)>::type>
    694         async(launch, _Fn&&, _Args&&...);
    695 
    696       typedef __basic_future<_Res&> _Base_type;
    697       typedef typename _Base_type::__state_type __state_type;
    698 
    699       explicit
    700       future(const __state_type& __state) : _Base_type(__state) { }
    701 
    702     public:
    703       constexpr future() noexcept : _Base_type() { }
    704 
    705       /// Move constructor
    706       future(future&& __uf) noexcept : _Base_type(std::move(__uf)) { }
    707 
    708       // Disable copying
    709       future(const future&) = delete;
    710       future& operator=(const future&) = delete;
    711 
    712       future& operator=(future&& __fut) noexcept
    713       {
    714         future(std::move(__fut))._M_swap(*this);
    715         return *this;
    716       }
    717 
    718       /// Retrieving the value
    719       _Res&
    720       get()
    721       {
    722         typename _Base_type::_Reset __reset(*this);
    723         return this->_M_get_result()._M_get();
    724       }
    725 
    726       shared_future<_Res&> share();
    727     };
    728 
    729   /// Explicit specialization for future<void>
    730   template<>
    731     class future<void> : public __basic_future<void>
    732     {
    733       friend class promise<void>;
    734       template<typename> friend class packaged_task;
    735       template<typename _Fn, typename... _Args>
    736         friend future<typename result_of<_Fn(_Args...)>::type>
    737         async(launch, _Fn&&, _Args&&...);
    738 
    739       typedef __basic_future<void> _Base_type;
    740       typedef typename _Base_type::__state_type __state_type;
    741 
    742       explicit
    743       future(const __state_type& __state) : _Base_type(__state) { }
    744 
    745     public:
    746       constexpr future() noexcept : _Base_type() { }
    747 
    748       /// Move constructor
    749       future(future&& __uf) noexcept : _Base_type(std::move(__uf)) { }
    750 
    751       // Disable copying
    752       future(const future&) = delete;
    753       future& operator=(const future&) = delete;
    754 
    755       future& operator=(future&& __fut) noexcept
    756       {
    757         future(std::move(__fut))._M_swap(*this);
    758         return *this;
    759       }
    760 
    761       /// Retrieving the value
    762       void
    763       get()
    764       {
    765         typename _Base_type::_Reset __reset(*this);
    766         this->_M_get_result();
    767       }
    768 
    769       shared_future<void> share();
    770     };
    771 
    772 
    773   /// Primary template for shared_future.
    774   template<typename _Res>
    775     class shared_future : public __basic_future<_Res>
    776     {
    777       typedef __basic_future<_Res> _Base_type;
    778 
    779     public:
    780       constexpr shared_future() noexcept : _Base_type() { }
    781 
    782       /// Copy constructor
    783       shared_future(const shared_future& __sf) : _Base_type(__sf) { }
    784 
    785       /// Construct from a future rvalue
    786       shared_future(future<_Res>&& __uf) noexcept
    787       : _Base_type(std::move(__uf))
    788       { }
    789 
    790       /// Construct from a shared_future rvalue
    791       shared_future(shared_future&& __sf) noexcept
    792       : _Base_type(std::move(__sf))
    793       { }
    794 
    795       shared_future& operator=(const shared_future& __sf)
    796       {
    797         shared_future(__sf)._M_swap(*this);
    798         return *this;
    799       }
    800 
    801       shared_future& operator=(shared_future&& __sf) noexcept
    802       {
    803         shared_future(std::move(__sf))._M_swap(*this);
    804         return *this;
    805       }
    806 
    807       /// Retrieving the value
    808       const _Res&
    809       get()
    810       {
    811 	typename _Base_type::__result_type __r = this->_M_get_result();
    812 	_Res& __rs(__r._M_value());
    813 	return __rs;
    814       }
    815     };
    816 
    817   /// Partial specialization for shared_future<R&>
    818   template<typename _Res>
    819     class shared_future<_Res&> : public __basic_future<_Res&>
    820     {
    821       typedef __basic_future<_Res&>           _Base_type;
    822 
    823     public:
    824       constexpr shared_future() noexcept : _Base_type() { }
    825 
    826       /// Copy constructor
    827       shared_future(const shared_future& __sf) : _Base_type(__sf) { }
    828 
    829       /// Construct from a future rvalue
    830       shared_future(future<_Res&>&& __uf) noexcept
    831       : _Base_type(std::move(__uf))
    832       { }
    833 
    834       /// Construct from a shared_future rvalue
    835       shared_future(shared_future&& __sf) noexcept
    836       : _Base_type(std::move(__sf))
    837       { }
    838 
    839       shared_future& operator=(const shared_future& __sf)
    840       {
    841         shared_future(__sf)._M_swap(*this);
    842         return *this;
    843       }
    844 
    845       shared_future& operator=(shared_future&& __sf) noexcept
    846       {
    847         shared_future(std::move(__sf))._M_swap(*this);
    848         return *this;
    849       }
    850 
    851       /// Retrieving the value
    852       _Res&
    853       get() { return this->_M_get_result()._M_get(); }
    854     };
    855 
    856   /// Explicit specialization for shared_future<void>
    857   template<>
    858     class shared_future<void> : public __basic_future<void>
    859     {
    860       typedef __basic_future<void> _Base_type;
    861 
    862     public:
    863       constexpr shared_future() noexcept : _Base_type() { }
    864 
    865       /// Copy constructor
    866       shared_future(const shared_future& __sf) : _Base_type(__sf) { }
    867 
    868       /// Construct from a future rvalue
    869       shared_future(future<void>&& __uf) noexcept
    870       : _Base_type(std::move(__uf))
    871       { }
    872 
    873       /// Construct from a shared_future rvalue
    874       shared_future(shared_future&& __sf) noexcept
    875       : _Base_type(std::move(__sf))
    876       { }
    877 
    878       shared_future& operator=(const shared_future& __sf)
    879       {
    880         shared_future(__sf)._M_swap(*this);
    881         return *this;
    882       }
    883 
    884       shared_future& operator=(shared_future&& __sf) noexcept
    885       {
    886         shared_future(std::move(__sf))._M_swap(*this);
    887         return *this;
    888       }
    889 
    890       // Retrieving the value
    891       void
    892       get() { this->_M_get_result(); }
    893     };
    894 
    895   // Now we can define the protected __basic_future constructors.
    896   template<typename _Res>
    897     inline __basic_future<_Res>::
    898     __basic_future(const shared_future<_Res>& __sf) noexcept
    899     : _M_state(__sf._M_state)
    900     { }
    901 
    902   template<typename _Res>
    903     inline __basic_future<_Res>::
    904     __basic_future(shared_future<_Res>&& __sf) noexcept
    905     : _M_state(std::move(__sf._M_state))
    906     { }
    907 
    908   template<typename _Res>
    909     inline __basic_future<_Res>::
    910     __basic_future(future<_Res>&& __uf) noexcept
    911     : _M_state(std::move(__uf._M_state))
    912     { }
    913 
    914   template<typename _Res>
    915     inline shared_future<_Res>
    916     future<_Res>::share()
    917     { return shared_future<_Res>(std::move(*this)); }
    918 
    919   template<typename _Res>
    920     inline shared_future<_Res&>
    921     future<_Res&>::share()
    922     { return shared_future<_Res&>(std::move(*this)); }
    923 
    924   inline shared_future<void>
    925   future<void>::share()
    926   { return shared_future<void>(std::move(*this)); }
    927 
    928   /// Primary template for promise
    929   template<typename _Res>
    930     class promise
    931     {
    932       typedef __future_base::_State_base 	_State;
    933       typedef __future_base::_Result<_Res>	_Res_type;
    934       typedef __future_base::_Ptr<_Res_type>	_Ptr_type;
    935       template<typename, typename> friend class _State::_Setter;
    936 
    937       shared_ptr<_State>                        _M_future;
    938       _Ptr_type                                 _M_storage;
    939 
    940     public:
    941       promise()
    942       : _M_future(std::make_shared<_State>()),
    943 	_M_storage(new _Res_type())
    944       { }
    945 
    946       promise(promise&& __rhs) noexcept
    947       : _M_future(std::move(__rhs._M_future)),
    948 	_M_storage(std::move(__rhs._M_storage))
    949       { }
    950 
    951       template<typename _Allocator>
    952         promise(allocator_arg_t, const _Allocator& __a)
    953         : _M_future(std::allocate_shared<_State>(__a)),
    954 	  _M_storage(__future_base::_S_allocate_result<_Res>(__a))
    955         { }
    956 
    957       template<typename _Allocator>
    958         promise(allocator_arg_t, const _Allocator&, promise&& __rhs)
    959         : _M_future(std::move(__rhs._M_future)),
    960 	  _M_storage(std::move(__rhs._M_storage))
    961         { }
    962 
    963       promise(const promise&) = delete;
    964 
    965       ~promise()
    966       {
    967         if (static_cast<bool>(_M_future) && !_M_future.unique())
    968           _M_future->_M_break_promise(std::move(_M_storage));
    969       }
    970 
    971       // Assignment
    972       promise&
    973       operator=(promise&& __rhs) noexcept
    974       {
    975         promise(std::move(__rhs)).swap(*this);
    976         return *this;
    977       }
    978 
    979       promise& operator=(const promise&) = delete;
    980 
    981       void
    982       swap(promise& __rhs) noexcept
    983       {
    984         _M_future.swap(__rhs._M_future);
    985         _M_storage.swap(__rhs._M_storage);
    986       }
    987 
    988       // Retrieving the result
    989       future<_Res>
    990       get_future()
    991       { return future<_Res>(_M_future); }
    992 
    993       // Setting the result
    994       void
    995       set_value(const _Res& __r)
    996       {
    997         auto __setter = _State::__setter(this, __r);
    998         _M_future->_M_set_result(std::move(__setter));
    999       }
   1000 
   1001       void
   1002       set_value(_Res&& __r)
   1003       {
   1004         auto __setter = _State::__setter(this, std::move(__r));
   1005         _M_future->_M_set_result(std::move(__setter));
   1006       }
   1007 
   1008       void
   1009       set_exception(exception_ptr __p)
   1010       {
   1011         auto __setter = _State::__setter(__p, this);
   1012         _M_future->_M_set_result(std::move(__setter));
   1013       }
   1014     };
   1015 
   1016   template<typename _Res>
   1017     inline void
   1018     swap(promise<_Res>& __x, promise<_Res>& __y) noexcept
   1019     { __x.swap(__y); }
   1020 
   1021   template<typename _Res, typename _Alloc>
   1022     struct uses_allocator<promise<_Res>, _Alloc>
   1023     : public true_type { };
   1024 
   1025 
   1026   /// Partial specialization for promise<R&>
   1027   template<typename _Res>
   1028     class promise<_Res&>
   1029     {
   1030       typedef __future_base::_State_base	_State;
   1031       typedef __future_base::_Result<_Res&>	_Res_type;
   1032       typedef __future_base::_Ptr<_Res_type> 	_Ptr_type;
   1033       template<typename, typename> friend class _State::_Setter;
   1034 
   1035       shared_ptr<_State>                        _M_future;
   1036       _Ptr_type                                 _M_storage;
   1037 
   1038     public:
   1039       promise()
   1040       : _M_future(std::make_shared<_State>()),
   1041 	_M_storage(new _Res_type())
   1042       { }
   1043 
   1044       promise(promise&& __rhs) noexcept
   1045       : _M_future(std::move(__rhs._M_future)),
   1046 	_M_storage(std::move(__rhs._M_storage))
   1047       { }
   1048 
   1049       template<typename _Allocator>
   1050         promise(allocator_arg_t, const _Allocator& __a)
   1051         : _M_future(std::allocate_shared<_State>(__a)),
   1052 	  _M_storage(__future_base::_S_allocate_result<_Res&>(__a))
   1053         { }
   1054 
   1055       template<typename _Allocator>
   1056         promise(allocator_arg_t, const _Allocator&, promise&& __rhs)
   1057         : _M_future(std::move(__rhs._M_future)),
   1058 	  _M_storage(std::move(__rhs._M_storage))
   1059         { }
   1060 
   1061       promise(const promise&) = delete;
   1062 
   1063       ~promise()
   1064       {
   1065         if (static_cast<bool>(_M_future) && !_M_future.unique())
   1066           _M_future->_M_break_promise(std::move(_M_storage));
   1067       }
   1068 
   1069       // Assignment
   1070       promise&
   1071       operator=(promise&& __rhs) noexcept
   1072       {
   1073         promise(std::move(__rhs)).swap(*this);
   1074         return *this;
   1075       }
   1076 
   1077       promise& operator=(const promise&) = delete;
   1078 
   1079       void
   1080       swap(promise& __rhs) noexcept
   1081       {
   1082         _M_future.swap(__rhs._M_future);
   1083         _M_storage.swap(__rhs._M_storage);
   1084       }
   1085 
   1086       // Retrieving the result
   1087       future<_Res&>
   1088       get_future()
   1089       { return future<_Res&>(_M_future); }
   1090 
   1091       // Setting the result
   1092       void
   1093       set_value(_Res& __r)
   1094       {
   1095         auto __setter = _State::__setter(this, __r);
   1096         _M_future->_M_set_result(std::move(__setter));
   1097       }
   1098 
   1099       void
   1100       set_exception(exception_ptr __p)
   1101       {
   1102         auto __setter = _State::__setter(__p, this);
   1103         _M_future->_M_set_result(std::move(__setter));
   1104       }
   1105     };
   1106 
   1107   /// Explicit specialization for promise<void>
   1108   template<>
   1109     class promise<void>
   1110     {
   1111       typedef __future_base::_State_base	_State;
   1112       typedef __future_base::_Result<void>	_Res_type;
   1113       typedef __future_base::_Ptr<_Res_type> 	_Ptr_type;
   1114       template<typename, typename> friend class _State::_Setter;
   1115 
   1116       shared_ptr<_State>                        _M_future;
   1117       _Ptr_type                                 _M_storage;
   1118 
   1119     public:
   1120       promise()
   1121       : _M_future(std::make_shared<_State>()),
   1122 	_M_storage(new _Res_type())
   1123       { }
   1124 
   1125       promise(promise&& __rhs) noexcept
   1126       : _M_future(std::move(__rhs._M_future)),
   1127 	_M_storage(std::move(__rhs._M_storage))
   1128       { }
   1129 
   1130       template<typename _Allocator>
   1131         promise(allocator_arg_t, const _Allocator& __a)
   1132         : _M_future(std::allocate_shared<_State>(__a)),
   1133 	  _M_storage(__future_base::_S_allocate_result<void>(__a))
   1134         { }
   1135 
   1136       template<typename _Allocator>
   1137         promise(allocator_arg_t, const _Allocator&, promise&& __rhs)
   1138         : _M_future(std::move(__rhs._M_future)),
   1139 	  _M_storage(std::move(__rhs._M_storage))
   1140         { }
   1141 
   1142       promise(const promise&) = delete;
   1143 
   1144       ~promise()
   1145       {
   1146         if (static_cast<bool>(_M_future) && !_M_future.unique())
   1147           _M_future->_M_break_promise(std::move(_M_storage));
   1148       }
   1149 
   1150       // Assignment
   1151       promise&
   1152       operator=(promise&& __rhs) noexcept
   1153       {
   1154         promise(std::move(__rhs)).swap(*this);
   1155         return *this;
   1156       }
   1157 
   1158       promise& operator=(const promise&) = delete;
   1159 
   1160       void
   1161       swap(promise& __rhs) noexcept
   1162       {
   1163         _M_future.swap(__rhs._M_future);
   1164         _M_storage.swap(__rhs._M_storage);
   1165       }
   1166 
   1167       // Retrieving the result
   1168       future<void>
   1169       get_future()
   1170       { return future<void>(_M_future); }
   1171 
   1172       // Setting the result
   1173       void set_value();
   1174 
   1175       void
   1176       set_exception(exception_ptr __p)
   1177       {
   1178         auto __setter = _State::__setter(__p, this);
   1179         _M_future->_M_set_result(std::move(__setter));
   1180       }
   1181     };
   1182 
   1183   // set void
   1184   template<>
   1185     struct __future_base::_State_base::_Setter<void, void>
   1186     {
   1187       promise<void>::_Ptr_type operator()()
   1188       {
   1189         _State_base::_S_check(_M_promise->_M_future);
   1190         return std::move(_M_promise->_M_storage);
   1191       }
   1192 
   1193       promise<void>*    _M_promise;
   1194     };
   1195 
   1196   inline __future_base::_State_base::_Setter<void, void>
   1197   __future_base::_State_base::__setter(promise<void>* __prom)
   1198   {
   1199     return _Setter<void, void>{ __prom };
   1200   }
   1201 
   1202   inline void
   1203   promise<void>::set_value()
   1204   {
   1205     auto __setter = _State::__setter(this);
   1206     _M_future->_M_set_result(std::move(__setter));
   1207   }
   1208 
   1209 
   1210   template<typename _Ptr_type, typename _Res>
   1211     struct __future_base::_Task_setter
   1212     {
   1213       _Ptr_type operator()()
   1214       {
   1215         __try
   1216 	  {
   1217 	    _M_result->_M_set(_M_fn());
   1218 	  }
   1219 	__catch(...)
   1220 	  {
   1221 	    _M_result->_M_error = current_exception();
   1222 	  }
   1223         return std::move(_M_result);
   1224       }
   1225       _Ptr_type&                _M_result;
   1226       std::function<_Res()>     _M_fn;
   1227     };
   1228 
   1229   template<typename _Ptr_type>
   1230     struct __future_base::_Task_setter<_Ptr_type, void>
   1231     {
   1232       _Ptr_type operator()()
   1233       {
   1234         __try
   1235 	  {
   1236 	    _M_fn();
   1237 	  }
   1238 	__catch(...)
   1239 	  {
   1240 	    _M_result->_M_error = current_exception();
   1241 	  }
   1242 	return std::move(_M_result);
   1243       }
   1244       _Ptr_type&                _M_result;
   1245       std::function<void()>     _M_fn;
   1246     };
   1247 
   1248   template<typename _Res, typename... _Args>
   1249     struct __future_base::_Task_state<_Res(_Args...)> final
   1250     : __future_base::_State_base
   1251     {
   1252       typedef _Res _Res_type;
   1253 
   1254       _Task_state(std::function<_Res(_Args...)> __task)
   1255       : _M_result(new _Result<_Res>()), _M_task(std::move(__task))
   1256       { }
   1257 
   1258       template<typename _Func, typename _Alloc>
   1259         _Task_state(_Func&& __task, const _Alloc& __a)
   1260         : _M_result(_S_allocate_result<_Res>(__a)),
   1261 	  _M_task(allocator_arg, __a, std::move(__task))
   1262         { }
   1263 
   1264       void
   1265       _M_run(_Args... __args)
   1266       {
   1267         // bound arguments decay so wrap lvalue references
   1268 	auto __boundfn = std::__bind_simple(std::ref(_M_task),
   1269 	    _S_maybe_wrap_ref(std::forward<_Args>(__args))...);
   1270         auto __setter = _S_task_setter(_M_result, std::move(__boundfn));
   1271         _M_set_result(std::move(__setter));
   1272       }
   1273 
   1274       typedef __future_base::_Ptr<_Result<_Res>> _Ptr_type;
   1275       _Ptr_type _M_result;
   1276       std::function<_Res(_Args...)> _M_task;
   1277 
   1278       template<typename _Tp>
   1279         static reference_wrapper<_Tp>
   1280         _S_maybe_wrap_ref(_Tp& __t)
   1281         { return std::ref(__t); }
   1282 
   1283       template<typename _Tp>
   1284         static typename enable_if<!is_lvalue_reference<_Tp>::value,
   1285                         _Tp>::type&&
   1286         _S_maybe_wrap_ref(_Tp&& __t)
   1287         { return std::forward<_Tp>(__t); }
   1288     };
   1289 
   1290   template<typename _Task, typename _Fn, bool
   1291            = is_same<_Task, typename decay<_Fn>::type>::value>
   1292     struct __constrain_pkgdtask
   1293     { typedef void __type; };
   1294 
   1295   template<typename _Task, typename _Fn>
   1296     struct __constrain_pkgdtask<_Task, _Fn, true>
   1297     { };
   1298 
   1299   /// packaged_task
   1300   template<typename _Res, typename... _ArgTypes>
   1301     class packaged_task<_Res(_ArgTypes...)>
   1302     {
   1303       typedef __future_base::_Task_state<_Res(_ArgTypes...)>  _State_type;
   1304       shared_ptr<_State_type>                   _M_state;
   1305 
   1306     public:
   1307       // Construction and destruction
   1308       packaged_task() noexcept { }
   1309 
   1310       template<typename _Allocator>
   1311         explicit
   1312         packaged_task(allocator_arg_t, const _Allocator& __a) noexcept
   1313         { }
   1314 
   1315       template<typename _Fn, typename = typename
   1316                __constrain_pkgdtask<packaged_task, _Fn>::__type>
   1317         explicit
   1318         packaged_task(_Fn&& __fn)
   1319         : _M_state(std::make_shared<_State_type>(std::forward<_Fn>(__fn)))
   1320         { }
   1321 
   1322       template<typename _Fn, typename _Allocator, typename = typename
   1323                __constrain_pkgdtask<packaged_task, _Fn>::__type>
   1324         explicit
   1325         packaged_task(allocator_arg_t, const _Allocator& __a, _Fn&& __fn)
   1326         : _M_state(std::allocate_shared<_State_type>(__a,
   1327                                                      std::forward<_Fn>(__fn)))
   1328         { }
   1329 
   1330       ~packaged_task()
   1331       {
   1332         if (static_cast<bool>(_M_state) && !_M_state.unique())
   1333           _M_state->_M_break_promise(std::move(_M_state->_M_result));
   1334       }
   1335 
   1336       // No copy
   1337       packaged_task(const packaged_task&) = delete;
   1338       packaged_task& operator=(const packaged_task&) = delete;
   1339 
   1340       template<typename _Allocator>
   1341         explicit
   1342         packaged_task(allocator_arg_t, const _Allocator&,
   1343                       const packaged_task&) = delete;
   1344 
   1345       // Move support
   1346       packaged_task(packaged_task&& __other) noexcept
   1347       { this->swap(__other); }
   1348 
   1349       template<typename _Allocator>
   1350         explicit
   1351         packaged_task(allocator_arg_t, const _Allocator&,
   1352                       packaged_task&& __other) noexcept
   1353         { this->swap(__other); }
   1354 
   1355       packaged_task& operator=(packaged_task&& __other) noexcept
   1356       {
   1357         packaged_task(std::move(__other)).swap(*this);
   1358         return *this;
   1359       }
   1360 
   1361       void
   1362       swap(packaged_task& __other) noexcept
   1363       { _M_state.swap(__other._M_state); }
   1364 
   1365       bool
   1366       valid() const noexcept
   1367       { return static_cast<bool>(_M_state); }
   1368 
   1369       // Result retrieval
   1370       future<_Res>
   1371       get_future()
   1372       { return future<_Res>(_M_state); }
   1373 
   1374       // Execution
   1375       void
   1376       operator()(_ArgTypes... __args)
   1377       {
   1378         __future_base::_State_base::_S_check(_M_state);
   1379         _M_state->_M_run(std::forward<_ArgTypes>(__args)...);
   1380       }
   1381 
   1382       void
   1383       reset()
   1384       {
   1385         __future_base::_State_base::_S_check(_M_state);
   1386         packaged_task(std::move(_M_state->_M_task)).swap(*this);
   1387       }
   1388     };
   1389 
   1390   /// swap
   1391   template<typename _Res, typename... _ArgTypes>
   1392     inline void
   1393     swap(packaged_task<_Res(_ArgTypes...)>& __x,
   1394 	 packaged_task<_Res(_ArgTypes...)>& __y) noexcept
   1395     { __x.swap(__y); }
   1396 
   1397   template<typename _Res, typename _Alloc>
   1398     struct uses_allocator<packaged_task<_Res>, _Alloc>
   1399     : public true_type { };
   1400 
   1401 
   1402   template<typename _BoundFn, typename _Res>
   1403     class __future_base::_Deferred_state final
   1404     : public __future_base::_State_base
   1405     {
   1406     public:
   1407       explicit
   1408       _Deferred_state(_BoundFn&& __fn)
   1409       : _M_result(new _Result<_Res>()), _M_fn(std::move(__fn))
   1410       { }
   1411 
   1412     private:
   1413       typedef __future_base::_Ptr<_Result<_Res>> _Ptr_type;
   1414       _Ptr_type _M_result;
   1415       _BoundFn _M_fn;
   1416 
   1417       virtual void
   1418       _M_run_deferred()
   1419       {
   1420         // safe to call multiple times so ignore failure
   1421         _M_set_result(_S_task_setter(_M_result, _M_fn), true);
   1422       }
   1423     };
   1424 
   1425   class __future_base::_Async_state_common : public __future_base::_State_base
   1426   {
   1427   protected:
   1428 #ifdef _GLIBCXX_ASYNC_ABI_COMPAT
   1429     ~_Async_state_common();
   1430 #else
   1431     ~_Async_state_common() = default;
   1432 #endif
   1433 
   1434     // Allow non-timed waiting functions to block until the thread completes,
   1435     // as if joined.
   1436     virtual void _M_run_deferred() { _M_join(); }
   1437 
   1438     void _M_join() { std::call_once(_M_once, &thread::join, ref(_M_thread)); }
   1439 
   1440     thread _M_thread;
   1441     once_flag _M_once;
   1442   };
   1443 
   1444   template<typename _BoundFn, typename _Res>
   1445     class __future_base::_Async_state_impl final
   1446     : public __future_base::_Async_state_common
   1447     {
   1448     public:
   1449       explicit
   1450       _Async_state_impl(_BoundFn&& __fn)
   1451       : _M_result(new _Result<_Res>()), _M_fn(std::move(__fn))
   1452       {
   1453 	_M_thread = std::thread{ [this] {
   1454 	  _M_set_result(_S_task_setter(_M_result, _M_fn));
   1455         } };
   1456       }
   1457 
   1458       ~_Async_state_impl() { _M_join(); }
   1459 
   1460     private:
   1461       typedef __future_base::_Ptr<_Result<_Res>> _Ptr_type;
   1462       _Ptr_type _M_result;
   1463       _BoundFn _M_fn;
   1464     };
   1465 
   1466   template<typename _BoundFn>
   1467     inline std::shared_ptr<__future_base::_State_base>
   1468     __future_base::_S_make_deferred_state(_BoundFn&& __fn)
   1469     {
   1470       typedef typename remove_reference<_BoundFn>::type __fn_type;
   1471       typedef _Deferred_state<__fn_type> __state_type;
   1472       return std::make_shared<__state_type>(std::move(__fn));
   1473     }
   1474 
   1475   template<typename _BoundFn>
   1476     inline std::shared_ptr<__future_base::_State_base>
   1477     __future_base::_S_make_async_state(_BoundFn&& __fn)
   1478     {
   1479       typedef typename remove_reference<_BoundFn>::type __fn_type;
   1480       typedef _Async_state_impl<__fn_type> __state_type;
   1481       return std::make_shared<__state_type>(std::move(__fn));
   1482     }
   1483 
   1484 
   1485   /// async
   1486   template<typename _Fn, typename... _Args>
   1487     future<typename result_of<_Fn(_Args...)>::type>
   1488     async(launch __policy, _Fn&& __fn, _Args&&... __args)
   1489     {
   1490       typedef typename result_of<_Fn(_Args...)>::type result_type;
   1491       std::shared_ptr<__future_base::_State_base> __state;
   1492       if ((__policy & (launch::async|launch::deferred)) == launch::async)
   1493 	{
   1494 	  __state = __future_base::_S_make_async_state(std::__bind_simple(
   1495               std::forward<_Fn>(__fn), std::forward<_Args>(__args)...));
   1496 	}
   1497       else
   1498 	{
   1499 	  __state = __future_base::_S_make_deferred_state(std::__bind_simple(
   1500               std::forward<_Fn>(__fn), std::forward<_Args>(__args)...));
   1501 	}
   1502       return future<result_type>(__state);
   1503     }
   1504 
   1505   /// async, potential overload
   1506   template<typename _Fn, typename... _Args>
   1507     inline typename
   1508     __async_sfinae_helper<typename decay<_Fn>::type, _Fn, _Args...>::type
   1509     async(_Fn&& __fn, _Args&&... __args)
   1510     {
   1511       return async(launch::async|launch::deferred, std::forward<_Fn>(__fn),
   1512 		   std::forward<_Args>(__args)...);
   1513     }
   1514 
   1515 #endif // _GLIBCXX_HAS_GTHREADS && _GLIBCXX_USE_C99_STDINT_TR1
   1516        // && ATOMIC_INT_LOCK_FREE
   1517 
   1518   // @} group futures
   1519 _GLIBCXX_END_NAMESPACE_VERSION
   1520 } // namespace
   1521 
   1522 #endif // __GXX_EXPERIMENTAL_CXX0X__
   1523 
   1524 #endif // _GLIBCXX_FUTURE
   1525