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
107112dae6acac544a0271a85d95342c583441e2d1Dan Albert#include "__config"
117112dae6acac544a0271a85d95342c583441e2d1Dan Albert
127112dae6acac544a0271a85d95342c583441e2d1Dan Albert#ifndef _LIBCPP_HAS_NO_THREADS
137112dae6acac544a0271a85d95342c583441e2d1Dan Albert
14a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant#include "future"
15a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant#include "string"
16a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant
17a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
18a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant
19a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnantclass _LIBCPP_HIDDEN __future_error_category
20a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant    : public __do_message
21a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant{
22a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnantpublic:
231e15fd1856a34a4bc0f7c1d649d2e22df9033326Howard Hinnant    virtual const char* name() const _NOEXCEPT;
24a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant    virtual string message(int ev) const;
25a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant};
26a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant
27a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnantconst char*
281e15fd1856a34a4bc0f7c1d649d2e22df9033326Howard Hinnant__future_error_category::name() const _NOEXCEPT
29a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant{
30a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant    return "future";
31a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant}
32a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant
338f48c23568a122de6088455700e9d197b79bd8f8Logan Chien#if defined(__clang__)
34cd942f1840386c4f6d37872793c563740a4a60b8Howard Hinnant#pragma clang diagnostic push
35cd942f1840386c4f6d37872793c563740a4a60b8Howard Hinnant#pragma clang diagnostic ignored "-Wswitch"
368f48c23568a122de6088455700e9d197b79bd8f8Logan Chien#elif defined(__GNUC__) || defined(__GNUG__)
378f48c23568a122de6088455700e9d197b79bd8f8Logan Chien#pragma GCC diagnostic push
388f48c23568a122de6088455700e9d197b79bd8f8Logan Chien#pragma GCC diagnostic ignored "-Wswitch"
398f48c23568a122de6088455700e9d197b79bd8f8Logan Chien#endif
40cd942f1840386c4f6d37872793c563740a4a60b8Howard Hinnant
41a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnantstring
42a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant__future_error_category::message(int ev) const
43a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant{
44b1bc0c4975e70c49af0755aae1b7f7b373a7061bHoward Hinnant    switch (static_cast<future_errc>(ev))
45a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant    {
46cd942f1840386c4f6d37872793c563740a4a60b8Howard Hinnant    case future_errc(0):  // For backwards compatibility with C++11 (LWG 2056)
47a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant    case future_errc::broken_promise:
48a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant        return string("The associated promise has been destructed prior "
49a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant                      "to the associated state becoming ready.");
50a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant    case future_errc::future_already_retrieved:
51a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant        return string("The future has already been retrieved from "
52a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant                      "the promise or packaged_task.");
53a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant    case future_errc::promise_already_satisfied:
54a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant        return string("The state of the promise has already been set.");
55a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant    case future_errc::no_state:
56a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant        return string("Operation not permitted on an object without "
57a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant                      "an associated state.");
58a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant    }
59a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant    return string("unspecified future_errc value\n");
60a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant}
61a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant
628f48c23568a122de6088455700e9d197b79bd8f8Logan Chien#if defined(__clang__)
63cd942f1840386c4f6d37872793c563740a4a60b8Howard Hinnant#pragma clang diagnostic pop
648f48c23568a122de6088455700e9d197b79bd8f8Logan Chien#elif defined(__GNUC__) || defined(__GNUG__)
658f48c23568a122de6088455700e9d197b79bd8f8Logan Chien#pragma GCC diagnostic pop
668f48c23568a122de6088455700e9d197b79bd8f8Logan Chien#endif
67cd942f1840386c4f6d37872793c563740a4a60b8Howard Hinnant
68a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnantconst error_category&
698bf01ddd300b7168a6264d99a2613f804be9d284Howard Hinnantfuture_category() _NOEXCEPT
70a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant{
71a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant    static __future_error_category __f;
72a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant    return __f;
73a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant}
74a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant
75a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnantfuture_error::future_error(error_code __ec)
76a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant    : logic_error(__ec.message()),
77a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant      __ec_(__ec)
78a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant{
79a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant}
80a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant
81043fe1d93123ac56405165baff70c24d0a67bb33Howard Hinnantfuture_error::~future_error() _NOEXCEPT
82043fe1d93123ac56405165baff70c24d0a67bb33Howard Hinnant{
83043fe1d93123ac56405165baff70c24d0a67bb33Howard Hinnant}
84043fe1d93123ac56405165baff70c24d0a67bb33Howard Hinnant
8547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid
861694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnant__assoc_sub_state::__on_zero_shared() _NOEXCEPT
8747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{
8847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    delete this;
8947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant}
9047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant
9147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid
9247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant__assoc_sub_state::set_value()
9347499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{
9447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    unique_lock<mutex> __lk(__mut_);
9522ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
9647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    if (__has_value())
9747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant        throw future_error(make_error_code(future_errc::promise_already_satisfied));
9822ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#endif
9947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    __state_ |= __constructed | ready;
10047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    __cv_.notify_all();
1011b031c947fb7534d18b63d216e0c575a9be5e562Howard Hinnant    __lk.unlock();
10247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant}
10347499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant
10447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid
10547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant__assoc_sub_state::set_value_at_thread_exit()
10647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{
10747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    unique_lock<mutex> __lk(__mut_);
10822ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
10947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    if (__has_value())
11047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant        throw future_error(make_error_code(future_errc::promise_already_satisfied));
11122ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#endif
11247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    __state_ |= __constructed;
1135306d68019dd52a3dc3989ff02958e3f21e9655cHoward Hinnant    __thread_local_data()->__make_ready_at_thread_exit(this);
11447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    __lk.unlock();
11547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant}
11647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant
11747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid
11847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant__assoc_sub_state::set_exception(exception_ptr __p)
11947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{
12047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    unique_lock<mutex> __lk(__mut_);
12122ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
12247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    if (__has_value())
12347499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant        throw future_error(make_error_code(future_errc::promise_already_satisfied));
12422ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#endif
12547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    __exception_ = __p;
12647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    __state_ |= ready;
12747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    __lk.unlock();
12847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    __cv_.notify_all();
12947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant}
13047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant
13147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid
13247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant__assoc_sub_state::set_exception_at_thread_exit(exception_ptr __p)
13347499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{
13447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    unique_lock<mutex> __lk(__mut_);
13522ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
13647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    if (__has_value())
13747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant        throw future_error(make_error_code(future_errc::promise_already_satisfied));
13822ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#endif
13947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    __exception_ = __p;
1405306d68019dd52a3dc3989ff02958e3f21e9655cHoward Hinnant    __thread_local_data()->__make_ready_at_thread_exit(this);
14147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    __lk.unlock();
14247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant}
14347499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant
14447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid
14547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant__assoc_sub_state::__make_ready()
14647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{
14747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    unique_lock<mutex> __lk(__mut_);
14847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    __state_ |= ready;
14947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    __lk.unlock();
15047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    __cv_.notify_all();
15147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant}
15247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant
15347499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid
15447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant__assoc_sub_state::copy()
15547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{
15647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    unique_lock<mutex> __lk(__mut_);
15754da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant    __sub_wait(__lk);
15847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    if (__exception_ != nullptr)
15947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant        rethrow_exception(__exception_);
16047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant}
16147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant
16247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid
16354da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant__assoc_sub_state::wait()
16447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{
16547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    unique_lock<mutex> __lk(__mut_);
16654da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant    __sub_wait(__lk);
16754da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant}
16854da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant
16954da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnantvoid
17054da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant__assoc_sub_state::__sub_wait(unique_lock<mutex>& __lk)
17154da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant{
17254da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant    if (!__is_ready())
17354da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant    {
174ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        if (__state_ & static_cast<unsigned>(deferred))
17554da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant        {
176ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            __state_ &= ~static_cast<unsigned>(deferred);
17754da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant            __lk.unlock();
17854da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant            __execute();
17954da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant        }
18054da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant        else
18154da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant            while (!__is_ready())
18254da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant                __cv_.wait(__lk);
18354da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant    }
18454da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant}
18554da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant
18654da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnantvoid
18754da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant__assoc_sub_state::__execute()
18854da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant{
18922ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
19054da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant    throw future_error(make_error_code(future_errc::no_state));
19122ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#endif
19247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant}
19347499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant
19447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantfuture<void>::future(__assoc_sub_state* __state)
19547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    : __state_(__state)
19647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{
19722ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
19847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    if (__state_->__has_future_attached())
19947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant        throw future_error(make_error_code(future_errc::future_already_retrieved));
20022ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#endif
20147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    __state_->__add_shared();
20254da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant    __state_->__set_future_attached();
20347499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant}
20447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant
20547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantfuture<void>::~future()
20647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{
20747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    if (__state_)
20847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant        __state_->__release_shared();
20947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant}
21047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant
21147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid
21247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantfuture<void>::get()
21347499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{
21454da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant    unique_ptr<__shared_count, __release_shared_count> __(__state_);
21547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    __assoc_sub_state* __s = __state_;
21647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    __state_ = nullptr;
21754da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant    __s->copy();
21847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant}
21947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant
22047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantpromise<void>::promise()
22147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    : __state_(new __assoc_sub_state)
22247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{
22347499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant}
22447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant
22547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantpromise<void>::~promise()
22647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{
22747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    if (__state_)
22847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    {
22947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant        if (!__state_->__has_value() && __state_->use_count() > 1)
23047499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant            __state_->set_exception(make_exception_ptr(
23147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant                      future_error(make_error_code(future_errc::broken_promise))
23247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant                                                      ));
23347499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant        __state_->__release_shared();
23447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    }
23547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant}
23647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant
23747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantfuture<void>
23847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantpromise<void>::get_future()
23947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{
24022ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
24147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    if (__state_ == nullptr)
24247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant        throw future_error(make_error_code(future_errc::no_state));
24322ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#endif
24447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    return future<void>(__state_);
24547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant}
24647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant
24747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid
24847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantpromise<void>::set_value()
24947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{
25022ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
25147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    if (__state_ == nullptr)
25247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant        throw future_error(make_error_code(future_errc::no_state));
25322ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#endif
25447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    __state_->set_value();
25547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant}
25647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant
25747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid
25847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantpromise<void>::set_exception(exception_ptr __p)
25947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{
26022ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
26147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    if (__state_ == nullptr)
26247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant        throw future_error(make_error_code(future_errc::no_state));
26322ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#endif
26447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    __state_->set_exception(__p);
26547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant}
26647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant
26747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid
26847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantpromise<void>::set_value_at_thread_exit()
26947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{
27022ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
27147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    if (__state_ == nullptr)
27247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant        throw future_error(make_error_code(future_errc::no_state));
27322ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#endif
27447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    __state_->set_value_at_thread_exit();
27547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant}
27647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant
27747499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantvoid
27847499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnantpromise<void>::set_exception_at_thread_exit(exception_ptr __p)
27947499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant{
28022ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
28147499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    if (__state_ == nullptr)
28247499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant        throw future_error(make_error_code(future_errc::no_state));
28322ba71b8efecd6be5cad52b4201b6887205260ccHoward Hinnant#endif
28447499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant    __state_->set_exception_at_thread_exit(__p);
28547499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant}
28647499b162ae741a247e5f89b7bdb513e51c3648aHoward Hinnant
28799be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnantshared_future<void>::~shared_future()
28899be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant{
28999be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant    if (__state_)
29099be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        __state_->__release_shared();
29199be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant}
29299be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant
29399be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnantshared_future<void>&
29499be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnantshared_future<void>::operator=(const shared_future& __rhs)
29599be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant{
29699be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant    if (__rhs.__state_)
29799be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        __rhs.__state_->__add_shared();
29899be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant    if (__state_)
29999be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        __state_->__release_shared();
30099be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant    __state_ = __rhs.__state_;
30199be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant    return *this;
30299be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant}
30399be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant
304a652172d86b1063983c20bfc1c3f9d44d0e7c5bcHoward Hinnant_LIBCPP_END_NAMESPACE_STD
3057112dae6acac544a0271a85d95342c583441e2d1Dan Albert
3067112dae6acac544a0271a85d95342c583441e2d1Dan Albert#endif // !_LIBCPP_HAS_NO_THREADS
307