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