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