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