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