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