1a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant//===------------------------- future.cpp ---------------------------------===// 2a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant// 3a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant// The LLVM Compiler Infrastructure 4a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant// 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant// 8a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant//===----------------------------------------------------------------------===// 9a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant 10a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant#include "future" 11a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant#include "string" 12a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant 13a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 14a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant 15a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnantclass _LIBCPP_HIDDEN __future_error_category 16a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant : public __do_message 17a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant{ 18a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnantpublic: 191e15fd1856a34a4bc0f7c1d649d2e22df9033326Howard Hinnant virtual const char* name() const _NOEXCEPT; 20a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant virtual string message(int ev) const; 21a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant}; 22a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant 23a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnantconst char* 241e15fd1856a34a4bc0f7c1d649d2e22df9033326Howard Hinnant__future_error_category::name() const _NOEXCEPT 25a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant{ 26a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant return "future"; 27a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant} 28a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant 298f48c23568a122de6088455700e9d197b79bd8f8Logan Chien#if defined(__clang__) 30cd942f1840386c4f6d37872793c563740a4a60b8Howard Hinnant#pragma clang diagnostic push 31cd942f1840386c4f6d37872793c563740a4a60b8Howard Hinnant#pragma clang diagnostic ignored "-Wswitch" 328f48c23568a122de6088455700e9d197b79bd8f8Logan Chien#elif defined(__GNUC__) || defined(__GNUG__) 338f48c23568a122de6088455700e9d197b79bd8f8Logan Chien#pragma GCC diagnostic push 348f48c23568a122de6088455700e9d197b79bd8f8Logan Chien#pragma GCC diagnostic ignored "-Wswitch" 358f48c23568a122de6088455700e9d197b79bd8f8Logan Chien#endif 36cd942f1840386c4f6d37872793c563740a4a60b8Howard Hinnant 37a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnantstring 38a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant__future_error_category::message(int ev) const 39a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant{ 40b1bc0c4975e70c49af0755aae1b7f7b373a7061bHoward Hinnant switch (static_cast<future_errc>(ev)) 41a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant { 42cd942f1840386c4f6d37872793c563740a4a60b8Howard Hinnant case future_errc(0): // For backwards compatibility with C++11 (LWG 2056) 43a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant case future_errc::broken_promise: 44a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant return string("The associated promise has been destructed prior " 45a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant "to the associated state becoming ready."); 46a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant case future_errc::future_already_retrieved: 47a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant return string("The future has already been retrieved from " 48a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant "the promise or packaged_task."); 49a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant case future_errc::promise_already_satisfied: 50a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant return string("The state of the promise has already been set."); 51a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant case future_errc::no_state: 52a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant return string("Operation not permitted on an object without " 53a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant "an associated state."); 54a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant } 55a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant return string("unspecified future_errc value\n"); 56a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant} 57a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant 588f48c23568a122de6088455700e9d197b79bd8f8Logan Chien#if defined(__clang__) 59cd942f1840386c4f6d37872793c563740a4a60b8Howard Hinnant#pragma clang diagnostic pop 608f48c23568a122de6088455700e9d197b79bd8f8Logan Chien#elif defined(__GNUC__) || defined(__GNUG__) 618f48c23568a122de6088455700e9d197b79bd8f8Logan Chien#pragma GCC diagnostic pop 628f48c23568a122de6088455700e9d197b79bd8f8Logan Chien#endif 63cd942f1840386c4f6d37872793c563740a4a60b8Howard Hinnant 64a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnantconst error_category& 658bf01ddd300b7168a6264d99a2613f804be9d284Howard Hinnantfuture_category() _NOEXCEPT 66a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant{ 67a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant static __future_error_category __f; 68a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant return __f; 69a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant} 70a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant 71a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnantfuture_error::future_error(error_code __ec) 72a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant : logic_error(__ec.message()), 73a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant __ec_(__ec) 74a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant{ 75a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant} 76a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant 77043fe1d93123ac56405165baff70c24d0a67bb33Howard Hinnantfuture_error::~future_error() _NOEXCEPT 78043fe1d93123ac56405165baff70c24d0a67bb33Howard Hinnant{ 79043fe1d93123ac56405165baff70c24d0a67bb33Howard Hinnant} 80043fe1d93123ac56405165baff70c24d0a67bb33Howard Hinnant 8147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid 821694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnant__assoc_sub_state::__on_zero_shared() _NOEXCEPT 8347499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{ 8447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant delete this; 8547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant} 8647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant 8747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid 8847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant__assoc_sub_state::set_value() 8947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{ 9047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant unique_lock<mutex> __lk(__mut_); 9122ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 9247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant if (__has_value()) 9347499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant throw future_error(make_error_code(future_errc::promise_already_satisfied)); 9422ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#endif 9547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant __state_ |= __constructed | ready; 9647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant __cv_.notify_all(); 971b031c947fb7534d18b63d216e0c575a9be5e562Howard Hinnant __lk.unlock(); 9847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant} 9947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant 10047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid 10147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant__assoc_sub_state::set_value_at_thread_exit() 10247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{ 10347499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant unique_lock<mutex> __lk(__mut_); 10422ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 10547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant if (__has_value()) 10647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant throw future_error(make_error_code(future_errc::promise_already_satisfied)); 10722ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#endif 10847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant __state_ |= __constructed; 1095306d68019dd52a3dc3989ff02958e3f21e9655cHoward Hinnant __thread_local_data()->__make_ready_at_thread_exit(this); 11047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant __lk.unlock(); 11147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant} 11247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant 11347499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid 11447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant__assoc_sub_state::set_exception(exception_ptr __p) 11547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{ 11647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant unique_lock<mutex> __lk(__mut_); 11722ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 11847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant if (__has_value()) 11947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant throw future_error(make_error_code(future_errc::promise_already_satisfied)); 12022ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#endif 12147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant __exception_ = __p; 12247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant __state_ |= ready; 12347499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant __lk.unlock(); 12447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant __cv_.notify_all(); 12547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant} 12647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant 12747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid 12847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant__assoc_sub_state::set_exception_at_thread_exit(exception_ptr __p) 12947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{ 13047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant unique_lock<mutex> __lk(__mut_); 13122ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 13247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant if (__has_value()) 13347499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant throw future_error(make_error_code(future_errc::promise_already_satisfied)); 13422ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#endif 13547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant __exception_ = __p; 1365306d68019dd52a3dc3989ff02958e3f21e9655cHoward Hinnant __thread_local_data()->__make_ready_at_thread_exit(this); 13747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant __lk.unlock(); 13847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant} 13947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant 14047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid 14147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant__assoc_sub_state::__make_ready() 14247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{ 14347499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant unique_lock<mutex> __lk(__mut_); 14447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant __state_ |= ready; 14547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant __lk.unlock(); 14647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant __cv_.notify_all(); 14747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant} 14847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant 14947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid 15047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant__assoc_sub_state::copy() 15147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{ 15247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant unique_lock<mutex> __lk(__mut_); 15354da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant __sub_wait(__lk); 15447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant if (__exception_ != nullptr) 15547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant rethrow_exception(__exception_); 15647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant} 15747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant 15847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid 15954da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant__assoc_sub_state::wait() 16047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{ 16147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant unique_lock<mutex> __lk(__mut_); 16254da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant __sub_wait(__lk); 16354da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant} 16454da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant 16554da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnantvoid 16654da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant__assoc_sub_state::__sub_wait(unique_lock<mutex>& __lk) 16754da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant{ 16854da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant if (!__is_ready()) 16954da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant { 170ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant if (__state_ & static_cast<unsigned>(deferred)) 17154da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant { 172ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant __state_ &= ~static_cast<unsigned>(deferred); 17354da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant __lk.unlock(); 17454da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant __execute(); 17554da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant } 17654da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant else 17754da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant while (!__is_ready()) 17854da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant __cv_.wait(__lk); 17954da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant } 18054da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant} 18154da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant 18254da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnantvoid 18354da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant__assoc_sub_state::__execute() 18454da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant{ 18522ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 18654da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant throw future_error(make_error_code(future_errc::no_state)); 18722ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#endif 18847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant} 18947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant 19047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantfuture<void>::future(__assoc_sub_state* __state) 19147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant : __state_(__state) 19247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{ 19322ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 19447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant if (__state_->__has_future_attached()) 19547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant throw future_error(make_error_code(future_errc::future_already_retrieved)); 19622ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#endif 19747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant __state_->__add_shared(); 19854da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant __state_->__set_future_attached(); 19947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant} 20047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant 20147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantfuture<void>::~future() 20247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{ 20347499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant if (__state_) 20447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant __state_->__release_shared(); 20547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant} 20647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant 20747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid 20847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantfuture<void>::get() 20947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{ 21054da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant unique_ptr<__shared_count, __release_shared_count> __(__state_); 21147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant __assoc_sub_state* __s = __state_; 21247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant __state_ = nullptr; 21354da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant __s->copy(); 21447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant} 21547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant 21647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantpromise<void>::promise() 21747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant : __state_(new __assoc_sub_state) 21847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{ 21947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant} 22047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant 22147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantpromise<void>::~promise() 22247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{ 22347499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant if (__state_) 22447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant { 22547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant if (!__state_->__has_value() && __state_->use_count() > 1) 22647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant __state_->set_exception(make_exception_ptr( 22747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant future_error(make_error_code(future_errc::broken_promise)) 22847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant )); 22947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant __state_->__release_shared(); 23047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant } 23147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant} 23247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant 23347499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantfuture<void> 23447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantpromise<void>::get_future() 23547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{ 23622ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 23747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant if (__state_ == nullptr) 23847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant throw future_error(make_error_code(future_errc::no_state)); 23922ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#endif 24047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant return future<void>(__state_); 24147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant} 24247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant 24347499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid 24447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantpromise<void>::set_value() 24547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{ 24622ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 24747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant if (__state_ == nullptr) 24847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant throw future_error(make_error_code(future_errc::no_state)); 24922ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#endif 25047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant __state_->set_value(); 25147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant} 25247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant 25347499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid 25447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantpromise<void>::set_exception(exception_ptr __p) 25547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{ 25622ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 25747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant if (__state_ == nullptr) 25847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant throw future_error(make_error_code(future_errc::no_state)); 25922ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#endif 26047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant __state_->set_exception(__p); 26147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant} 26247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant 26347499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid 26447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantpromise<void>::set_value_at_thread_exit() 26547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{ 26622ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 26747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant if (__state_ == nullptr) 26847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant throw future_error(make_error_code(future_errc::no_state)); 26922ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#endif 27047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant __state_->set_value_at_thread_exit(); 27147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant} 27247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant 27347499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid 27447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantpromise<void>::set_exception_at_thread_exit(exception_ptr __p) 27547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{ 27622ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 27747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant if (__state_ == nullptr) 27847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant throw future_error(make_error_code(future_errc::no_state)); 27922ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#endif 28047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant __state_->set_exception_at_thread_exit(__p); 28147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant} 28247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant 28399be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnantshared_future<void>::~shared_future() 28499be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant{ 28599be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant if (__state_) 28699be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant __state_->__release_shared(); 28799be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant} 28899be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant 28999be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnantshared_future<void>& 29099be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnantshared_future<void>::operator=(const shared_future& __rhs) 29199be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant{ 29299be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant if (__rhs.__state_) 29399be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant __rhs.__state_->__add_shared(); 29499be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant if (__state_) 29599be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant __state_->__release_shared(); 29699be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant __state_ = __rhs.__state_; 29799be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant return *this; 29899be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant} 29999be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant 300a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant_LIBCPP_END_NAMESPACE_STD 301