1 1.1 mrg // <future> -*- C++ -*- 2 1.1 mrg 3 1.1.1.18 mrg // Copyright (C) 2009-2024 Free Software Foundation, Inc. 4 1.1 mrg // 5 1.1 mrg // This file is part of the GNU ISO C++ Library. This library is free 6 1.1 mrg // software; you can redistribute it and/or modify it under the 7 1.1 mrg // terms of the GNU General Public License as published by the 8 1.1 mrg // Free Software Foundation; either version 3, or (at your option) 9 1.1 mrg // any later version. 10 1.1 mrg 11 1.1 mrg // This library is distributed in the hope that it will be useful, 12 1.1 mrg // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 1.1 mrg // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 1.1 mrg // GNU General Public License for more details. 15 1.1 mrg 16 1.1 mrg // Under Section 7 of GPL version 3, you are granted additional 17 1.1 mrg // permissions described in the GCC Runtime Library Exception, version 18 1.1 mrg // 3.1, as published by the Free Software Foundation. 19 1.1 mrg 20 1.1 mrg // You should have received a copy of the GNU General Public License and 21 1.1 mrg // a copy of the GCC Runtime Library Exception along with this program; 22 1.1 mrg // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 1.1 mrg // <http://www.gnu.org/licenses/>. 24 1.1 mrg 25 1.1.1.2 mrg /** @file include/future 26 1.1 mrg * This is a Standard C++ Library header. 27 1.1 mrg */ 28 1.1 mrg 29 1.1 mrg #ifndef _GLIBCXX_FUTURE 30 1.1 mrg #define _GLIBCXX_FUTURE 1 31 1.1 mrg 32 1.1 mrg #pragma GCC system_header 33 1.1 mrg 34 1.1.1.18 mrg #include <bits/requires_hosted.h> // concurrency 35 1.1.1.18 mrg 36 1.1.1.2 mrg #if __cplusplus < 201103L 37 1.1 mrg # include <bits/c++0x_warning.h> 38 1.1 mrg #else 39 1.1 mrg 40 1.1.1.16 mrg #include <mutex> // call_once 41 1.1.1.16 mrg #include <condition_variable> // __at_thread_exit_elt 42 1.1 mrg #include <system_error> 43 1.1.1.16 mrg #include <bits/atomic_base.h> // atomic_flag 44 1.1.1.16 mrg #include <bits/allocated_ptr.h> 45 1.1.1.6 mrg #include <bits/atomic_futex.h> 46 1.1.1.16 mrg #include <bits/exception_defines.h> 47 1.1.1.9 mrg #include <bits/invoke.h> 48 1.1.1.2 mrg #include <bits/unique_ptr.h> 49 1.1.1.2 mrg #include <bits/shared_ptr.h> 50 1.1.1.9 mrg #include <bits/std_function.h> 51 1.1.1.16 mrg #include <bits/std_thread.h> 52 1.1.1.2 mrg #include <bits/uses_allocator.h> 53 1.1.1.6 mrg #include <ext/aligned_buffer.h> 54 1.1 mrg 55 1.1.1.2 mrg namespace std _GLIBCXX_VISIBILITY(default) 56 1.1 mrg { 57 1.1.1.2 mrg _GLIBCXX_BEGIN_NAMESPACE_VERSION 58 1.1.1.2 mrg 59 1.1 mrg /** 60 1.1 mrg * @defgroup futures Futures 61 1.1 mrg * @ingroup concurrency 62 1.1 mrg * 63 1.1.1.16 mrg * Futures and promises provide support for retrieving the result from 64 1.1.1.16 mrg * an asynchronous function, e.g. one that is running in another thread. 65 1.1.1.16 mrg * A `std::future` represents an asynchronous result that will become 66 1.1.1.16 mrg * ready at some later time. A consumer can wait on a future until the 67 1.1.1.16 mrg * result is ready to be accessed. 68 1.1.1.16 mrg * 69 1.1.1.16 mrg * @since C++11 70 1.1 mrg * @{ 71 1.1 mrg */ 72 1.1 mrg 73 1.1 mrg /// Error code for futures 74 1.1 mrg enum class future_errc 75 1.1 mrg { 76 1.1.1.2 mrg future_already_retrieved = 1, 77 1.1 mrg promise_already_satisfied, 78 1.1.1.2 mrg no_state, 79 1.1.1.2 mrg broken_promise 80 1.1 mrg }; 81 1.1 mrg 82 1.1.1.16 mrg /// Specialization that allows `future_errc` to convert to `error_code`. 83 1.1 mrg template<> 84 1.1 mrg struct is_error_code_enum<future_errc> : public true_type { }; 85 1.1 mrg 86 1.1 mrg /// Points to a statically-allocated object derived from error_category. 87 1.1.1.16 mrg [[__nodiscard__, __gnu__::__const__]] 88 1.1.1.2 mrg const error_category& 89 1.1.1.2 mrg future_category() noexcept; 90 1.1 mrg 91 1.1.1.16 mrg /// Overload of make_error_code for `future_errc`. 92 1.1.1.16 mrg [[__nodiscard__]] 93 1.1.1.2 mrg inline error_code 94 1.1.1.2 mrg make_error_code(future_errc __errc) noexcept 95 1.1.1.2 mrg { return error_code(static_cast<int>(__errc), future_category()); } 96 1.1.1.2 mrg 97 1.1.1.16 mrg /// Overload of make_error_condition for `future_errc`. 98 1.1.1.16 mrg [[__nodiscard__]] 99 1.1.1.2 mrg inline error_condition 100 1.1.1.2 mrg make_error_condition(future_errc __errc) noexcept 101 1.1.1.2 mrg { return error_condition(static_cast<int>(__errc), future_category()); } 102 1.1 mrg 103 1.1 mrg /** 104 1.1 mrg * @brief Exception type thrown by futures. 105 1.1 mrg * @ingroup exceptions 106 1.1.1.16 mrg * @since C++11 107 1.1 mrg */ 108 1.1 mrg class future_error : public logic_error 109 1.1 mrg { 110 1.1 mrg public: 111 1.1.1.9 mrg explicit 112 1.1.1.9 mrg future_error(future_errc __errc) 113 1.1.1.9 mrg : future_error(std::make_error_code(__errc)) 114 1.1 mrg { } 115 1.1 mrg 116 1.1.1.2 mrg virtual ~future_error() noexcept; 117 1.1 mrg 118 1.1.1.2 mrg virtual const char* 119 1.1.1.2 mrg what() const noexcept; 120 1.1 mrg 121 1.1.1.2 mrg const error_code& 122 1.1.1.2 mrg code() const noexcept { return _M_code; } 123 1.1.1.9 mrg 124 1.1.1.9 mrg private: 125 1.1.1.9 mrg explicit 126 1.1.1.9 mrg future_error(error_code __ec) 127 1.1.1.9 mrg : logic_error("std::future_error: " + __ec.message()), _M_code(__ec) 128 1.1.1.9 mrg { } 129 1.1.1.9 mrg 130 1.1.1.9 mrg friend void __throw_future_error(int); 131 1.1.1.9 mrg 132 1.1.1.9 mrg error_code _M_code; 133 1.1 mrg }; 134 1.1 mrg 135 1.1 mrg // Forward declarations. 136 1.1 mrg template<typename _Res> 137 1.1 mrg class future; 138 1.1 mrg 139 1.1 mrg template<typename _Res> 140 1.1 mrg class shared_future; 141 1.1 mrg 142 1.1.1.2 mrg template<typename _Signature> 143 1.1 mrg class packaged_task; 144 1.1 mrg 145 1.1 mrg template<typename _Res> 146 1.1 mrg class promise; 147 1.1 mrg 148 1.1.1.2 mrg /// Launch code for futures 149 1.1.1.2 mrg enum class launch 150 1.1.1.2 mrg { 151 1.1.1.2 mrg async = 1, 152 1.1.1.2 mrg deferred = 2 153 1.1.1.2 mrg }; 154 1.1.1.2 mrg 155 1.1.1.18 mrg [[__nodiscard__]] 156 1.1.1.16 mrg constexpr launch operator&(launch __x, launch __y) noexcept 157 1.1.1.2 mrg { 158 1.1.1.2 mrg return static_cast<launch>( 159 1.1.1.2 mrg static_cast<int>(__x) & static_cast<int>(__y)); 160 1.1.1.2 mrg } 161 1.1.1.2 mrg 162 1.1.1.18 mrg [[__nodiscard__]] 163 1.1.1.16 mrg constexpr launch operator|(launch __x, launch __y) noexcept 164 1.1.1.2 mrg { 165 1.1.1.2 mrg return static_cast<launch>( 166 1.1.1.2 mrg static_cast<int>(__x) | static_cast<int>(__y)); 167 1.1.1.2 mrg } 168 1.1.1.2 mrg 169 1.1.1.18 mrg [[__nodiscard__]] 170 1.1.1.16 mrg constexpr launch operator^(launch __x, launch __y) noexcept 171 1.1.1.2 mrg { 172 1.1.1.2 mrg return static_cast<launch>( 173 1.1.1.2 mrg static_cast<int>(__x) ^ static_cast<int>(__y)); 174 1.1.1.2 mrg } 175 1.1.1.2 mrg 176 1.1.1.18 mrg [[__nodiscard__]] 177 1.1.1.16 mrg constexpr launch operator~(launch __x) noexcept 178 1.1.1.2 mrg { return static_cast<launch>(~static_cast<int>(__x)); } 179 1.1.1.2 mrg 180 1.1.1.18 mrg _GLIBCXX14_CONSTEXPR 181 1.1.1.16 mrg inline launch& operator&=(launch& __x, launch __y) noexcept 182 1.1.1.2 mrg { return __x = __x & __y; } 183 1.1.1.2 mrg 184 1.1.1.18 mrg _GLIBCXX14_CONSTEXPR 185 1.1.1.16 mrg inline launch& operator|=(launch& __x, launch __y) noexcept 186 1.1.1.2 mrg { return __x = __x | __y; } 187 1.1.1.2 mrg 188 1.1.1.18 mrg _GLIBCXX14_CONSTEXPR 189 1.1.1.16 mrg inline launch& operator^=(launch& __x, launch __y) noexcept 190 1.1.1.2 mrg { return __x = __x ^ __y; } 191 1.1.1.2 mrg 192 1.1.1.2 mrg /// Status code for futures 193 1.1.1.2 mrg enum class future_status 194 1.1.1.2 mrg { 195 1.1.1.2 mrg ready, 196 1.1.1.2 mrg timeout, 197 1.1.1.2 mrg deferred 198 1.1.1.2 mrg }; 199 1.1 mrg 200 1.1.1.16 mrg /// @cond undocumented 201 1.1.1.7 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 202 1.1.1.7 mrg // 2021. Further incorrect usages of result_of 203 1.1 mrg template<typename _Fn, typename... _Args> 204 1.1.1.13 mrg using __async_result_of = typename __invoke_result< 205 1.1.1.13 mrg typename decay<_Fn>::type, typename decay<_Args>::type...>::type; 206 1.1.1.16 mrg /// @endcond 207 1.1.1.7 mrg 208 1.1.1.7 mrg template<typename _Fn, typename... _Args> 209 1.1.1.7 mrg future<__async_result_of<_Fn, _Args...>> 210 1.1 mrg async(launch __policy, _Fn&& __fn, _Args&&... __args); 211 1.1 mrg 212 1.1 mrg template<typename _Fn, typename... _Args> 213 1.1.1.7 mrg future<__async_result_of<_Fn, _Args...>> 214 1.1 mrg async(_Fn&& __fn, _Args&&... __args); 215 1.1 mrg 216 1.1.1.13 mrg #if defined(_GLIBCXX_HAS_GTHREADS) 217 1.1 mrg 218 1.1.1.16 mrg /// @cond undocumented 219 1.1.1.16 mrg 220 1.1 mrg /// Base class and enclosing scope. 221 1.1 mrg struct __future_base 222 1.1 mrg { 223 1.1 mrg /// Base class for results. 224 1.1 mrg struct _Result_base 225 1.1 mrg { 226 1.1 mrg exception_ptr _M_error; 227 1.1 mrg 228 1.1 mrg _Result_base(const _Result_base&) = delete; 229 1.1 mrg _Result_base& operator=(const _Result_base&) = delete; 230 1.1 mrg 231 1.1 mrg // _M_destroy() allows derived classes to control deallocation 232 1.1 mrg virtual void _M_destroy() = 0; 233 1.1 mrg 234 1.1 mrg struct _Deleter 235 1.1 mrg { 236 1.1 mrg void operator()(_Result_base* __fr) const { __fr->_M_destroy(); } 237 1.1 mrg }; 238 1.1 mrg 239 1.1 mrg protected: 240 1.1.1.2 mrg _Result_base(); 241 1.1.1.2 mrg virtual ~_Result_base(); 242 1.1 mrg }; 243 1.1 mrg 244 1.1.1.6 mrg /// A unique_ptr for result objects. 245 1.1.1.6 mrg template<typename _Res> 246 1.1.1.6 mrg using _Ptr = unique_ptr<_Res, _Result_base::_Deleter>; 247 1.1.1.6 mrg 248 1.1.1.6 mrg /// A result object that has storage for an object of type _Res. 249 1.1 mrg template<typename _Res> 250 1.1 mrg struct _Result : _Result_base 251 1.1 mrg { 252 1.1 mrg private: 253 1.1.1.6 mrg __gnu_cxx::__aligned_buffer<_Res> _M_storage; 254 1.1.1.6 mrg bool _M_initialized; 255 1.1 mrg 256 1.1 mrg public: 257 1.1.1.2 mrg typedef _Res result_type; 258 1.1.1.2 mrg 259 1.1.1.2 mrg _Result() noexcept : _M_initialized() { } 260 1.1.1.9 mrg 261 1.1 mrg ~_Result() 262 1.1 mrg { 263 1.1 mrg if (_M_initialized) 264 1.1 mrg _M_value().~_Res(); 265 1.1 mrg } 266 1.1 mrg 267 1.1 mrg // Return lvalue, future will add const or rvalue-reference 268 1.1.1.2 mrg _Res& 269 1.1.1.6 mrg _M_value() noexcept { return *_M_storage._M_ptr(); } 270 1.1 mrg 271 1.1 mrg void 272 1.1 mrg _M_set(const _Res& __res) 273 1.1 mrg { 274 1.1.1.6 mrg ::new (_M_storage._M_addr()) _Res(__res); 275 1.1 mrg _M_initialized = true; 276 1.1 mrg } 277 1.1 mrg 278 1.1 mrg void 279 1.1 mrg _M_set(_Res&& __res) 280 1.1 mrg { 281 1.1.1.6 mrg ::new (_M_storage._M_addr()) _Res(std::move(__res)); 282 1.1 mrg _M_initialized = true; 283 1.1 mrg } 284 1.1 mrg 285 1.1 mrg private: 286 1.1 mrg void _M_destroy() { delete this; } 287 1.1 mrg }; 288 1.1 mrg 289 1.1.1.6 mrg /// A result object that uses an allocator. 290 1.1 mrg template<typename _Res, typename _Alloc> 291 1.1.1.2 mrg struct _Result_alloc final : _Result<_Res>, _Alloc 292 1.1 mrg { 293 1.1.1.6 mrg using __allocator_type = __alloc_rebind<_Alloc, _Result_alloc>; 294 1.1 mrg 295 1.1 mrg explicit 296 1.1.1.2 mrg _Result_alloc(const _Alloc& __a) : _Result<_Res>(), _Alloc(__a) 297 1.1.1.6 mrg { } 298 1.1.1.9 mrg 299 1.1 mrg private: 300 1.1 mrg void _M_destroy() 301 1.1.1.6 mrg { 302 1.1.1.6 mrg __allocator_type __a(*this); 303 1.1.1.6 mrg __allocated_ptr<__allocator_type> __guard_ptr{ __a, this }; 304 1.1.1.6 mrg this->~_Result_alloc(); 305 1.1.1.6 mrg } 306 1.1.1.2 mrg }; 307 1.1 mrg 308 1.1.1.6 mrg // Create a result object that uses an allocator. 309 1.1 mrg template<typename _Res, typename _Allocator> 310 1.1.1.2 mrg static _Ptr<_Result_alloc<_Res, _Allocator>> 311 1.1 mrg _S_allocate_result(const _Allocator& __a) 312 1.1 mrg { 313 1.1.1.6 mrg using __result_type = _Result_alloc<_Res, _Allocator>; 314 1.1.1.6 mrg typename __result_type::__allocator_type __a2(__a); 315 1.1.1.6 mrg auto __guard = std::__allocate_guarded(__a2); 316 1.1.1.6 mrg __result_type* __p = ::new((void*)__guard.get()) __result_type{__a}; 317 1.1.1.6 mrg __guard = nullptr; 318 1.1.1.6 mrg return _Ptr<__result_type>(__p); 319 1.1 mrg } 320 1.1 mrg 321 1.1.1.6 mrg // Keep it simple for std::allocator. 322 1.1.1.2 mrg template<typename _Res, typename _Tp> 323 1.1.1.2 mrg static _Ptr<_Result<_Res>> 324 1.1.1.18 mrg _S_allocate_result(const std::allocator<_Tp>&) 325 1.1.1.2 mrg { 326 1.1.1.2 mrg return _Ptr<_Result<_Res>>(new _Result<_Res>); 327 1.1.1.2 mrg } 328 1.1 mrg 329 1.1.1.6 mrg // Base class for various types of shared state created by an 330 1.1.1.6 mrg // asynchronous provider (such as a std::promise) and shared with one 331 1.1.1.6 mrg // or more associated futures. 332 1.1.1.6 mrg class _State_baseV2 333 1.1 mrg { 334 1.1.1.2 mrg typedef _Ptr<_Result_base> _Ptr_type; 335 1.1 mrg 336 1.1.1.6 mrg enum _Status : unsigned { 337 1.1.1.6 mrg __not_ready, 338 1.1.1.6 mrg __ready 339 1.1.1.6 mrg }; 340 1.1.1.6 mrg 341 1.1 mrg _Ptr_type _M_result; 342 1.1.1.6 mrg __atomic_futex_unsigned<> _M_status; 343 1.1.1.6 mrg atomic_flag _M_retrieved = ATOMIC_FLAG_INIT; 344 1.1 mrg once_flag _M_once; 345 1.1 mrg 346 1.1 mrg public: 347 1.1.1.6 mrg _State_baseV2() noexcept : _M_result(), _M_status(_Status::__not_ready) 348 1.1.1.6 mrg { } 349 1.1.1.6 mrg _State_baseV2(const _State_baseV2&) = delete; 350 1.1.1.6 mrg _State_baseV2& operator=(const _State_baseV2&) = delete; 351 1.1.1.6 mrg virtual ~_State_baseV2() = default; 352 1.1 mrg 353 1.1 mrg _Result_base& 354 1.1 mrg wait() 355 1.1 mrg { 356 1.1.1.6 mrg // Run any deferred function or join any asynchronous thread: 357 1.1.1.6 mrg _M_complete_async(); 358 1.1.1.6 mrg // Acquire MO makes sure this synchronizes with the thread that made 359 1.1.1.6 mrg // the future ready. 360 1.1.1.6 mrg _M_status._M_load_when_equal(_Status::__ready, memory_order_acquire); 361 1.1 mrg return *_M_result; 362 1.1 mrg } 363 1.1 mrg 364 1.1 mrg template<typename _Rep, typename _Period> 365 1.1.1.2 mrg future_status 366 1.1 mrg wait_for(const chrono::duration<_Rep, _Period>& __rel) 367 1.1 mrg { 368 1.1.1.6 mrg // First, check if the future has been made ready. Use acquire MO 369 1.1.1.6 mrg // to synchronize with the thread that made it ready. 370 1.1.1.6 mrg if (_M_status._M_load(memory_order_acquire) == _Status::__ready) 371 1.1.1.2 mrg return future_status::ready; 372 1.1.1.14 mrg 373 1.1.1.6 mrg if (_M_is_deferred_future()) 374 1.1.1.6 mrg return future_status::deferred; 375 1.1.1.14 mrg 376 1.1.1.14 mrg // Don't wait unless the relative time is greater than zero. 377 1.1.1.14 mrg if (__rel > __rel.zero() 378 1.1.1.14 mrg && _M_status._M_load_when_equal_for(_Status::__ready, 379 1.1.1.14 mrg memory_order_acquire, 380 1.1.1.14 mrg __rel)) 381 1.1.1.6 mrg { 382 1.1.1.6 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 383 1.1.1.6 mrg // 2100. timed waiting functions must also join 384 1.1.1.6 mrg // This call is a no-op by default except on an async future, 385 1.1.1.6 mrg // in which case the async thread is joined. It's also not a 386 1.1.1.6 mrg // no-op for a deferred future, but such a future will never 387 1.1.1.6 mrg // reach this point because it returns future_status::deferred 388 1.1.1.6 mrg // instead of waiting for the future to become ready (see 389 1.1.1.6 mrg // above). Async futures synchronize in this call, so we need 390 1.1.1.6 mrg // no further synchronization here. 391 1.1.1.6 mrg _M_complete_async(); 392 1.1.1.6 mrg 393 1.1.1.6 mrg return future_status::ready; 394 1.1.1.6 mrg } 395 1.1.1.2 mrg return future_status::timeout; 396 1.1 mrg } 397 1.1 mrg 398 1.1 mrg template<typename _Clock, typename _Duration> 399 1.1.1.2 mrg future_status 400 1.1 mrg wait_until(const chrono::time_point<_Clock, _Duration>& __abs) 401 1.1 mrg { 402 1.1.1.14 mrg #if __cplusplus > 201703L 403 1.1.1.14 mrg static_assert(chrono::is_clock_v<_Clock>); 404 1.1.1.14 mrg #endif 405 1.1.1.6 mrg // First, check if the future has been made ready. Use acquire MO 406 1.1.1.6 mrg // to synchronize with the thread that made it ready. 407 1.1.1.6 mrg if (_M_status._M_load(memory_order_acquire) == _Status::__ready) 408 1.1.1.2 mrg return future_status::ready; 409 1.1.1.14 mrg 410 1.1.1.6 mrg if (_M_is_deferred_future()) 411 1.1.1.6 mrg return future_status::deferred; 412 1.1.1.14 mrg 413 1.1.1.6 mrg if (_M_status._M_load_when_equal_until(_Status::__ready, 414 1.1.1.14 mrg memory_order_acquire, 415 1.1.1.14 mrg __abs)) 416 1.1.1.6 mrg { 417 1.1.1.6 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 418 1.1.1.6 mrg // 2100. timed waiting functions must also join 419 1.1.1.6 mrg // See wait_for(...) above. 420 1.1.1.6 mrg _M_complete_async(); 421 1.1.1.6 mrg 422 1.1.1.6 mrg return future_status::ready; 423 1.1.1.6 mrg } 424 1.1.1.2 mrg return future_status::timeout; 425 1.1 mrg } 426 1.1 mrg 427 1.1.1.6 mrg // Provide a result to the shared state and make it ready. 428 1.1.1.6 mrg // Calls at most once: _M_result = __res(); 429 1.1 mrg void 430 1.1 mrg _M_set_result(function<_Ptr_type()> __res, bool __ignore_failure = false) 431 1.1 mrg { 432 1.1.1.6 mrg bool __did_set = false; 433 1.1 mrg // all calls to this function are serialized, 434 1.1 mrg // side-effects of invoking __res only happen once 435 1.1.1.6 mrg call_once(_M_once, &_State_baseV2::_M_do_set, this, 436 1.1.1.6 mrg std::__addressof(__res), std::__addressof(__did_set)); 437 1.1.1.6 mrg if (__did_set) 438 1.1.1.6 mrg // Use release MO to synchronize with observers of the ready state. 439 1.1.1.6 mrg _M_status._M_store_notify_all(_Status::__ready, 440 1.1.1.6 mrg memory_order_release); 441 1.1.1.4 mrg else if (!__ignore_failure) 442 1.1 mrg __throw_future_error(int(future_errc::promise_already_satisfied)); 443 1.1 mrg } 444 1.1 mrg 445 1.1.1.6 mrg // Provide a result to the shared state but delay making it ready 446 1.1.1.6 mrg // until the calling thread exits. 447 1.1.1.6 mrg // Calls at most once: _M_result = __res(); 448 1.1.1.6 mrg void 449 1.1.1.6 mrg _M_set_delayed_result(function<_Ptr_type()> __res, 450 1.1.1.6 mrg weak_ptr<_State_baseV2> __self) 451 1.1.1.6 mrg { 452 1.1.1.6 mrg bool __did_set = false; 453 1.1.1.6 mrg unique_ptr<_Make_ready> __mr{new _Make_ready}; 454 1.1.1.6 mrg // all calls to this function are serialized, 455 1.1.1.6 mrg // side-effects of invoking __res only happen once 456 1.1.1.6 mrg call_once(_M_once, &_State_baseV2::_M_do_set, this, 457 1.1.1.6 mrg std::__addressof(__res), std::__addressof(__did_set)); 458 1.1.1.6 mrg if (!__did_set) 459 1.1.1.6 mrg __throw_future_error(int(future_errc::promise_already_satisfied)); 460 1.1.1.6 mrg __mr->_M_shared_state = std::move(__self); 461 1.1.1.6 mrg __mr->_M_set(); 462 1.1.1.6 mrg __mr.release(); 463 1.1.1.6 mrg } 464 1.1.1.6 mrg 465 1.1.1.6 mrg // Abandon this shared state. 466 1.1 mrg void 467 1.1 mrg _M_break_promise(_Ptr_type __res) 468 1.1 mrg { 469 1.1 mrg if (static_cast<bool>(__res)) 470 1.1 mrg { 471 1.1.1.9 mrg __res->_M_error = 472 1.1.1.9 mrg make_exception_ptr(future_error(future_errc::broken_promise)); 473 1.1.1.6 mrg // This function is only called when the last asynchronous result 474 1.1.1.6 mrg // provider is abandoning this shared state, so noone can be 475 1.1.1.6 mrg // trying to make the shared state ready at the same time, and 476 1.1.1.6 mrg // we can access _M_result directly instead of through call_once. 477 1.1.1.6 mrg _M_result.swap(__res); 478 1.1.1.6 mrg // Use release MO to synchronize with observers of the ready state. 479 1.1.1.6 mrg _M_status._M_store_notify_all(_Status::__ready, 480 1.1.1.6 mrg memory_order_release); 481 1.1 mrg } 482 1.1 mrg } 483 1.1 mrg 484 1.1.1.6 mrg // Called when this object is first passed to a future. 485 1.1 mrg void 486 1.1 mrg _M_set_retrieved_flag() 487 1.1 mrg { 488 1.1 mrg if (_M_retrieved.test_and_set()) 489 1.1 mrg __throw_future_error(int(future_errc::future_already_retrieved)); 490 1.1 mrg } 491 1.1 mrg 492 1.1 mrg template<typename _Res, typename _Arg> 493 1.1 mrg struct _Setter; 494 1.1 mrg 495 1.1 mrg // set lvalues 496 1.1 mrg template<typename _Res, typename _Arg> 497 1.1 mrg struct _Setter<_Res, _Arg&> 498 1.1 mrg { 499 1.1 mrg // check this is only used by promise<R>::set_value(const R&) 500 1.1.1.6 mrg // or promise<R&>::set_value(R&) 501 1.1 mrg static_assert(is_same<_Res, _Arg&>::value // promise<R&> 502 1.1.1.6 mrg || is_same<const _Res, _Arg>::value, // promise<R> 503 1.1 mrg "Invalid specialisation"); 504 1.1 mrg 505 1.1.1.6 mrg // Used by std::promise to copy construct the result. 506 1.1.1.6 mrg typename promise<_Res>::_Ptr_type operator()() const 507 1.1 mrg { 508 1.1.1.6 mrg _M_promise->_M_storage->_M_set(*_M_arg); 509 1.1 mrg return std::move(_M_promise->_M_storage); 510 1.1 mrg } 511 1.1 mrg promise<_Res>* _M_promise; 512 1.1.1.6 mrg _Arg* _M_arg; 513 1.1 mrg }; 514 1.1 mrg 515 1.1 mrg // set rvalues 516 1.1 mrg template<typename _Res> 517 1.1 mrg struct _Setter<_Res, _Res&&> 518 1.1 mrg { 519 1.1.1.6 mrg // Used by std::promise to move construct the result. 520 1.1.1.6 mrg typename promise<_Res>::_Ptr_type operator()() const 521 1.1 mrg { 522 1.1.1.6 mrg _M_promise->_M_storage->_M_set(std::move(*_M_arg)); 523 1.1 mrg return std::move(_M_promise->_M_storage); 524 1.1 mrg } 525 1.1 mrg promise<_Res>* _M_promise; 526 1.1.1.6 mrg _Res* _M_arg; 527 1.1 mrg }; 528 1.1 mrg 529 1.1.1.8 mrg // set void 530 1.1.1.8 mrg template<typename _Res> 531 1.1.1.8 mrg struct _Setter<_Res, void> 532 1.1.1.8 mrg { 533 1.1.1.8 mrg static_assert(is_void<_Res>::value, "Only used for promise<void>"); 534 1.1.1.8 mrg 535 1.1.1.8 mrg typename promise<_Res>::_Ptr_type operator()() const 536 1.1.1.8 mrg { return std::move(_M_promise->_M_storage); } 537 1.1.1.8 mrg 538 1.1.1.8 mrg promise<_Res>* _M_promise; 539 1.1.1.8 mrg }; 540 1.1.1.8 mrg 541 1.1 mrg struct __exception_ptr_tag { }; 542 1.1 mrg 543 1.1 mrg // set exceptions 544 1.1 mrg template<typename _Res> 545 1.1 mrg struct _Setter<_Res, __exception_ptr_tag> 546 1.1 mrg { 547 1.1.1.6 mrg // Used by std::promise to store an exception as the result. 548 1.1.1.6 mrg typename promise<_Res>::_Ptr_type operator()() const 549 1.1 mrg { 550 1.1.1.6 mrg _M_promise->_M_storage->_M_error = *_M_ex; 551 1.1 mrg return std::move(_M_promise->_M_storage); 552 1.1 mrg } 553 1.1 mrg 554 1.1 mrg promise<_Res>* _M_promise; 555 1.1.1.6 mrg exception_ptr* _M_ex; 556 1.1 mrg }; 557 1.1 mrg 558 1.1 mrg template<typename _Res, typename _Arg> 559 1.1.1.15 mrg __attribute__((__always_inline__)) 560 1.1 mrg static _Setter<_Res, _Arg&&> 561 1.1.1.15 mrg __setter(promise<_Res>* __prom, _Arg&& __arg) noexcept 562 1.1 mrg { 563 1.1.1.7 mrg return _Setter<_Res, _Arg&&>{ __prom, std::__addressof(__arg) }; 564 1.1 mrg } 565 1.1 mrg 566 1.1 mrg template<typename _Res> 567 1.1.1.15 mrg __attribute__((__always_inline__)) 568 1.1 mrg static _Setter<_Res, __exception_ptr_tag> 569 1.1.1.15 mrg __setter(exception_ptr& __ex, promise<_Res>* __prom) noexcept 570 1.1 mrg { 571 1.1.1.16 mrg __glibcxx_assert(__ex != nullptr); // LWG 2276 572 1.1.1.6 mrg return _Setter<_Res, __exception_ptr_tag>{ __prom, &__ex }; 573 1.1 mrg } 574 1.1 mrg 575 1.1.1.8 mrg template<typename _Res> 576 1.1.1.15 mrg __attribute__((__always_inline__)) 577 1.1.1.8 mrg static _Setter<_Res, void> 578 1.1.1.15 mrg __setter(promise<_Res>* __prom) noexcept 579 1.1.1.8 mrg { 580 1.1.1.8 mrg return _Setter<_Res, void>{ __prom }; 581 1.1.1.8 mrg } 582 1.1.1.8 mrg 583 1.1 mrg template<typename _Tp> 584 1.1.1.2 mrg static void 585 1.1 mrg _S_check(const shared_ptr<_Tp>& __p) 586 1.1 mrg { 587 1.1 mrg if (!static_cast<bool>(__p)) 588 1.1 mrg __throw_future_error((int)future_errc::no_state); 589 1.1 mrg } 590 1.1 mrg 591 1.1 mrg private: 592 1.1.1.6 mrg // The function invoked with std::call_once(_M_once, ...). 593 1.1 mrg void 594 1.1.1.6 mrg _M_do_set(function<_Ptr_type()>* __f, bool* __did_set) 595 1.1 mrg { 596 1.1.1.6 mrg _Ptr_type __res = (*__f)(); 597 1.1.1.6 mrg // Notify the caller that we did try to set; if we do not throw an 598 1.1.1.6 mrg // exception, the caller will be aware that it did set (e.g., see 599 1.1.1.6 mrg // _M_set_result). 600 1.1.1.6 mrg *__did_set = true; 601 1.1.1.6 mrg _M_result.swap(__res); // nothrow 602 1.1 mrg } 603 1.1 mrg 604 1.1.1.6 mrg // Wait for completion of async function. 605 1.1.1.6 mrg virtual void _M_complete_async() { } 606 1.1.1.6 mrg 607 1.1.1.6 mrg // Return true if state corresponds to a deferred function. 608 1.1.1.6 mrg virtual bool _M_is_deferred_future() const { return false; } 609 1.1 mrg 610 1.1.1.6 mrg struct _Make_ready final : __at_thread_exit_elt 611 1.1.1.6 mrg { 612 1.1.1.6 mrg weak_ptr<_State_baseV2> _M_shared_state; 613 1.1.1.6 mrg static void _S_run(void*); 614 1.1.1.6 mrg void _M_set(); 615 1.1.1.6 mrg }; 616 1.1 mrg }; 617 1.1 mrg 618 1.1.1.6 mrg #ifdef _GLIBCXX_ASYNC_ABI_COMPAT 619 1.1.1.6 mrg class _State_base; 620 1.1.1.6 mrg class _Async_state_common; 621 1.1.1.6 mrg #else 622 1.1.1.6 mrg using _State_base = _State_baseV2; 623 1.1.1.6 mrg class _Async_state_commonV2; 624 1.1.1.6 mrg #endif 625 1.1.1.6 mrg 626 1.1.1.9 mrg template<typename _BoundFn, 627 1.1.1.9 mrg typename _Res = decltype(std::declval<_BoundFn&>()())> 628 1.1 mrg class _Deferred_state; 629 1.1 mrg 630 1.1.1.9 mrg template<typename _BoundFn, 631 1.1.1.9 mrg typename _Res = decltype(std::declval<_BoundFn&>()())> 632 1.1.1.2 mrg class _Async_state_impl; 633 1.1 mrg 634 1.1 mrg template<typename _Signature> 635 1.1.1.17 mrg struct _Task_state_base; 636 1.1.1.2 mrg 637 1.1.1.2 mrg template<typename _Fn, typename _Alloc, typename _Signature> 638 1.1.1.17 mrg struct _Task_state; 639 1.1 mrg 640 1.1.1.6 mrg template<typename _Res_ptr, typename _Fn, 641 1.1.1.2 mrg typename _Res = typename _Res_ptr::element_type::result_type> 642 1.1 mrg struct _Task_setter; 643 1.1 mrg 644 1.1.1.2 mrg template<typename _Res_ptr, typename _BoundFn> 645 1.1.1.6 mrg static _Task_setter<_Res_ptr, _BoundFn> 646 1.1.1.6 mrg _S_task_setter(_Res_ptr& __ptr, _BoundFn& __call) 647 1.1.1.2 mrg { 648 1.1.1.6 mrg return { std::__addressof(__ptr), std::__addressof(__call) }; 649 1.1.1.2 mrg } 650 1.1.1.2 mrg }; 651 1.1 mrg 652 1.1 mrg /// Partial specialization for reference types. 653 1.1 mrg template<typename _Res> 654 1.1 mrg struct __future_base::_Result<_Res&> : __future_base::_Result_base 655 1.1 mrg { 656 1.1.1.2 mrg typedef _Res& result_type; 657 1.1.1.2 mrg 658 1.1.1.2 mrg _Result() noexcept : _M_value_ptr() { } 659 1.1 mrg 660 1.1.1.6 mrg void 661 1.1.1.6 mrg _M_set(_Res& __res) noexcept 662 1.1.1.6 mrg { _M_value_ptr = std::addressof(__res); } 663 1.1 mrg 664 1.1.1.2 mrg _Res& _M_get() noexcept { return *_M_value_ptr; } 665 1.1 mrg 666 1.1 mrg private: 667 1.1 mrg _Res* _M_value_ptr; 668 1.1.1.2 mrg 669 1.1 mrg void _M_destroy() { delete this; } 670 1.1 mrg }; 671 1.1 mrg 672 1.1 mrg /// Explicit specialization for void. 673 1.1 mrg template<> 674 1.1 mrg struct __future_base::_Result<void> : __future_base::_Result_base 675 1.1 mrg { 676 1.1.1.2 mrg typedef void result_type; 677 1.1.1.2 mrg 678 1.1 mrg private: 679 1.1 mrg void _M_destroy() { delete this; } 680 1.1 mrg }; 681 1.1 mrg 682 1.1.1.16 mrg /// @endcond 683 1.1.1.16 mrg 684 1.1.1.6 mrg #ifndef _GLIBCXX_ASYNC_ABI_COMPAT 685 1.1.1.6 mrg 686 1.1.1.16 mrg /// @cond undocumented 687 1.1.1.6 mrg // Allow _Setter objects to be stored locally in std::function 688 1.1.1.6 mrg template<typename _Res, typename _Arg> 689 1.1.1.6 mrg struct __is_location_invariant 690 1.1.1.6 mrg <__future_base::_State_base::_Setter<_Res, _Arg>> 691 1.1.1.6 mrg : true_type { }; 692 1.1.1.6 mrg 693 1.1.1.6 mrg // Allow _Task_setter objects to be stored locally in std::function 694 1.1.1.6 mrg template<typename _Res_ptr, typename _Fn, typename _Res> 695 1.1.1.6 mrg struct __is_location_invariant 696 1.1.1.6 mrg <__future_base::_Task_setter<_Res_ptr, _Fn, _Res>> 697 1.1.1.6 mrg : true_type { }; 698 1.1.1.16 mrg /// @endcond 699 1.1 mrg 700 1.1 mrg /// Common implementation for future and shared_future. 701 1.1 mrg template<typename _Res> 702 1.1 mrg class __basic_future : public __future_base 703 1.1 mrg { 704 1.1 mrg protected: 705 1.1.1.2 mrg typedef shared_ptr<_State_base> __state_type; 706 1.1 mrg typedef __future_base::_Result<_Res>& __result_type; 707 1.1 mrg 708 1.1 mrg private: 709 1.1 mrg __state_type _M_state; 710 1.1 mrg 711 1.1 mrg public: 712 1.1 mrg // Disable copying. 713 1.1 mrg __basic_future(const __basic_future&) = delete; 714 1.1 mrg __basic_future& operator=(const __basic_future&) = delete; 715 1.1 mrg 716 1.1.1.2 mrg bool 717 1.1.1.2 mrg valid() const noexcept { return static_cast<bool>(_M_state); } 718 1.1 mrg 719 1.1.1.2 mrg void 720 1.1.1.2 mrg wait() const 721 1.1.1.2 mrg { 722 1.1.1.2 mrg _State_base::_S_check(_M_state); 723 1.1.1.2 mrg _M_state->wait(); 724 1.1.1.2 mrg } 725 1.1 mrg 726 1.1 mrg template<typename _Rep, typename _Period> 727 1.1.1.2 mrg future_status 728 1.1 mrg wait_for(const chrono::duration<_Rep, _Period>& __rel) const 729 1.1.1.2 mrg { 730 1.1.1.2 mrg _State_base::_S_check(_M_state); 731 1.1.1.2 mrg return _M_state->wait_for(__rel); 732 1.1.1.2 mrg } 733 1.1 mrg 734 1.1 mrg template<typename _Clock, typename _Duration> 735 1.1.1.2 mrg future_status 736 1.1 mrg wait_until(const chrono::time_point<_Clock, _Duration>& __abs) const 737 1.1.1.2 mrg { 738 1.1.1.2 mrg _State_base::_S_check(_M_state); 739 1.1.1.2 mrg return _M_state->wait_until(__abs); 740 1.1.1.2 mrg } 741 1.1 mrg 742 1.1 mrg protected: 743 1.1 mrg /// Wait for the state to be ready and rethrow any stored exception 744 1.1 mrg __result_type 745 1.1.1.2 mrg _M_get_result() const 746 1.1 mrg { 747 1.1.1.2 mrg _State_base::_S_check(_M_state); 748 1.1 mrg _Result_base& __res = _M_state->wait(); 749 1.1.1.16 mrg if (!(__res._M_error == nullptr)) 750 1.1 mrg rethrow_exception(__res._M_error); 751 1.1 mrg return static_cast<__result_type>(__res); 752 1.1 mrg } 753 1.1 mrg 754 1.1.1.2 mrg void _M_swap(__basic_future& __that) noexcept 755 1.1 mrg { 756 1.1 mrg _M_state.swap(__that._M_state); 757 1.1 mrg } 758 1.1 mrg 759 1.1 mrg // Construction of a future by promise::get_future() 760 1.1 mrg explicit 761 1.1 mrg __basic_future(const __state_type& __state) : _M_state(__state) 762 1.1 mrg { 763 1.1.1.2 mrg _State_base::_S_check(_M_state); 764 1.1 mrg _M_state->_M_set_retrieved_flag(); 765 1.1 mrg } 766 1.1 mrg 767 1.1 mrg // Copy construction from a shared_future 768 1.1 mrg explicit 769 1.1.1.2 mrg __basic_future(const shared_future<_Res>&) noexcept; 770 1.1 mrg 771 1.1 mrg // Move construction from a shared_future 772 1.1 mrg explicit 773 1.1.1.2 mrg __basic_future(shared_future<_Res>&&) noexcept; 774 1.1 mrg 775 1.1 mrg // Move construction from a future 776 1.1 mrg explicit 777 1.1.1.2 mrg __basic_future(future<_Res>&&) noexcept; 778 1.1 mrg 779 1.1.1.2 mrg constexpr __basic_future() noexcept : _M_state() { } 780 1.1 mrg 781 1.1 mrg struct _Reset 782 1.1 mrg { 783 1.1.1.2 mrg explicit _Reset(__basic_future& __fut) noexcept : _M_fut(__fut) { } 784 1.1 mrg ~_Reset() { _M_fut._M_state.reset(); } 785 1.1 mrg __basic_future& _M_fut; 786 1.1 mrg }; 787 1.1 mrg }; 788 1.1 mrg 789 1.1 mrg 790 1.1 mrg /// Primary template for future. 791 1.1 mrg template<typename _Res> 792 1.1 mrg class future : public __basic_future<_Res> 793 1.1 mrg { 794 1.1.1.16 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 795 1.1.1.16 mrg // 3458. Is shared_future intended to work with arrays or function types? 796 1.1.1.16 mrg static_assert(!is_array<_Res>{}, "result type must not be an array"); 797 1.1.1.16 mrg static_assert(!is_function<_Res>{}, "result type must not be a function"); 798 1.1.1.16 mrg static_assert(is_destructible<_Res>{}, 799 1.1.1.16 mrg "result type must be destructible"); 800 1.1.1.16 mrg 801 1.1 mrg friend class promise<_Res>; 802 1.1 mrg template<typename> friend class packaged_task; 803 1.1 mrg template<typename _Fn, typename... _Args> 804 1.1.1.7 mrg friend future<__async_result_of<_Fn, _Args...>> 805 1.1 mrg async(launch, _Fn&&, _Args&&...); 806 1.1 mrg 807 1.1 mrg typedef __basic_future<_Res> _Base_type; 808 1.1 mrg typedef typename _Base_type::__state_type __state_type; 809 1.1 mrg 810 1.1 mrg explicit 811 1.1 mrg future(const __state_type& __state) : _Base_type(__state) { } 812 1.1 mrg 813 1.1 mrg public: 814 1.1.1.2 mrg constexpr future() noexcept : _Base_type() { } 815 1.1 mrg 816 1.1 mrg /// Move constructor 817 1.1.1.2 mrg future(future&& __uf) noexcept : _Base_type(std::move(__uf)) { } 818 1.1 mrg 819 1.1 mrg // Disable copying 820 1.1 mrg future(const future&) = delete; 821 1.1 mrg future& operator=(const future&) = delete; 822 1.1 mrg 823 1.1.1.2 mrg future& operator=(future&& __fut) noexcept 824 1.1 mrg { 825 1.1 mrg future(std::move(__fut))._M_swap(*this); 826 1.1 mrg return *this; 827 1.1 mrg } 828 1.1 mrg 829 1.1 mrg /// Retrieving the value 830 1.1 mrg _Res 831 1.1 mrg get() 832 1.1 mrg { 833 1.1 mrg typename _Base_type::_Reset __reset(*this); 834 1.1 mrg return std::move(this->_M_get_result()._M_value()); 835 1.1 mrg } 836 1.1.1.2 mrg 837 1.1.1.9 mrg shared_future<_Res> share() noexcept; 838 1.1 mrg }; 839 1.1.1.2 mrg 840 1.1 mrg /// Partial specialization for future<R&> 841 1.1 mrg template<typename _Res> 842 1.1 mrg class future<_Res&> : public __basic_future<_Res&> 843 1.1 mrg { 844 1.1 mrg friend class promise<_Res&>; 845 1.1 mrg template<typename> friend class packaged_task; 846 1.1 mrg template<typename _Fn, typename... _Args> 847 1.1.1.7 mrg friend future<__async_result_of<_Fn, _Args...>> 848 1.1 mrg async(launch, _Fn&&, _Args&&...); 849 1.1 mrg 850 1.1 mrg typedef __basic_future<_Res&> _Base_type; 851 1.1 mrg typedef typename _Base_type::__state_type __state_type; 852 1.1 mrg 853 1.1 mrg explicit 854 1.1 mrg future(const __state_type& __state) : _Base_type(__state) { } 855 1.1 mrg 856 1.1 mrg public: 857 1.1.1.2 mrg constexpr future() noexcept : _Base_type() { } 858 1.1 mrg 859 1.1 mrg /// Move constructor 860 1.1.1.2 mrg future(future&& __uf) noexcept : _Base_type(std::move(__uf)) { } 861 1.1 mrg 862 1.1 mrg // Disable copying 863 1.1 mrg future(const future&) = delete; 864 1.1 mrg future& operator=(const future&) = delete; 865 1.1 mrg 866 1.1.1.2 mrg future& operator=(future&& __fut) noexcept 867 1.1 mrg { 868 1.1 mrg future(std::move(__fut))._M_swap(*this); 869 1.1 mrg return *this; 870 1.1 mrg } 871 1.1 mrg 872 1.1 mrg /// Retrieving the value 873 1.1.1.2 mrg _Res& 874 1.1 mrg get() 875 1.1 mrg { 876 1.1 mrg typename _Base_type::_Reset __reset(*this); 877 1.1 mrg return this->_M_get_result()._M_get(); 878 1.1 mrg } 879 1.1.1.2 mrg 880 1.1.1.9 mrg shared_future<_Res&> share() noexcept; 881 1.1 mrg }; 882 1.1 mrg 883 1.1 mrg /// Explicit specialization for future<void> 884 1.1 mrg template<> 885 1.1 mrg class future<void> : public __basic_future<void> 886 1.1 mrg { 887 1.1 mrg friend class promise<void>; 888 1.1 mrg template<typename> friend class packaged_task; 889 1.1 mrg template<typename _Fn, typename... _Args> 890 1.1.1.7 mrg friend future<__async_result_of<_Fn, _Args...>> 891 1.1 mrg async(launch, _Fn&&, _Args&&...); 892 1.1 mrg 893 1.1 mrg typedef __basic_future<void> _Base_type; 894 1.1 mrg typedef typename _Base_type::__state_type __state_type; 895 1.1 mrg 896 1.1 mrg explicit 897 1.1 mrg future(const __state_type& __state) : _Base_type(__state) { } 898 1.1 mrg 899 1.1 mrg public: 900 1.1.1.2 mrg constexpr future() noexcept : _Base_type() { } 901 1.1 mrg 902 1.1 mrg /// Move constructor 903 1.1.1.2 mrg future(future&& __uf) noexcept : _Base_type(std::move(__uf)) { } 904 1.1 mrg 905 1.1 mrg // Disable copying 906 1.1 mrg future(const future&) = delete; 907 1.1 mrg future& operator=(const future&) = delete; 908 1.1 mrg 909 1.1.1.2 mrg future& operator=(future&& __fut) noexcept 910 1.1 mrg { 911 1.1 mrg future(std::move(__fut))._M_swap(*this); 912 1.1 mrg return *this; 913 1.1 mrg } 914 1.1 mrg 915 1.1 mrg /// Retrieving the value 916 1.1.1.2 mrg void 917 1.1 mrg get() 918 1.1 mrg { 919 1.1 mrg typename _Base_type::_Reset __reset(*this); 920 1.1 mrg this->_M_get_result(); 921 1.1 mrg } 922 1.1.1.2 mrg 923 1.1.1.9 mrg shared_future<void> share() noexcept; 924 1.1 mrg }; 925 1.1 mrg 926 1.1 mrg 927 1.1 mrg /// Primary template for shared_future. 928 1.1 mrg template<typename _Res> 929 1.1 mrg class shared_future : public __basic_future<_Res> 930 1.1 mrg { 931 1.1.1.16 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 932 1.1.1.16 mrg // 3458. Is shared_future intended to work with arrays or function types? 933 1.1.1.16 mrg static_assert(!is_array<_Res>{}, "result type must not be an array"); 934 1.1.1.16 mrg static_assert(!is_function<_Res>{}, "result type must not be a function"); 935 1.1.1.16 mrg static_assert(is_destructible<_Res>{}, 936 1.1.1.16 mrg "result type must be destructible"); 937 1.1.1.16 mrg 938 1.1 mrg typedef __basic_future<_Res> _Base_type; 939 1.1 mrg 940 1.1 mrg public: 941 1.1.1.2 mrg constexpr shared_future() noexcept : _Base_type() { } 942 1.1 mrg 943 1.1 mrg /// Copy constructor 944 1.1.1.8 mrg shared_future(const shared_future& __sf) noexcept : _Base_type(__sf) { } 945 1.1 mrg 946 1.1 mrg /// Construct from a future rvalue 947 1.1.1.2 mrg shared_future(future<_Res>&& __uf) noexcept 948 1.1 mrg : _Base_type(std::move(__uf)) 949 1.1 mrg { } 950 1.1 mrg 951 1.1 mrg /// Construct from a shared_future rvalue 952 1.1.1.2 mrg shared_future(shared_future&& __sf) noexcept 953 1.1 mrg : _Base_type(std::move(__sf)) 954 1.1 mrg { } 955 1.1 mrg 956 1.1.1.8 mrg shared_future& operator=(const shared_future& __sf) noexcept 957 1.1 mrg { 958 1.1 mrg shared_future(__sf)._M_swap(*this); 959 1.1 mrg return *this; 960 1.1 mrg } 961 1.1 mrg 962 1.1.1.2 mrg shared_future& operator=(shared_future&& __sf) noexcept 963 1.1 mrg { 964 1.1 mrg shared_future(std::move(__sf))._M_swap(*this); 965 1.1 mrg return *this; 966 1.1 mrg } 967 1.1 mrg 968 1.1 mrg /// Retrieving the value 969 1.1 mrg const _Res& 970 1.1.1.2 mrg get() const { return this->_M_get_result()._M_value(); } 971 1.1 mrg }; 972 1.1.1.2 mrg 973 1.1 mrg /// Partial specialization for shared_future<R&> 974 1.1 mrg template<typename _Res> 975 1.1 mrg class shared_future<_Res&> : public __basic_future<_Res&> 976 1.1 mrg { 977 1.1 mrg typedef __basic_future<_Res&> _Base_type; 978 1.1 mrg 979 1.1 mrg public: 980 1.1.1.2 mrg constexpr shared_future() noexcept : _Base_type() { } 981 1.1 mrg 982 1.1 mrg /// Copy constructor 983 1.1 mrg shared_future(const shared_future& __sf) : _Base_type(__sf) { } 984 1.1 mrg 985 1.1 mrg /// Construct from a future rvalue 986 1.1.1.2 mrg shared_future(future<_Res&>&& __uf) noexcept 987 1.1 mrg : _Base_type(std::move(__uf)) 988 1.1 mrg { } 989 1.1 mrg 990 1.1 mrg /// Construct from a shared_future rvalue 991 1.1.1.2 mrg shared_future(shared_future&& __sf) noexcept 992 1.1 mrg : _Base_type(std::move(__sf)) 993 1.1 mrg { } 994 1.1 mrg 995 1.1 mrg shared_future& operator=(const shared_future& __sf) 996 1.1 mrg { 997 1.1 mrg shared_future(__sf)._M_swap(*this); 998 1.1 mrg return *this; 999 1.1 mrg } 1000 1.1 mrg 1001 1.1.1.2 mrg shared_future& operator=(shared_future&& __sf) noexcept 1002 1.1 mrg { 1003 1.1 mrg shared_future(std::move(__sf))._M_swap(*this); 1004 1.1 mrg return *this; 1005 1.1 mrg } 1006 1.1 mrg 1007 1.1 mrg /// Retrieving the value 1008 1.1.1.2 mrg _Res& 1009 1.1.1.2 mrg get() const { return this->_M_get_result()._M_get(); } 1010 1.1 mrg }; 1011 1.1 mrg 1012 1.1 mrg /// Explicit specialization for shared_future<void> 1013 1.1 mrg template<> 1014 1.1 mrg class shared_future<void> : public __basic_future<void> 1015 1.1 mrg { 1016 1.1 mrg typedef __basic_future<void> _Base_type; 1017 1.1 mrg 1018 1.1 mrg public: 1019 1.1.1.2 mrg constexpr shared_future() noexcept : _Base_type() { } 1020 1.1 mrg 1021 1.1 mrg /// Copy constructor 1022 1.1 mrg shared_future(const shared_future& __sf) : _Base_type(__sf) { } 1023 1.1 mrg 1024 1.1 mrg /// Construct from a future rvalue 1025 1.1.1.2 mrg shared_future(future<void>&& __uf) noexcept 1026 1.1 mrg : _Base_type(std::move(__uf)) 1027 1.1 mrg { } 1028 1.1 mrg 1029 1.1 mrg /// Construct from a shared_future rvalue 1030 1.1.1.2 mrg shared_future(shared_future&& __sf) noexcept 1031 1.1 mrg : _Base_type(std::move(__sf)) 1032 1.1 mrg { } 1033 1.1 mrg 1034 1.1 mrg shared_future& operator=(const shared_future& __sf) 1035 1.1 mrg { 1036 1.1 mrg shared_future(__sf)._M_swap(*this); 1037 1.1 mrg return *this; 1038 1.1 mrg } 1039 1.1 mrg 1040 1.1.1.2 mrg shared_future& operator=(shared_future&& __sf) noexcept 1041 1.1 mrg { 1042 1.1 mrg shared_future(std::move(__sf))._M_swap(*this); 1043 1.1 mrg return *this; 1044 1.1 mrg } 1045 1.1 mrg 1046 1.1 mrg // Retrieving the value 1047 1.1.1.2 mrg void 1048 1.1.1.2 mrg get() const { this->_M_get_result(); } 1049 1.1 mrg }; 1050 1.1 mrg 1051 1.1 mrg // Now we can define the protected __basic_future constructors. 1052 1.1 mrg template<typename _Res> 1053 1.1 mrg inline __basic_future<_Res>:: 1054 1.1.1.2 mrg __basic_future(const shared_future<_Res>& __sf) noexcept 1055 1.1 mrg : _M_state(__sf._M_state) 1056 1.1 mrg { } 1057 1.1 mrg 1058 1.1 mrg template<typename _Res> 1059 1.1 mrg inline __basic_future<_Res>:: 1060 1.1.1.2 mrg __basic_future(shared_future<_Res>&& __sf) noexcept 1061 1.1 mrg : _M_state(std::move(__sf._M_state)) 1062 1.1 mrg { } 1063 1.1 mrg 1064 1.1 mrg template<typename _Res> 1065 1.1 mrg inline __basic_future<_Res>:: 1066 1.1.1.2 mrg __basic_future(future<_Res>&& __uf) noexcept 1067 1.1 mrg : _M_state(std::move(__uf._M_state)) 1068 1.1 mrg { } 1069 1.1 mrg 1070 1.1.1.9 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 1071 1.1.1.9 mrg // 2556. Wide contract for future::share() 1072 1.1.1.2 mrg template<typename _Res> 1073 1.1.1.2 mrg inline shared_future<_Res> 1074 1.1.1.9 mrg future<_Res>::share() noexcept 1075 1.1.1.2 mrg { return shared_future<_Res>(std::move(*this)); } 1076 1.1.1.2 mrg 1077 1.1.1.2 mrg template<typename _Res> 1078 1.1.1.2 mrg inline shared_future<_Res&> 1079 1.1.1.9 mrg future<_Res&>::share() noexcept 1080 1.1.1.2 mrg { return shared_future<_Res&>(std::move(*this)); } 1081 1.1.1.2 mrg 1082 1.1.1.2 mrg inline shared_future<void> 1083 1.1.1.9 mrg future<void>::share() noexcept 1084 1.1.1.2 mrg { return shared_future<void>(std::move(*this)); } 1085 1.1 mrg 1086 1.1 mrg /// Primary template for promise 1087 1.1 mrg template<typename _Res> 1088 1.1 mrg class promise 1089 1.1 mrg { 1090 1.1.1.16 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 1091 1.1.1.16 mrg // 3466: Specify the requirements for promise/future/[...] consistently 1092 1.1.1.16 mrg static_assert(!is_array<_Res>{}, "result type must not be an array"); 1093 1.1.1.16 mrg static_assert(!is_function<_Res>{}, "result type must not be a function"); 1094 1.1.1.16 mrg static_assert(is_destructible<_Res>{}, 1095 1.1.1.16 mrg "result type must be destructible"); 1096 1.1.1.16 mrg 1097 1.1.1.2 mrg typedef __future_base::_State_base _State; 1098 1.1 mrg typedef __future_base::_Result<_Res> _Res_type; 1099 1.1.1.2 mrg typedef __future_base::_Ptr<_Res_type> _Ptr_type; 1100 1.1.1.16 mrg template<typename, typename> friend struct _State::_Setter; 1101 1.1.1.8 mrg friend _State; 1102 1.1.1.2 mrg 1103 1.1 mrg shared_ptr<_State> _M_future; 1104 1.1 mrg _Ptr_type _M_storage; 1105 1.1 mrg 1106 1.1 mrg public: 1107 1.1 mrg promise() 1108 1.1 mrg : _M_future(std::make_shared<_State>()), 1109 1.1 mrg _M_storage(new _Res_type()) 1110 1.1 mrg { } 1111 1.1 mrg 1112 1.1.1.2 mrg promise(promise&& __rhs) noexcept 1113 1.1 mrg : _M_future(std::move(__rhs._M_future)), 1114 1.1 mrg _M_storage(std::move(__rhs._M_storage)) 1115 1.1 mrg { } 1116 1.1 mrg 1117 1.1 mrg template<typename _Allocator> 1118 1.1 mrg promise(allocator_arg_t, const _Allocator& __a) 1119 1.1 mrg : _M_future(std::allocate_shared<_State>(__a)), 1120 1.1.1.2 mrg _M_storage(__future_base::_S_allocate_result<_Res>(__a)) 1121 1.1.1.2 mrg { } 1122 1.1.1.2 mrg 1123 1.1.1.2 mrg template<typename _Allocator> 1124 1.1.1.2 mrg promise(allocator_arg_t, const _Allocator&, promise&& __rhs) 1125 1.1.1.2 mrg : _M_future(std::move(__rhs._M_future)), 1126 1.1.1.2 mrg _M_storage(std::move(__rhs._M_storage)) 1127 1.1 mrg { } 1128 1.1 mrg 1129 1.1 mrg promise(const promise&) = delete; 1130 1.1 mrg 1131 1.1 mrg ~promise() 1132 1.1 mrg { 1133 1.1 mrg if (static_cast<bool>(_M_future) && !_M_future.unique()) 1134 1.1 mrg _M_future->_M_break_promise(std::move(_M_storage)); 1135 1.1 mrg } 1136 1.1 mrg 1137 1.1 mrg // Assignment 1138 1.1 mrg promise& 1139 1.1.1.2 mrg operator=(promise&& __rhs) noexcept 1140 1.1 mrg { 1141 1.1 mrg promise(std::move(__rhs)).swap(*this); 1142 1.1 mrg return *this; 1143 1.1 mrg } 1144 1.1 mrg 1145 1.1 mrg promise& operator=(const promise&) = delete; 1146 1.1 mrg 1147 1.1 mrg void 1148 1.1.1.2 mrg swap(promise& __rhs) noexcept 1149 1.1 mrg { 1150 1.1 mrg _M_future.swap(__rhs._M_future); 1151 1.1 mrg _M_storage.swap(__rhs._M_storage); 1152 1.1 mrg } 1153 1.1 mrg 1154 1.1 mrg // Retrieving the result 1155 1.1 mrg future<_Res> 1156 1.1 mrg get_future() 1157 1.1 mrg { return future<_Res>(_M_future); } 1158 1.1 mrg 1159 1.1 mrg // Setting the result 1160 1.1 mrg void 1161 1.1 mrg set_value(const _Res& __r) 1162 1.1.1.15 mrg { _M_state()._M_set_result(_State::__setter(this, __r)); } 1163 1.1.1.6 mrg 1164 1.1.1.6 mrg void 1165 1.1.1.6 mrg set_value(_Res&& __r) 1166 1.1.1.15 mrg { _M_state()._M_set_result(_State::__setter(this, std::move(__r))); } 1167 1.1.1.6 mrg 1168 1.1.1.6 mrg void 1169 1.1.1.6 mrg set_exception(exception_ptr __p) 1170 1.1.1.15 mrg { _M_state()._M_set_result(_State::__setter(__p, this)); } 1171 1.1.1.6 mrg 1172 1.1.1.6 mrg void 1173 1.1.1.6 mrg set_value_at_thread_exit(const _Res& __r) 1174 1.1 mrg { 1175 1.1.1.15 mrg _M_state()._M_set_delayed_result(_State::__setter(this, __r), 1176 1.1.1.6 mrg _M_future); 1177 1.1 mrg } 1178 1.1 mrg 1179 1.1 mrg void 1180 1.1.1.6 mrg set_value_at_thread_exit(_Res&& __r) 1181 1.1 mrg { 1182 1.1.1.15 mrg _M_state()._M_set_delayed_result( 1183 1.1.1.6 mrg _State::__setter(this, std::move(__r)), _M_future); 1184 1.1 mrg } 1185 1.1 mrg 1186 1.1 mrg void 1187 1.1.1.6 mrg set_exception_at_thread_exit(exception_ptr __p) 1188 1.1 mrg { 1189 1.1.1.15 mrg _M_state()._M_set_delayed_result(_State::__setter(__p, this), 1190 1.1.1.6 mrg _M_future); 1191 1.1 mrg } 1192 1.1.1.15 mrg 1193 1.1.1.15 mrg private: 1194 1.1.1.15 mrg _State& 1195 1.1.1.15 mrg _M_state() 1196 1.1.1.15 mrg { 1197 1.1.1.15 mrg __future_base::_State_base::_S_check(_M_future); 1198 1.1.1.15 mrg return *_M_future; 1199 1.1.1.15 mrg } 1200 1.1 mrg }; 1201 1.1 mrg 1202 1.1 mrg template<typename _Res> 1203 1.1 mrg inline void 1204 1.1.1.2 mrg swap(promise<_Res>& __x, promise<_Res>& __y) noexcept 1205 1.1 mrg { __x.swap(__y); } 1206 1.1 mrg 1207 1.1.1.2 mrg template<typename _Res, typename _Alloc> 1208 1.1.1.2 mrg struct uses_allocator<promise<_Res>, _Alloc> 1209 1.1.1.2 mrg : public true_type { }; 1210 1.1.1.2 mrg 1211 1.1.1.2 mrg 1212 1.1 mrg /// Partial specialization for promise<R&> 1213 1.1 mrg template<typename _Res> 1214 1.1 mrg class promise<_Res&> 1215 1.1 mrg { 1216 1.1.1.2 mrg typedef __future_base::_State_base _State; 1217 1.1 mrg typedef __future_base::_Result<_Res&> _Res_type; 1218 1.1.1.2 mrg typedef __future_base::_Ptr<_Res_type> _Ptr_type; 1219 1.1.1.16 mrg template<typename, typename> friend struct _State::_Setter; 1220 1.1.1.8 mrg friend _State; 1221 1.1 mrg 1222 1.1 mrg shared_ptr<_State> _M_future; 1223 1.1 mrg _Ptr_type _M_storage; 1224 1.1 mrg 1225 1.1 mrg public: 1226 1.1 mrg promise() 1227 1.1 mrg : _M_future(std::make_shared<_State>()), 1228 1.1 mrg _M_storage(new _Res_type()) 1229 1.1 mrg { } 1230 1.1 mrg 1231 1.1.1.2 mrg promise(promise&& __rhs) noexcept 1232 1.1.1.2 mrg : _M_future(std::move(__rhs._M_future)), 1233 1.1 mrg _M_storage(std::move(__rhs._M_storage)) 1234 1.1 mrg { } 1235 1.1 mrg 1236 1.1 mrg template<typename _Allocator> 1237 1.1 mrg promise(allocator_arg_t, const _Allocator& __a) 1238 1.1 mrg : _M_future(std::allocate_shared<_State>(__a)), 1239 1.1.1.2 mrg _M_storage(__future_base::_S_allocate_result<_Res&>(__a)) 1240 1.1.1.2 mrg { } 1241 1.1.1.2 mrg 1242 1.1.1.2 mrg template<typename _Allocator> 1243 1.1.1.2 mrg promise(allocator_arg_t, const _Allocator&, promise&& __rhs) 1244 1.1.1.2 mrg : _M_future(std::move(__rhs._M_future)), 1245 1.1.1.2 mrg _M_storage(std::move(__rhs._M_storage)) 1246 1.1 mrg { } 1247 1.1 mrg 1248 1.1 mrg promise(const promise&) = delete; 1249 1.1 mrg 1250 1.1 mrg ~promise() 1251 1.1 mrg { 1252 1.1 mrg if (static_cast<bool>(_M_future) && !_M_future.unique()) 1253 1.1 mrg _M_future->_M_break_promise(std::move(_M_storage)); 1254 1.1 mrg } 1255 1.1 mrg 1256 1.1 mrg // Assignment 1257 1.1 mrg promise& 1258 1.1.1.2 mrg operator=(promise&& __rhs) noexcept 1259 1.1 mrg { 1260 1.1 mrg promise(std::move(__rhs)).swap(*this); 1261 1.1 mrg return *this; 1262 1.1 mrg } 1263 1.1 mrg 1264 1.1 mrg promise& operator=(const promise&) = delete; 1265 1.1 mrg 1266 1.1 mrg void 1267 1.1.1.2 mrg swap(promise& __rhs) noexcept 1268 1.1 mrg { 1269 1.1 mrg _M_future.swap(__rhs._M_future); 1270 1.1 mrg _M_storage.swap(__rhs._M_storage); 1271 1.1 mrg } 1272 1.1 mrg 1273 1.1 mrg // Retrieving the result 1274 1.1 mrg future<_Res&> 1275 1.1 mrg get_future() 1276 1.1 mrg { return future<_Res&>(_M_future); } 1277 1.1 mrg 1278 1.1 mrg // Setting the result 1279 1.1 mrg void 1280 1.1 mrg set_value(_Res& __r) 1281 1.1.1.15 mrg { _M_state()._M_set_result(_State::__setter(this, __r)); } 1282 1.1.1.6 mrg 1283 1.1.1.6 mrg void 1284 1.1.1.6 mrg set_exception(exception_ptr __p) 1285 1.1.1.15 mrg { _M_state()._M_set_result(_State::__setter(__p, this)); } 1286 1.1.1.6 mrg 1287 1.1.1.6 mrg void 1288 1.1.1.6 mrg set_value_at_thread_exit(_Res& __r) 1289 1.1 mrg { 1290 1.1.1.15 mrg _M_state()._M_set_delayed_result(_State::__setter(this, __r), 1291 1.1.1.6 mrg _M_future); 1292 1.1 mrg } 1293 1.1 mrg 1294 1.1 mrg void 1295 1.1.1.6 mrg set_exception_at_thread_exit(exception_ptr __p) 1296 1.1 mrg { 1297 1.1.1.15 mrg _M_state()._M_set_delayed_result(_State::__setter(__p, this), 1298 1.1.1.6 mrg _M_future); 1299 1.1 mrg } 1300 1.1.1.15 mrg 1301 1.1.1.15 mrg private: 1302 1.1.1.15 mrg _State& 1303 1.1.1.15 mrg _M_state() 1304 1.1.1.15 mrg { 1305 1.1.1.15 mrg __future_base::_State_base::_S_check(_M_future); 1306 1.1.1.15 mrg return *_M_future; 1307 1.1.1.15 mrg } 1308 1.1 mrg }; 1309 1.1 mrg 1310 1.1 mrg /// Explicit specialization for promise<void> 1311 1.1 mrg template<> 1312 1.1 mrg class promise<void> 1313 1.1 mrg { 1314 1.1.1.2 mrg typedef __future_base::_State_base _State; 1315 1.1 mrg typedef __future_base::_Result<void> _Res_type; 1316 1.1.1.2 mrg typedef __future_base::_Ptr<_Res_type> _Ptr_type; 1317 1.1.1.16 mrg template<typename, typename> friend struct _State::_Setter; 1318 1.1.1.8 mrg friend _State; 1319 1.1 mrg 1320 1.1 mrg shared_ptr<_State> _M_future; 1321 1.1 mrg _Ptr_type _M_storage; 1322 1.1 mrg 1323 1.1 mrg public: 1324 1.1 mrg promise() 1325 1.1 mrg : _M_future(std::make_shared<_State>()), 1326 1.1 mrg _M_storage(new _Res_type()) 1327 1.1 mrg { } 1328 1.1 mrg 1329 1.1.1.2 mrg promise(promise&& __rhs) noexcept 1330 1.1 mrg : _M_future(std::move(__rhs._M_future)), 1331 1.1 mrg _M_storage(std::move(__rhs._M_storage)) 1332 1.1 mrg { } 1333 1.1 mrg 1334 1.1 mrg template<typename _Allocator> 1335 1.1 mrg promise(allocator_arg_t, const _Allocator& __a) 1336 1.1 mrg : _M_future(std::allocate_shared<_State>(__a)), 1337 1.1.1.2 mrg _M_storage(__future_base::_S_allocate_result<void>(__a)) 1338 1.1.1.2 mrg { } 1339 1.1.1.2 mrg 1340 1.1.1.2 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 1341 1.1.1.2 mrg // 2095. missing constructors needed for uses-allocator construction 1342 1.1.1.2 mrg template<typename _Allocator> 1343 1.1.1.2 mrg promise(allocator_arg_t, const _Allocator&, promise&& __rhs) 1344 1.1.1.2 mrg : _M_future(std::move(__rhs._M_future)), 1345 1.1.1.2 mrg _M_storage(std::move(__rhs._M_storage)) 1346 1.1 mrg { } 1347 1.1 mrg 1348 1.1 mrg promise(const promise&) = delete; 1349 1.1 mrg 1350 1.1 mrg ~promise() 1351 1.1 mrg { 1352 1.1 mrg if (static_cast<bool>(_M_future) && !_M_future.unique()) 1353 1.1 mrg _M_future->_M_break_promise(std::move(_M_storage)); 1354 1.1 mrg } 1355 1.1 mrg 1356 1.1 mrg // Assignment 1357 1.1 mrg promise& 1358 1.1.1.2 mrg operator=(promise&& __rhs) noexcept 1359 1.1 mrg { 1360 1.1 mrg promise(std::move(__rhs)).swap(*this); 1361 1.1 mrg return *this; 1362 1.1 mrg } 1363 1.1 mrg 1364 1.1 mrg promise& operator=(const promise&) = delete; 1365 1.1 mrg 1366 1.1 mrg void 1367 1.1.1.2 mrg swap(promise& __rhs) noexcept 1368 1.1 mrg { 1369 1.1 mrg _M_future.swap(__rhs._M_future); 1370 1.1 mrg _M_storage.swap(__rhs._M_storage); 1371 1.1 mrg } 1372 1.1 mrg 1373 1.1 mrg // Retrieving the result 1374 1.1 mrg future<void> 1375 1.1 mrg get_future() 1376 1.1 mrg { return future<void>(_M_future); } 1377 1.1 mrg 1378 1.1 mrg // Setting the result 1379 1.1.1.8 mrg void 1380 1.1.1.8 mrg set_value() 1381 1.1.1.15 mrg { _M_state()._M_set_result(_State::__setter(this)); } 1382 1.1 mrg 1383 1.1 mrg void 1384 1.1 mrg set_exception(exception_ptr __p) 1385 1.1.1.15 mrg { _M_state()._M_set_result(_State::__setter(__p, this)); } 1386 1.1.1.6 mrg 1387 1.1.1.6 mrg void 1388 1.1.1.8 mrg set_value_at_thread_exit() 1389 1.1.1.15 mrg { _M_state()._M_set_delayed_result(_State::__setter(this), _M_future); } 1390 1.1.1.6 mrg 1391 1.1.1.6 mrg void 1392 1.1.1.6 mrg set_exception_at_thread_exit(exception_ptr __p) 1393 1.1 mrg { 1394 1.1.1.15 mrg _M_state()._M_set_delayed_result(_State::__setter(__p, this), 1395 1.1.1.6 mrg _M_future); 1396 1.1 mrg } 1397 1.1.1.15 mrg 1398 1.1.1.15 mrg private: 1399 1.1.1.15 mrg _State& 1400 1.1.1.15 mrg _M_state() 1401 1.1.1.15 mrg { 1402 1.1.1.15 mrg __future_base::_State_base::_S_check(_M_future); 1403 1.1.1.15 mrg return *_M_future; 1404 1.1.1.15 mrg } 1405 1.1 mrg }; 1406 1.1 mrg 1407 1.1.1.16 mrg /// @cond undocumented 1408 1.1.1.6 mrg template<typename _Ptr_type, typename _Fn, typename _Res> 1409 1.1 mrg struct __future_base::_Task_setter 1410 1.1 mrg { 1411 1.1.1.6 mrg // Invoke the function and provide the result to the caller. 1412 1.1.1.6 mrg _Ptr_type operator()() const 1413 1.1 mrg { 1414 1.1.1.2 mrg __try 1415 1.1 mrg { 1416 1.1.1.6 mrg (*_M_result)->_M_set((*_M_fn)()); 1417 1.1.1.6 mrg } 1418 1.1.1.6 mrg __catch(const __cxxabiv1::__forced_unwind&) 1419 1.1.1.6 mrg { 1420 1.1.1.6 mrg __throw_exception_again; // will cause broken_promise 1421 1.1 mrg } 1422 1.1 mrg __catch(...) 1423 1.1 mrg { 1424 1.1.1.6 mrg (*_M_result)->_M_error = current_exception(); 1425 1.1 mrg } 1426 1.1.1.6 mrg return std::move(*_M_result); 1427 1.1 mrg } 1428 1.1.1.6 mrg _Ptr_type* _M_result; 1429 1.1.1.6 mrg _Fn* _M_fn; 1430 1.1 mrg }; 1431 1.1 mrg 1432 1.1.1.6 mrg template<typename _Ptr_type, typename _Fn> 1433 1.1.1.6 mrg struct __future_base::_Task_setter<_Ptr_type, _Fn, void> 1434 1.1 mrg { 1435 1.1.1.6 mrg _Ptr_type operator()() const 1436 1.1 mrg { 1437 1.1.1.2 mrg __try 1438 1.1 mrg { 1439 1.1.1.6 mrg (*_M_fn)(); 1440 1.1.1.6 mrg } 1441 1.1.1.6 mrg __catch(const __cxxabiv1::__forced_unwind&) 1442 1.1.1.6 mrg { 1443 1.1.1.6 mrg __throw_exception_again; // will cause broken_promise 1444 1.1 mrg } 1445 1.1 mrg __catch(...) 1446 1.1 mrg { 1447 1.1.1.6 mrg (*_M_result)->_M_error = current_exception(); 1448 1.1 mrg } 1449 1.1.1.6 mrg return std::move(*_M_result); 1450 1.1 mrg } 1451 1.1.1.6 mrg _Ptr_type* _M_result; 1452 1.1.1.6 mrg _Fn* _M_fn; 1453 1.1 mrg }; 1454 1.1 mrg 1455 1.1.1.6 mrg // Holds storage for a packaged_task's result. 1456 1.1 mrg template<typename _Res, typename... _Args> 1457 1.1.1.2 mrg struct __future_base::_Task_state_base<_Res(_Args...)> 1458 1.1.1.2 mrg : __future_base::_State_base 1459 1.1 mrg { 1460 1.1 mrg typedef _Res _Res_type; 1461 1.1 mrg 1462 1.1.1.2 mrg template<typename _Alloc> 1463 1.1.1.2 mrg _Task_state_base(const _Alloc& __a) 1464 1.1.1.2 mrg : _M_result(_S_allocate_result<_Res>(__a)) 1465 1.1.1.2 mrg { } 1466 1.1 mrg 1467 1.1.1.6 mrg // Invoke the stored task and make the state ready. 1468 1.1.1.2 mrg virtual void 1469 1.1.1.6 mrg _M_run(_Args&&... __args) = 0; 1470 1.1.1.6 mrg 1471 1.1.1.6 mrg // Invoke the stored task and make the state ready at thread exit. 1472 1.1.1.6 mrg virtual void 1473 1.1.1.6 mrg _M_run_delayed(_Args&&... __args, weak_ptr<_State_base>) = 0; 1474 1.1 mrg 1475 1.1.1.2 mrg virtual shared_ptr<_Task_state_base> 1476 1.1.1.2 mrg _M_reset() = 0; 1477 1.1.1.2 mrg 1478 1.1.1.2 mrg typedef __future_base::_Ptr<_Result<_Res>> _Ptr_type; 1479 1.1.1.2 mrg _Ptr_type _M_result; 1480 1.1.1.2 mrg }; 1481 1.1.1.2 mrg 1482 1.1.1.6 mrg // Holds a packaged_task's stored task. 1483 1.1.1.2 mrg template<typename _Fn, typename _Alloc, typename _Res, typename... _Args> 1484 1.1.1.2 mrg struct __future_base::_Task_state<_Fn, _Alloc, _Res(_Args...)> final 1485 1.1.1.2 mrg : __future_base::_Task_state_base<_Res(_Args...)> 1486 1.1.1.2 mrg { 1487 1.1.1.3 skrll template<typename _Fn2> 1488 1.1.1.3 skrll _Task_state(_Fn2&& __fn, const _Alloc& __a) 1489 1.1.1.3 skrll : _Task_state_base<_Res(_Args...)>(__a), 1490 1.1.1.3 skrll _M_impl(std::forward<_Fn2>(__fn), __a) 1491 1.1.1.3 skrll { } 1492 1.1.1.2 mrg 1493 1.1.1.2 mrg private: 1494 1.1.1.2 mrg virtual void 1495 1.1.1.6 mrg _M_run(_Args&&... __args) 1496 1.1 mrg { 1497 1.1.1.14 mrg auto __boundfn = [&] () -> _Res { 1498 1.1.1.14 mrg return std::__invoke_r<_Res>(_M_impl._M_fn, 1499 1.1.1.14 mrg std::forward<_Args>(__args)...); 1500 1.1.1.9 mrg }; 1501 1.1.1.6 mrg this->_M_set_result(_S_task_setter(this->_M_result, __boundfn)); 1502 1.1.1.6 mrg } 1503 1.1.1.6 mrg 1504 1.1.1.6 mrg virtual void 1505 1.1.1.6 mrg _M_run_delayed(_Args&&... __args, weak_ptr<_State_base> __self) 1506 1.1.1.6 mrg { 1507 1.1.1.14 mrg auto __boundfn = [&] () -> _Res { 1508 1.1.1.14 mrg return std::__invoke_r<_Res>(_M_impl._M_fn, 1509 1.1.1.14 mrg std::forward<_Args>(__args)...); 1510 1.1.1.9 mrg }; 1511 1.1.1.6 mrg this->_M_set_delayed_result(_S_task_setter(this->_M_result, __boundfn), 1512 1.1.1.6 mrg std::move(__self)); 1513 1.1 mrg } 1514 1.1 mrg 1515 1.1.1.2 mrg virtual shared_ptr<_Task_state_base<_Res(_Args...)>> 1516 1.1.1.2 mrg _M_reset(); 1517 1.1 mrg 1518 1.1.1.2 mrg struct _Impl : _Alloc 1519 1.1.1.2 mrg { 1520 1.1.1.3 skrll template<typename _Fn2> 1521 1.1.1.3 skrll _Impl(_Fn2&& __fn, const _Alloc& __a) 1522 1.1.1.3 skrll : _Alloc(__a), _M_fn(std::forward<_Fn2>(__fn)) { } 1523 1.1.1.2 mrg _Fn _M_fn; 1524 1.1.1.2 mrg } _M_impl; 1525 1.1 mrg }; 1526 1.1 mrg 1527 1.1.1.14 mrg template<typename _Signature, typename _Fn, 1528 1.1.1.14 mrg typename _Alloc = std::allocator<int>> 1529 1.1.1.3 skrll static shared_ptr<__future_base::_Task_state_base<_Signature>> 1530 1.1.1.14 mrg __create_task_state(_Fn&& __fn, const _Alloc& __a = _Alloc()) 1531 1.1.1.3 skrll { 1532 1.1.1.3 skrll typedef typename decay<_Fn>::type _Fn2; 1533 1.1.1.3 skrll typedef __future_base::_Task_state<_Fn2, _Alloc, _Signature> _State; 1534 1.1.1.3 skrll return std::allocate_shared<_State>(__a, std::forward<_Fn>(__fn), __a); 1535 1.1.1.3 skrll } 1536 1.1.1.2 mrg 1537 1.1.1.2 mrg template<typename _Fn, typename _Alloc, typename _Res, typename... _Args> 1538 1.1.1.2 mrg shared_ptr<__future_base::_Task_state_base<_Res(_Args...)>> 1539 1.1.1.2 mrg __future_base::_Task_state<_Fn, _Alloc, _Res(_Args...)>::_M_reset() 1540 1.1.1.2 mrg { 1541 1.1.1.2 mrg return __create_task_state<_Res(_Args...)>(std::move(_M_impl._M_fn), 1542 1.1.1.2 mrg static_cast<_Alloc&>(_M_impl)); 1543 1.1.1.2 mrg } 1544 1.1.1.16 mrg /// @endcond 1545 1.1.1.2 mrg 1546 1.1 mrg /// packaged_task 1547 1.1 mrg template<typename _Res, typename... _ArgTypes> 1548 1.1 mrg class packaged_task<_Res(_ArgTypes...)> 1549 1.1 mrg { 1550 1.1.1.2 mrg typedef __future_base::_Task_state_base<_Res(_ArgTypes...)> _State_type; 1551 1.1 mrg shared_ptr<_State_type> _M_state; 1552 1.1 mrg 1553 1.1.1.13 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 1554 1.1.1.13 mrg // 3039. Unnecessary decay in thread and packaged_task 1555 1.1.1.13 mrg template<typename _Fn, typename _Fn2 = __remove_cvref_t<_Fn>> 1556 1.1.1.13 mrg using __not_same 1557 1.1.1.13 mrg = typename enable_if<!is_same<packaged_task, _Fn2>::value>::type; 1558 1.1.1.13 mrg 1559 1.1 mrg public: 1560 1.1 mrg // Construction and destruction 1561 1.1.1.2 mrg packaged_task() noexcept { } 1562 1.1 mrg 1563 1.1.1.13 mrg template<typename _Fn, typename = __not_same<_Fn>> 1564 1.1.1.2 mrg explicit 1565 1.1.1.2 mrg packaged_task(_Fn&& __fn) 1566 1.1.1.14 mrg : _M_state( 1567 1.1.1.14 mrg __create_task_state<_Res(_ArgTypes...)>(std::forward<_Fn>(__fn))) 1568 1.1.1.18 mrg { 1569 1.1.1.18 mrg #ifdef __cpp_lib_is_invocable // C++ >= 17 1570 1.1.1.18 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 1571 1.1.1.18 mrg // 4154. The Mandates for std::packaged_task's constructor 1572 1.1.1.18 mrg // from a callable entity should consider decaying 1573 1.1.1.18 mrg static_assert(is_invocable_r_v<_Res, decay_t<_Fn>&, _ArgTypes...>); 1574 1.1.1.18 mrg #endif 1575 1.1.1.18 mrg } 1576 1.1.1.2 mrg 1577 1.1.1.14 mrg #if __cplusplus < 201703L 1578 1.1.1.2 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 1579 1.1.1.14 mrg // 2097. packaged_task constructors should be constrained 1580 1.1.1.7 mrg // 2407. [this constructor should not be] explicit 1581 1.1.1.14 mrg // 2921. packaged_task and type-erased allocators 1582 1.1.1.13 mrg template<typename _Fn, typename _Alloc, typename = __not_same<_Fn>> 1583 1.1.1.2 mrg packaged_task(allocator_arg_t, const _Alloc& __a, _Fn&& __fn) 1584 1.1.1.2 mrg : _M_state(__create_task_state<_Res(_ArgTypes...)>( 1585 1.1.1.13 mrg std::forward<_Fn>(__fn), __a)) 1586 1.1.1.2 mrg { } 1587 1.1 mrg 1588 1.1.1.14 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 1589 1.1.1.14 mrg // 2095. missing constructors needed for uses-allocator construction 1590 1.1.1.14 mrg template<typename _Allocator> 1591 1.1.1.18 mrg packaged_task(allocator_arg_t, const _Allocator&) noexcept 1592 1.1.1.14 mrg { } 1593 1.1.1.14 mrg 1594 1.1.1.14 mrg template<typename _Allocator> 1595 1.1.1.14 mrg packaged_task(allocator_arg_t, const _Allocator&, 1596 1.1.1.14 mrg const packaged_task&) = delete; 1597 1.1.1.14 mrg 1598 1.1.1.14 mrg template<typename _Allocator> 1599 1.1.1.14 mrg packaged_task(allocator_arg_t, const _Allocator&, 1600 1.1.1.14 mrg packaged_task&& __other) noexcept 1601 1.1.1.14 mrg { this->swap(__other); } 1602 1.1.1.14 mrg #endif 1603 1.1.1.14 mrg 1604 1.1 mrg ~packaged_task() 1605 1.1 mrg { 1606 1.1 mrg if (static_cast<bool>(_M_state) && !_M_state.unique()) 1607 1.1.1.2 mrg _M_state->_M_break_promise(std::move(_M_state->_M_result)); 1608 1.1 mrg } 1609 1.1 mrg 1610 1.1 mrg // No copy 1611 1.1.1.2 mrg packaged_task(const packaged_task&) = delete; 1612 1.1.1.2 mrg packaged_task& operator=(const packaged_task&) = delete; 1613 1.1.1.2 mrg 1614 1.1 mrg // Move support 1615 1.1.1.2 mrg packaged_task(packaged_task&& __other) noexcept 1616 1.1 mrg { this->swap(__other); } 1617 1.1 mrg 1618 1.1.1.2 mrg packaged_task& operator=(packaged_task&& __other) noexcept 1619 1.1 mrg { 1620 1.1.1.2 mrg packaged_task(std::move(__other)).swap(*this); 1621 1.1.1.2 mrg return *this; 1622 1.1 mrg } 1623 1.1 mrg 1624 1.1 mrg void 1625 1.1.1.2 mrg swap(packaged_task& __other) noexcept 1626 1.1 mrg { _M_state.swap(__other._M_state); } 1627 1.1 mrg 1628 1.1.1.2 mrg bool 1629 1.1.1.2 mrg valid() const noexcept 1630 1.1.1.2 mrg { return static_cast<bool>(_M_state); } 1631 1.1 mrg 1632 1.1 mrg // Result retrieval 1633 1.1 mrg future<_Res> 1634 1.1 mrg get_future() 1635 1.1 mrg { return future<_Res>(_M_state); } 1636 1.1 mrg 1637 1.1 mrg // Execution 1638 1.1 mrg void 1639 1.1 mrg operator()(_ArgTypes... __args) 1640 1.1 mrg { 1641 1.1.1.2 mrg __future_base::_State_base::_S_check(_M_state); 1642 1.1.1.6 mrg _M_state->_M_run(std::forward<_ArgTypes>(__args)...); 1643 1.1.1.6 mrg } 1644 1.1.1.6 mrg 1645 1.1.1.6 mrg void 1646 1.1.1.6 mrg make_ready_at_thread_exit(_ArgTypes... __args) 1647 1.1.1.6 mrg { 1648 1.1.1.6 mrg __future_base::_State_base::_S_check(_M_state); 1649 1.1.1.6 mrg _M_state->_M_run_delayed(std::forward<_ArgTypes>(__args)..., _M_state); 1650 1.1 mrg } 1651 1.1 mrg 1652 1.1 mrg void 1653 1.1 mrg reset() 1654 1.1 mrg { 1655 1.1.1.2 mrg __future_base::_State_base::_S_check(_M_state); 1656 1.1.1.2 mrg packaged_task __tmp; 1657 1.1.1.2 mrg __tmp._M_state = _M_state; 1658 1.1.1.2 mrg _M_state = _M_state->_M_reset(); 1659 1.1 mrg } 1660 1.1 mrg }; 1661 1.1 mrg 1662 1.1.1.16 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 1663 1.1.1.16 mrg // 3117. Missing packaged_task deduction guides 1664 1.1.1.16 mrg #if __cpp_deduction_guides >= 201606 1665 1.1.1.16 mrg template<typename _Res, typename... _ArgTypes> 1666 1.1.1.16 mrg packaged_task(_Res(*)(_ArgTypes...)) -> packaged_task<_Res(_ArgTypes...)>; 1667 1.1.1.16 mrg 1668 1.1.1.18 mrg template<typename _Fun, typename _Signature 1669 1.1.1.18 mrg = __function_guide_t<_Fun, decltype(&_Fun::operator())>> 1670 1.1.1.16 mrg packaged_task(_Fun) -> packaged_task<_Signature>; 1671 1.1.1.16 mrg #endif 1672 1.1.1.16 mrg 1673 1.1.1.2 mrg /// swap 1674 1.1 mrg template<typename _Res, typename... _ArgTypes> 1675 1.1 mrg inline void 1676 1.1 mrg swap(packaged_task<_Res(_ArgTypes...)>& __x, 1677 1.1.1.2 mrg packaged_task<_Res(_ArgTypes...)>& __y) noexcept 1678 1.1 mrg { __x.swap(__y); } 1679 1.1.1.2 mrg 1680 1.1.1.14 mrg #if __cplusplus < 201703L 1681 1.1.1.14 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 1682 1.1.1.14 mrg // 2976. Dangling uses_allocator specialization for packaged_task 1683 1.1.1.2 mrg template<typename _Res, typename _Alloc> 1684 1.1.1.2 mrg struct uses_allocator<packaged_task<_Res>, _Alloc> 1685 1.1.1.2 mrg : public true_type { }; 1686 1.1.1.14 mrg #endif 1687 1.1.1.2 mrg 1688 1.1.1.16 mrg /// @cond undocumented 1689 1.1.1.16 mrg 1690 1.1.1.6 mrg // Shared state created by std::async(). 1691 1.1.1.6 mrg // Holds a deferred function and storage for its result. 1692 1.1.1.2 mrg template<typename _BoundFn, typename _Res> 1693 1.1.1.2 mrg class __future_base::_Deferred_state final 1694 1.1.1.2 mrg : public __future_base::_State_base 1695 1.1 mrg { 1696 1.1 mrg public: 1697 1.1.1.16 mrg template<typename... _Args> 1698 1.1.1.16 mrg explicit 1699 1.1.1.16 mrg _Deferred_state(_Args&&... __args) 1700 1.1.1.16 mrg : _M_result(new _Result<_Res>()), 1701 1.1.1.16 mrg _M_fn(std::forward<_Args>(__args)...) 1702 1.1.1.16 mrg { } 1703 1.1 mrg 1704 1.1 mrg private: 1705 1.1.1.2 mrg typedef __future_base::_Ptr<_Result<_Res>> _Ptr_type; 1706 1.1 mrg _Ptr_type _M_result; 1707 1.1.1.2 mrg _BoundFn _M_fn; 1708 1.1 mrg 1709 1.1.1.6 mrg // Run the deferred function. 1710 1.1 mrg virtual void 1711 1.1.1.6 mrg _M_complete_async() 1712 1.1 mrg { 1713 1.1.1.6 mrg // Multiple threads can call a waiting function on the future and 1714 1.1.1.6 mrg // reach this point at the same time. The call_once in _M_set_result 1715 1.1.1.6 mrg // ensures only the first one run the deferred function, stores the 1716 1.1.1.6 mrg // result in _M_result, swaps that with the base _M_result and makes 1717 1.1.1.6 mrg // the state ready. Tell _M_set_result to ignore failure so all later 1718 1.1.1.6 mrg // calls do nothing. 1719 1.1.1.2 mrg _M_set_result(_S_task_setter(_M_result, _M_fn), true); 1720 1.1 mrg } 1721 1.1.1.6 mrg 1722 1.1.1.6 mrg // Caller should check whether the state is ready first, because this 1723 1.1.1.6 mrg // function will return true even after the deferred function has run. 1724 1.1.1.6 mrg virtual bool _M_is_deferred_future() const { return true; } 1725 1.1 mrg }; 1726 1.1 mrg 1727 1.1.1.6 mrg // Common functionality hoisted out of the _Async_state_impl template. 1728 1.1.1.6 mrg class __future_base::_Async_state_commonV2 1729 1.1.1.6 mrg : public __future_base::_State_base 1730 1.1.1.2 mrg { 1731 1.1.1.2 mrg protected: 1732 1.1.1.6 mrg ~_Async_state_commonV2() = default; 1733 1.1 mrg 1734 1.1.1.6 mrg // Make waiting functions block until the thread completes, as if joined. 1735 1.1.1.6 mrg // 1736 1.1.1.6 mrg // This function is used by wait() to satisfy the first requirement below 1737 1.1.1.6 mrg // and by wait_for() / wait_until() to satisfy the second. 1738 1.1.1.6 mrg // 1739 1.1.1.6 mrg // [futures.async]: 1740 1.1.1.6 mrg // 1741 1.1.1.13 mrg // - a call to a waiting function on an asynchronous return object that 1742 1.1.1.6 mrg // shares the shared state created by this async call shall block until 1743 1.1.1.6 mrg // the associated thread has completed, as if joined, or else time out. 1744 1.1.1.6 mrg // 1745 1.1.1.13 mrg // - the associated thread completion synchronizes with the return from 1746 1.1.1.6 mrg // the first function that successfully detects the ready status of the 1747 1.1.1.6 mrg // shared state or with the return from the last function that releases 1748 1.1.1.6 mrg // the shared state, whichever happens first. 1749 1.1.1.6 mrg virtual void _M_complete_async() { _M_join(); } 1750 1.1 mrg 1751 1.1.1.7 mrg void _M_join() { std::call_once(_M_once, &thread::join, &_M_thread); } 1752 1.1 mrg 1753 1.1.1.2 mrg thread _M_thread; 1754 1.1.1.2 mrg once_flag _M_once; 1755 1.1.1.2 mrg }; 1756 1.1.1.2 mrg 1757 1.1.1.6 mrg // Shared state created by std::async(). 1758 1.1.1.6 mrg // Starts a new thread that runs a function and makes the shared state ready. 1759 1.1.1.2 mrg template<typename _BoundFn, typename _Res> 1760 1.1.1.2 mrg class __future_base::_Async_state_impl final 1761 1.1.1.6 mrg : public __future_base::_Async_state_commonV2 1762 1.1.1.2 mrg { 1763 1.1.1.2 mrg public: 1764 1.1.1.16 mrg template<typename... _Args> 1765 1.1.1.16 mrg explicit 1766 1.1.1.16 mrg _Async_state_impl(_Args&&... __args) 1767 1.1.1.16 mrg : _M_result(new _Result<_Res>()), 1768 1.1.1.16 mrg _M_fn(std::forward<_Args>(__args)...) 1769 1.1.1.16 mrg { 1770 1.1.1.16 mrg _M_thread = std::thread{&_Async_state_impl::_M_run, this}; 1771 1.1.1.16 mrg } 1772 1.1 mrg 1773 1.1.1.6 mrg // Must not destroy _M_result and _M_fn until the thread finishes. 1774 1.1.1.6 mrg // Call join() directly rather than through _M_join() because no other 1775 1.1.1.6 mrg // thread can be referring to this state if it is being destroyed. 1776 1.1.1.16 mrg ~_Async_state_impl() 1777 1.1.1.16 mrg { 1778 1.1.1.16 mrg if (_M_thread.joinable()) 1779 1.1.1.16 mrg _M_thread.join(); 1780 1.1.1.16 mrg } 1781 1.1.1.2 mrg 1782 1.1.1.2 mrg private: 1783 1.1.1.16 mrg void 1784 1.1.1.16 mrg _M_run() 1785 1.1.1.16 mrg { 1786 1.1.1.16 mrg __try 1787 1.1.1.16 mrg { 1788 1.1.1.16 mrg _M_set_result(_S_task_setter(_M_result, _M_fn)); 1789 1.1.1.16 mrg } 1790 1.1.1.16 mrg __catch (const __cxxabiv1::__forced_unwind&) 1791 1.1.1.16 mrg { 1792 1.1.1.16 mrg // make the shared state ready on thread cancellation 1793 1.1.1.16 mrg if (static_cast<bool>(_M_result)) 1794 1.1.1.16 mrg this->_M_break_promise(std::move(_M_result)); 1795 1.1.1.16 mrg __throw_exception_again; 1796 1.1.1.16 mrg } 1797 1.1.1.16 mrg } 1798 1.1.1.16 mrg 1799 1.1.1.2 mrg typedef __future_base::_Ptr<_Result<_Res>> _Ptr_type; 1800 1.1 mrg _Ptr_type _M_result; 1801 1.1.1.2 mrg _BoundFn _M_fn; 1802 1.1 mrg }; 1803 1.1.1.16 mrg /// @endcond 1804 1.1.1.2 mrg 1805 1.1.1.2 mrg /// async 1806 1.1 mrg template<typename _Fn, typename... _Args> 1807 1.1.1.13 mrg _GLIBCXX_NODISCARD future<__async_result_of<_Fn, _Args...>> 1808 1.1 mrg async(launch __policy, _Fn&& __fn, _Args&&... __args) 1809 1.1 mrg { 1810 1.1.1.16 mrg using _Wr = std::thread::_Call_wrapper<_Fn, _Args...>; 1811 1.1.1.16 mrg using _As = __future_base::_Async_state_impl<_Wr>; 1812 1.1.1.16 mrg using _Ds = __future_base::_Deferred_state<_Wr>; 1813 1.1.1.16 mrg 1814 1.1.1.2 mrg std::shared_ptr<__future_base::_State_base> __state; 1815 1.1.1.7 mrg if ((__policy & launch::async) == launch::async) 1816 1.1 mrg { 1817 1.1.1.7 mrg __try 1818 1.1.1.7 mrg { 1819 1.1.1.16 mrg __state = std::make_shared<_As>(std::forward<_Fn>(__fn), 1820 1.1.1.16 mrg std::forward<_Args>(__args)...); 1821 1.1.1.7 mrg } 1822 1.1.1.7 mrg #if __cpp_exceptions 1823 1.1.1.7 mrg catch(const system_error& __e) 1824 1.1.1.7 mrg { 1825 1.1.1.7 mrg if (__e.code() != errc::resource_unavailable_try_again 1826 1.1.1.7 mrg || (__policy & launch::deferred) != launch::deferred) 1827 1.1.1.7 mrg throw; 1828 1.1.1.7 mrg } 1829 1.1.1.7 mrg #endif 1830 1.1 mrg } 1831 1.1.1.7 mrg if (!__state) 1832 1.1 mrg { 1833 1.1.1.16 mrg __state = std::make_shared<_Ds>(std::forward<_Fn>(__fn), 1834 1.1.1.16 mrg std::forward<_Args>(__args)...); 1835 1.1 mrg } 1836 1.1.1.16 mrg return future<__async_result_of<_Fn, _Args...>>(std::move(__state)); 1837 1.1 mrg } 1838 1.1 mrg 1839 1.1.1.2 mrg /// async, potential overload 1840 1.1 mrg template<typename _Fn, typename... _Args> 1841 1.1.1.13 mrg _GLIBCXX_NODISCARD inline future<__async_result_of<_Fn, _Args...>> 1842 1.1 mrg async(_Fn&& __fn, _Args&&... __args) 1843 1.1 mrg { 1844 1.1.1.7 mrg return std::async(launch::async|launch::deferred, 1845 1.1.1.7 mrg std::forward<_Fn>(__fn), 1846 1.1.1.7 mrg std::forward<_Args>(__args)...); 1847 1.1 mrg } 1848 1.1 mrg 1849 1.1.1.6 mrg #endif // _GLIBCXX_ASYNC_ABI_COMPAT 1850 1.1.1.13 mrg #endif // _GLIBCXX_HAS_GTHREADS 1851 1.1 mrg 1852 1.1.1.15 mrg /// @} group futures 1853 1.1.1.2 mrg _GLIBCXX_END_NAMESPACE_VERSION 1854 1.1.1.2 mrg } // namespace 1855 1.1 mrg 1856 1.1.1.2 mrg #endif // C++11 1857 1.1 mrg 1858 1.1 mrg #endif // _GLIBCXX_FUTURE 1859