1*58b9f456SAndroid Build Coastguard Worker// -*- C++ -*- 2*58b9f456SAndroid Build Coastguard Worker//===--------------------------- mutex ------------------------------------===// 3*58b9f456SAndroid Build Coastguard Worker// 4*58b9f456SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 5*58b9f456SAndroid Build Coastguard Worker// 6*58b9f456SAndroid Build Coastguard Worker// This file is dual licensed under the MIT and the University of Illinois Open 7*58b9f456SAndroid Build Coastguard Worker// Source Licenses. See LICENSE.TXT for details. 8*58b9f456SAndroid Build Coastguard Worker// 9*58b9f456SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 10*58b9f456SAndroid Build Coastguard Worker 11*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_MUTEX 12*58b9f456SAndroid Build Coastguard Worker#define _LIBCPP_MUTEX 13*58b9f456SAndroid Build Coastguard Worker 14*58b9f456SAndroid Build Coastguard Worker/* 15*58b9f456SAndroid Build Coastguard Worker mutex synopsis 16*58b9f456SAndroid Build Coastguard Worker 17*58b9f456SAndroid Build Coastguard Workernamespace std 18*58b9f456SAndroid Build Coastguard Worker{ 19*58b9f456SAndroid Build Coastguard Worker 20*58b9f456SAndroid Build Coastguard Workerclass mutex 21*58b9f456SAndroid Build Coastguard Worker{ 22*58b9f456SAndroid Build Coastguard Workerpublic: 23*58b9f456SAndroid Build Coastguard Worker constexpr mutex() noexcept; 24*58b9f456SAndroid Build Coastguard Worker ~mutex(); 25*58b9f456SAndroid Build Coastguard Worker 26*58b9f456SAndroid Build Coastguard Worker mutex(const mutex&) = delete; 27*58b9f456SAndroid Build Coastguard Worker mutex& operator=(const mutex&) = delete; 28*58b9f456SAndroid Build Coastguard Worker 29*58b9f456SAndroid Build Coastguard Worker void lock(); 30*58b9f456SAndroid Build Coastguard Worker bool try_lock(); 31*58b9f456SAndroid Build Coastguard Worker void unlock(); 32*58b9f456SAndroid Build Coastguard Worker 33*58b9f456SAndroid Build Coastguard Worker typedef pthread_mutex_t* native_handle_type; 34*58b9f456SAndroid Build Coastguard Worker native_handle_type native_handle(); 35*58b9f456SAndroid Build Coastguard Worker}; 36*58b9f456SAndroid Build Coastguard Worker 37*58b9f456SAndroid Build Coastguard Workerclass recursive_mutex 38*58b9f456SAndroid Build Coastguard Worker{ 39*58b9f456SAndroid Build Coastguard Workerpublic: 40*58b9f456SAndroid Build Coastguard Worker recursive_mutex(); 41*58b9f456SAndroid Build Coastguard Worker ~recursive_mutex(); 42*58b9f456SAndroid Build Coastguard Worker 43*58b9f456SAndroid Build Coastguard Worker recursive_mutex(const recursive_mutex&) = delete; 44*58b9f456SAndroid Build Coastguard Worker recursive_mutex& operator=(const recursive_mutex&) = delete; 45*58b9f456SAndroid Build Coastguard Worker 46*58b9f456SAndroid Build Coastguard Worker void lock(); 47*58b9f456SAndroid Build Coastguard Worker bool try_lock() noexcept; 48*58b9f456SAndroid Build Coastguard Worker void unlock(); 49*58b9f456SAndroid Build Coastguard Worker 50*58b9f456SAndroid Build Coastguard Worker typedef pthread_mutex_t* native_handle_type; 51*58b9f456SAndroid Build Coastguard Worker native_handle_type native_handle(); 52*58b9f456SAndroid Build Coastguard Worker}; 53*58b9f456SAndroid Build Coastguard Worker 54*58b9f456SAndroid Build Coastguard Workerclass timed_mutex 55*58b9f456SAndroid Build Coastguard Worker{ 56*58b9f456SAndroid Build Coastguard Workerpublic: 57*58b9f456SAndroid Build Coastguard Worker timed_mutex(); 58*58b9f456SAndroid Build Coastguard Worker ~timed_mutex(); 59*58b9f456SAndroid Build Coastguard Worker 60*58b9f456SAndroid Build Coastguard Worker timed_mutex(const timed_mutex&) = delete; 61*58b9f456SAndroid Build Coastguard Worker timed_mutex& operator=(const timed_mutex&) = delete; 62*58b9f456SAndroid Build Coastguard Worker 63*58b9f456SAndroid Build Coastguard Worker void lock(); 64*58b9f456SAndroid Build Coastguard Worker bool try_lock(); 65*58b9f456SAndroid Build Coastguard Worker template <class Rep, class Period> 66*58b9f456SAndroid Build Coastguard Worker bool try_lock_for(const chrono::duration<Rep, Period>& rel_time); 67*58b9f456SAndroid Build Coastguard Worker template <class Clock, class Duration> 68*58b9f456SAndroid Build Coastguard Worker bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time); 69*58b9f456SAndroid Build Coastguard Worker void unlock(); 70*58b9f456SAndroid Build Coastguard Worker}; 71*58b9f456SAndroid Build Coastguard Worker 72*58b9f456SAndroid Build Coastguard Workerclass recursive_timed_mutex 73*58b9f456SAndroid Build Coastguard Worker{ 74*58b9f456SAndroid Build Coastguard Workerpublic: 75*58b9f456SAndroid Build Coastguard Worker recursive_timed_mutex(); 76*58b9f456SAndroid Build Coastguard Worker ~recursive_timed_mutex(); 77*58b9f456SAndroid Build Coastguard Worker 78*58b9f456SAndroid Build Coastguard Worker recursive_timed_mutex(const recursive_timed_mutex&) = delete; 79*58b9f456SAndroid Build Coastguard Worker recursive_timed_mutex& operator=(const recursive_timed_mutex&) = delete; 80*58b9f456SAndroid Build Coastguard Worker 81*58b9f456SAndroid Build Coastguard Worker void lock(); 82*58b9f456SAndroid Build Coastguard Worker bool try_lock() noexcept; 83*58b9f456SAndroid Build Coastguard Worker template <class Rep, class Period> 84*58b9f456SAndroid Build Coastguard Worker bool try_lock_for(const chrono::duration<Rep, Period>& rel_time); 85*58b9f456SAndroid Build Coastguard Worker template <class Clock, class Duration> 86*58b9f456SAndroid Build Coastguard Worker bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time); 87*58b9f456SAndroid Build Coastguard Worker void unlock(); 88*58b9f456SAndroid Build Coastguard Worker}; 89*58b9f456SAndroid Build Coastguard Worker 90*58b9f456SAndroid Build Coastguard Workerstruct defer_lock_t {}; 91*58b9f456SAndroid Build Coastguard Workerstruct try_to_lock_t {}; 92*58b9f456SAndroid Build Coastguard Workerstruct adopt_lock_t {}; 93*58b9f456SAndroid Build Coastguard Worker 94*58b9f456SAndroid Build Coastguard Workerinline constexpr defer_lock_t defer_lock{}; 95*58b9f456SAndroid Build Coastguard Workerinline constexpr try_to_lock_t try_to_lock{}; 96*58b9f456SAndroid Build Coastguard Workerinline constexpr adopt_lock_t adopt_lock{}; 97*58b9f456SAndroid Build Coastguard Worker 98*58b9f456SAndroid Build Coastguard Workertemplate <class Mutex> 99*58b9f456SAndroid Build Coastguard Workerclass lock_guard 100*58b9f456SAndroid Build Coastguard Worker{ 101*58b9f456SAndroid Build Coastguard Workerpublic: 102*58b9f456SAndroid Build Coastguard Worker typedef Mutex mutex_type; 103*58b9f456SAndroid Build Coastguard Worker 104*58b9f456SAndroid Build Coastguard Worker explicit lock_guard(mutex_type& m); 105*58b9f456SAndroid Build Coastguard Worker lock_guard(mutex_type& m, adopt_lock_t); 106*58b9f456SAndroid Build Coastguard Worker ~lock_guard(); 107*58b9f456SAndroid Build Coastguard Worker 108*58b9f456SAndroid Build Coastguard Worker lock_guard(lock_guard const&) = delete; 109*58b9f456SAndroid Build Coastguard Worker lock_guard& operator=(lock_guard const&) = delete; 110*58b9f456SAndroid Build Coastguard Worker}; 111*58b9f456SAndroid Build Coastguard Worker 112*58b9f456SAndroid Build Coastguard Workertemplate <class... MutexTypes> 113*58b9f456SAndroid Build Coastguard Workerclass scoped_lock // C++17 114*58b9f456SAndroid Build Coastguard Worker{ 115*58b9f456SAndroid Build Coastguard Workerpublic: 116*58b9f456SAndroid Build Coastguard Worker using mutex_type = Mutex; // If MutexTypes... consists of the single type Mutex 117*58b9f456SAndroid Build Coastguard Worker 118*58b9f456SAndroid Build Coastguard Worker explicit scoped_lock(MutexTypes&... m); 119*58b9f456SAndroid Build Coastguard Worker scoped_lock(adopt_lock_t, MutexTypes&... m); 120*58b9f456SAndroid Build Coastguard Worker ~scoped_lock(); 121*58b9f456SAndroid Build Coastguard Worker scoped_lock(scoped_lock const&) = delete; 122*58b9f456SAndroid Build Coastguard Worker scoped_lock& operator=(scoped_lock const&) = delete; 123*58b9f456SAndroid Build Coastguard Workerprivate: 124*58b9f456SAndroid Build Coastguard Worker tuple<MutexTypes&...> pm; // exposition only 125*58b9f456SAndroid Build Coastguard Worker}; 126*58b9f456SAndroid Build Coastguard Worker 127*58b9f456SAndroid Build Coastguard Workertemplate <class Mutex> 128*58b9f456SAndroid Build Coastguard Workerclass unique_lock 129*58b9f456SAndroid Build Coastguard Worker{ 130*58b9f456SAndroid Build Coastguard Workerpublic: 131*58b9f456SAndroid Build Coastguard Worker typedef Mutex mutex_type; 132*58b9f456SAndroid Build Coastguard Worker unique_lock() noexcept; 133*58b9f456SAndroid Build Coastguard Worker explicit unique_lock(mutex_type& m); 134*58b9f456SAndroid Build Coastguard Worker unique_lock(mutex_type& m, defer_lock_t) noexcept; 135*58b9f456SAndroid Build Coastguard Worker unique_lock(mutex_type& m, try_to_lock_t); 136*58b9f456SAndroid Build Coastguard Worker unique_lock(mutex_type& m, adopt_lock_t); 137*58b9f456SAndroid Build Coastguard Worker template <class Clock, class Duration> 138*58b9f456SAndroid Build Coastguard Worker unique_lock(mutex_type& m, const chrono::time_point<Clock, Duration>& abs_time); 139*58b9f456SAndroid Build Coastguard Worker template <class Rep, class Period> 140*58b9f456SAndroid Build Coastguard Worker unique_lock(mutex_type& m, const chrono::duration<Rep, Period>& rel_time); 141*58b9f456SAndroid Build Coastguard Worker ~unique_lock(); 142*58b9f456SAndroid Build Coastguard Worker 143*58b9f456SAndroid Build Coastguard Worker unique_lock(unique_lock const&) = delete; 144*58b9f456SAndroid Build Coastguard Worker unique_lock& operator=(unique_lock const&) = delete; 145*58b9f456SAndroid Build Coastguard Worker 146*58b9f456SAndroid Build Coastguard Worker unique_lock(unique_lock&& u) noexcept; 147*58b9f456SAndroid Build Coastguard Worker unique_lock& operator=(unique_lock&& u) noexcept; 148*58b9f456SAndroid Build Coastguard Worker 149*58b9f456SAndroid Build Coastguard Worker void lock(); 150*58b9f456SAndroid Build Coastguard Worker bool try_lock(); 151*58b9f456SAndroid Build Coastguard Worker 152*58b9f456SAndroid Build Coastguard Worker template <class Rep, class Period> 153*58b9f456SAndroid Build Coastguard Worker bool try_lock_for(const chrono::duration<Rep, Period>& rel_time); 154*58b9f456SAndroid Build Coastguard Worker template <class Clock, class Duration> 155*58b9f456SAndroid Build Coastguard Worker bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time); 156*58b9f456SAndroid Build Coastguard Worker 157*58b9f456SAndroid Build Coastguard Worker void unlock(); 158*58b9f456SAndroid Build Coastguard Worker 159*58b9f456SAndroid Build Coastguard Worker void swap(unique_lock& u) noexcept; 160*58b9f456SAndroid Build Coastguard Worker mutex_type* release() noexcept; 161*58b9f456SAndroid Build Coastguard Worker 162*58b9f456SAndroid Build Coastguard Worker bool owns_lock() const noexcept; 163*58b9f456SAndroid Build Coastguard Worker explicit operator bool () const noexcept; 164*58b9f456SAndroid Build Coastguard Worker mutex_type* mutex() const noexcept; 165*58b9f456SAndroid Build Coastguard Worker}; 166*58b9f456SAndroid Build Coastguard Worker 167*58b9f456SAndroid Build Coastguard Workertemplate <class Mutex> 168*58b9f456SAndroid Build Coastguard Worker void swap(unique_lock<Mutex>& x, unique_lock<Mutex>& y) noexcept; 169*58b9f456SAndroid Build Coastguard Worker 170*58b9f456SAndroid Build Coastguard Workertemplate <class L1, class L2, class... L3> 171*58b9f456SAndroid Build Coastguard Worker int try_lock(L1&, L2&, L3&...); 172*58b9f456SAndroid Build Coastguard Workertemplate <class L1, class L2, class... L3> 173*58b9f456SAndroid Build Coastguard Worker void lock(L1&, L2&, L3&...); 174*58b9f456SAndroid Build Coastguard Worker 175*58b9f456SAndroid Build Coastguard Workerstruct once_flag 176*58b9f456SAndroid Build Coastguard Worker{ 177*58b9f456SAndroid Build Coastguard Worker constexpr once_flag() noexcept; 178*58b9f456SAndroid Build Coastguard Worker 179*58b9f456SAndroid Build Coastguard Worker once_flag(const once_flag&) = delete; 180*58b9f456SAndroid Build Coastguard Worker once_flag& operator=(const once_flag&) = delete; 181*58b9f456SAndroid Build Coastguard Worker}; 182*58b9f456SAndroid Build Coastguard Worker 183*58b9f456SAndroid Build Coastguard Workertemplate<class Callable, class ...Args> 184*58b9f456SAndroid Build Coastguard Worker void call_once(once_flag& flag, Callable&& func, Args&&... args); 185*58b9f456SAndroid Build Coastguard Worker 186*58b9f456SAndroid Build Coastguard Worker} // std 187*58b9f456SAndroid Build Coastguard Worker 188*58b9f456SAndroid Build Coastguard Worker*/ 189*58b9f456SAndroid Build Coastguard Worker 190*58b9f456SAndroid Build Coastguard Worker#include <__config> 191*58b9f456SAndroid Build Coastguard Worker#include <__mutex_base> 192*58b9f456SAndroid Build Coastguard Worker#include <functional> 193*58b9f456SAndroid Build Coastguard Worker#include <memory> 194*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG 195*58b9f456SAndroid Build Coastguard Worker#include <tuple> 196*58b9f456SAndroid Build Coastguard Worker#endif 197*58b9f456SAndroid Build Coastguard Worker#include <version> 198*58b9f456SAndroid Build Coastguard Worker#include <__threading_support> 199*58b9f456SAndroid Build Coastguard Worker 200*58b9f456SAndroid Build Coastguard Worker#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 201*58b9f456SAndroid Build Coastguard Worker#pragma GCC system_header 202*58b9f456SAndroid Build Coastguard Worker#endif 203*58b9f456SAndroid Build Coastguard Worker 204*58b9f456SAndroid Build Coastguard Worker_LIBCPP_PUSH_MACROS 205*58b9f456SAndroid Build Coastguard Worker#include <__undef_macros> 206*58b9f456SAndroid Build Coastguard Worker 207*58b9f456SAndroid Build Coastguard Worker 208*58b9f456SAndroid Build Coastguard Worker_LIBCPP_BEGIN_NAMESPACE_STD 209*58b9f456SAndroid Build Coastguard Worker 210*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_HAS_NO_THREADS 211*58b9f456SAndroid Build Coastguard Worker 212*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TYPE_VIS recursive_mutex 213*58b9f456SAndroid Build Coastguard Worker{ 214*58b9f456SAndroid Build Coastguard Worker __libcpp_recursive_mutex_t __m_; 215*58b9f456SAndroid Build Coastguard Worker 216*58b9f456SAndroid Build Coastguard Workerpublic: 217*58b9f456SAndroid Build Coastguard Worker recursive_mutex(); 218*58b9f456SAndroid Build Coastguard Worker ~recursive_mutex(); 219*58b9f456SAndroid Build Coastguard Worker 220*58b9f456SAndroid Build Coastguard Workerprivate: 221*58b9f456SAndroid Build Coastguard Worker recursive_mutex(const recursive_mutex&); // = delete; 222*58b9f456SAndroid Build Coastguard Worker recursive_mutex& operator=(const recursive_mutex&); // = delete; 223*58b9f456SAndroid Build Coastguard Worker 224*58b9f456SAndroid Build Coastguard Workerpublic: 225*58b9f456SAndroid Build Coastguard Worker void lock(); 226*58b9f456SAndroid Build Coastguard Worker bool try_lock() _NOEXCEPT; 227*58b9f456SAndroid Build Coastguard Worker void unlock() _NOEXCEPT; 228*58b9f456SAndroid Build Coastguard Worker 229*58b9f456SAndroid Build Coastguard Worker typedef __libcpp_recursive_mutex_t* native_handle_type; 230*58b9f456SAndroid Build Coastguard Worker 231*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 232*58b9f456SAndroid Build Coastguard Worker native_handle_type native_handle() {return &__m_;} 233*58b9f456SAndroid Build Coastguard Worker}; 234*58b9f456SAndroid Build Coastguard Worker 235*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TYPE_VIS timed_mutex 236*58b9f456SAndroid Build Coastguard Worker{ 237*58b9f456SAndroid Build Coastguard Worker mutex __m_; 238*58b9f456SAndroid Build Coastguard Worker condition_variable __cv_; 239*58b9f456SAndroid Build Coastguard Worker bool __locked_; 240*58b9f456SAndroid Build Coastguard Workerpublic: 241*58b9f456SAndroid Build Coastguard Worker timed_mutex(); 242*58b9f456SAndroid Build Coastguard Worker ~timed_mutex(); 243*58b9f456SAndroid Build Coastguard Worker 244*58b9f456SAndroid Build Coastguard Workerprivate: 245*58b9f456SAndroid Build Coastguard Worker timed_mutex(const timed_mutex&); // = delete; 246*58b9f456SAndroid Build Coastguard Worker timed_mutex& operator=(const timed_mutex&); // = delete; 247*58b9f456SAndroid Build Coastguard Worker 248*58b9f456SAndroid Build Coastguard Workerpublic: 249*58b9f456SAndroid Build Coastguard Worker void lock(); 250*58b9f456SAndroid Build Coastguard Worker bool try_lock() _NOEXCEPT; 251*58b9f456SAndroid Build Coastguard Worker template <class _Rep, class _Period> 252*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 253*58b9f456SAndroid Build Coastguard Worker bool try_lock_for(const chrono::duration<_Rep, _Period>& __d) 254*58b9f456SAndroid Build Coastguard Worker {return try_lock_until(chrono::steady_clock::now() + __d);} 255*58b9f456SAndroid Build Coastguard Worker template <class _Clock, class _Duration> 256*58b9f456SAndroid Build Coastguard Worker _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 257*58b9f456SAndroid Build Coastguard Worker bool try_lock_until(const chrono::time_point<_Clock, _Duration>& __t); 258*58b9f456SAndroid Build Coastguard Worker void unlock() _NOEXCEPT; 259*58b9f456SAndroid Build Coastguard Worker}; 260*58b9f456SAndroid Build Coastguard Worker 261*58b9f456SAndroid Build Coastguard Workertemplate <class _Clock, class _Duration> 262*58b9f456SAndroid Build Coastguard Workerbool 263*58b9f456SAndroid Build Coastguard Workertimed_mutex::try_lock_until(const chrono::time_point<_Clock, _Duration>& __t) 264*58b9f456SAndroid Build Coastguard Worker{ 265*58b9f456SAndroid Build Coastguard Worker using namespace chrono; 266*58b9f456SAndroid Build Coastguard Worker unique_lock<mutex> __lk(__m_); 267*58b9f456SAndroid Build Coastguard Worker bool no_timeout = _Clock::now() < __t; 268*58b9f456SAndroid Build Coastguard Worker while (no_timeout && __locked_) 269*58b9f456SAndroid Build Coastguard Worker no_timeout = __cv_.wait_until(__lk, __t) == cv_status::no_timeout; 270*58b9f456SAndroid Build Coastguard Worker if (!__locked_) 271*58b9f456SAndroid Build Coastguard Worker { 272*58b9f456SAndroid Build Coastguard Worker __locked_ = true; 273*58b9f456SAndroid Build Coastguard Worker return true; 274*58b9f456SAndroid Build Coastguard Worker } 275*58b9f456SAndroid Build Coastguard Worker return false; 276*58b9f456SAndroid Build Coastguard Worker} 277*58b9f456SAndroid Build Coastguard Worker 278*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TYPE_VIS recursive_timed_mutex 279*58b9f456SAndroid Build Coastguard Worker{ 280*58b9f456SAndroid Build Coastguard Worker mutex __m_; 281*58b9f456SAndroid Build Coastguard Worker condition_variable __cv_; 282*58b9f456SAndroid Build Coastguard Worker size_t __count_; 283*58b9f456SAndroid Build Coastguard Worker __libcpp_thread_id __id_; 284*58b9f456SAndroid Build Coastguard Workerpublic: 285*58b9f456SAndroid Build Coastguard Worker recursive_timed_mutex(); 286*58b9f456SAndroid Build Coastguard Worker ~recursive_timed_mutex(); 287*58b9f456SAndroid Build Coastguard Worker 288*58b9f456SAndroid Build Coastguard Workerprivate: 289*58b9f456SAndroid Build Coastguard Worker recursive_timed_mutex(const recursive_timed_mutex&); // = delete; 290*58b9f456SAndroid Build Coastguard Worker recursive_timed_mutex& operator=(const recursive_timed_mutex&); // = delete; 291*58b9f456SAndroid Build Coastguard Worker 292*58b9f456SAndroid Build Coastguard Workerpublic: 293*58b9f456SAndroid Build Coastguard Worker void lock(); 294*58b9f456SAndroid Build Coastguard Worker bool try_lock() _NOEXCEPT; 295*58b9f456SAndroid Build Coastguard Worker template <class _Rep, class _Period> 296*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 297*58b9f456SAndroid Build Coastguard Worker bool try_lock_for(const chrono::duration<_Rep, _Period>& __d) 298*58b9f456SAndroid Build Coastguard Worker {return try_lock_until(chrono::steady_clock::now() + __d);} 299*58b9f456SAndroid Build Coastguard Worker template <class _Clock, class _Duration> 300*58b9f456SAndroid Build Coastguard Worker _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 301*58b9f456SAndroid Build Coastguard Worker bool try_lock_until(const chrono::time_point<_Clock, _Duration>& __t); 302*58b9f456SAndroid Build Coastguard Worker void unlock() _NOEXCEPT; 303*58b9f456SAndroid Build Coastguard Worker}; 304*58b9f456SAndroid Build Coastguard Worker 305*58b9f456SAndroid Build Coastguard Workertemplate <class _Clock, class _Duration> 306*58b9f456SAndroid Build Coastguard Workerbool 307*58b9f456SAndroid Build Coastguard Workerrecursive_timed_mutex::try_lock_until(const chrono::time_point<_Clock, _Duration>& __t) 308*58b9f456SAndroid Build Coastguard Worker{ 309*58b9f456SAndroid Build Coastguard Worker using namespace chrono; 310*58b9f456SAndroid Build Coastguard Worker __libcpp_thread_id __id = __libcpp_thread_get_current_id(); 311*58b9f456SAndroid Build Coastguard Worker unique_lock<mutex> lk(__m_); 312*58b9f456SAndroid Build Coastguard Worker if (__libcpp_thread_id_equal(__id, __id_)) 313*58b9f456SAndroid Build Coastguard Worker { 314*58b9f456SAndroid Build Coastguard Worker if (__count_ == numeric_limits<size_t>::max()) 315*58b9f456SAndroid Build Coastguard Worker return false; 316*58b9f456SAndroid Build Coastguard Worker ++__count_; 317*58b9f456SAndroid Build Coastguard Worker return true; 318*58b9f456SAndroid Build Coastguard Worker } 319*58b9f456SAndroid Build Coastguard Worker bool no_timeout = _Clock::now() < __t; 320*58b9f456SAndroid Build Coastguard Worker while (no_timeout && __count_ != 0) 321*58b9f456SAndroid Build Coastguard Worker no_timeout = __cv_.wait_until(lk, __t) == cv_status::no_timeout; 322*58b9f456SAndroid Build Coastguard Worker if (__count_ == 0) 323*58b9f456SAndroid Build Coastguard Worker { 324*58b9f456SAndroid Build Coastguard Worker __count_ = 1; 325*58b9f456SAndroid Build Coastguard Worker __id_ = __id; 326*58b9f456SAndroid Build Coastguard Worker return true; 327*58b9f456SAndroid Build Coastguard Worker } 328*58b9f456SAndroid Build Coastguard Worker return false; 329*58b9f456SAndroid Build Coastguard Worker} 330*58b9f456SAndroid Build Coastguard Worker 331*58b9f456SAndroid Build Coastguard Workertemplate <class _L0, class _L1> 332*58b9f456SAndroid Build Coastguard Workerint 333*58b9f456SAndroid Build Coastguard Workertry_lock(_L0& __l0, _L1& __l1) 334*58b9f456SAndroid Build Coastguard Worker{ 335*58b9f456SAndroid Build Coastguard Worker unique_lock<_L0> __u0(__l0, try_to_lock); 336*58b9f456SAndroid Build Coastguard Worker if (__u0.owns_lock()) 337*58b9f456SAndroid Build Coastguard Worker { 338*58b9f456SAndroid Build Coastguard Worker if (__l1.try_lock()) 339*58b9f456SAndroid Build Coastguard Worker { 340*58b9f456SAndroid Build Coastguard Worker __u0.release(); 341*58b9f456SAndroid Build Coastguard Worker return -1; 342*58b9f456SAndroid Build Coastguard Worker } 343*58b9f456SAndroid Build Coastguard Worker else 344*58b9f456SAndroid Build Coastguard Worker return 1; 345*58b9f456SAndroid Build Coastguard Worker } 346*58b9f456SAndroid Build Coastguard Worker return 0; 347*58b9f456SAndroid Build Coastguard Worker} 348*58b9f456SAndroid Build Coastguard Worker 349*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG 350*58b9f456SAndroid Build Coastguard Worker 351*58b9f456SAndroid Build Coastguard Workertemplate <class _L0, class _L1, class _L2, class... _L3> 352*58b9f456SAndroid Build Coastguard Workerint 353*58b9f456SAndroid Build Coastguard Workertry_lock(_L0& __l0, _L1& __l1, _L2& __l2, _L3&... __l3) 354*58b9f456SAndroid Build Coastguard Worker{ 355*58b9f456SAndroid Build Coastguard Worker int __r = 0; 356*58b9f456SAndroid Build Coastguard Worker unique_lock<_L0> __u0(__l0, try_to_lock); 357*58b9f456SAndroid Build Coastguard Worker if (__u0.owns_lock()) 358*58b9f456SAndroid Build Coastguard Worker { 359*58b9f456SAndroid Build Coastguard Worker __r = try_lock(__l1, __l2, __l3...); 360*58b9f456SAndroid Build Coastguard Worker if (__r == -1) 361*58b9f456SAndroid Build Coastguard Worker __u0.release(); 362*58b9f456SAndroid Build Coastguard Worker else 363*58b9f456SAndroid Build Coastguard Worker ++__r; 364*58b9f456SAndroid Build Coastguard Worker } 365*58b9f456SAndroid Build Coastguard Worker return __r; 366*58b9f456SAndroid Build Coastguard Worker} 367*58b9f456SAndroid Build Coastguard Worker 368*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_CXX03_LANG 369*58b9f456SAndroid Build Coastguard Worker 370*58b9f456SAndroid Build Coastguard Workertemplate <class _L0, class _L1> 371*58b9f456SAndroid Build Coastguard Workervoid 372*58b9f456SAndroid Build Coastguard Workerlock(_L0& __l0, _L1& __l1) 373*58b9f456SAndroid Build Coastguard Worker{ 374*58b9f456SAndroid Build Coastguard Worker while (true) 375*58b9f456SAndroid Build Coastguard Worker { 376*58b9f456SAndroid Build Coastguard Worker { 377*58b9f456SAndroid Build Coastguard Worker unique_lock<_L0> __u0(__l0); 378*58b9f456SAndroid Build Coastguard Worker if (__l1.try_lock()) 379*58b9f456SAndroid Build Coastguard Worker { 380*58b9f456SAndroid Build Coastguard Worker __u0.release(); 381*58b9f456SAndroid Build Coastguard Worker break; 382*58b9f456SAndroid Build Coastguard Worker } 383*58b9f456SAndroid Build Coastguard Worker } 384*58b9f456SAndroid Build Coastguard Worker __libcpp_thread_yield(); 385*58b9f456SAndroid Build Coastguard Worker { 386*58b9f456SAndroid Build Coastguard Worker unique_lock<_L1> __u1(__l1); 387*58b9f456SAndroid Build Coastguard Worker if (__l0.try_lock()) 388*58b9f456SAndroid Build Coastguard Worker { 389*58b9f456SAndroid Build Coastguard Worker __u1.release(); 390*58b9f456SAndroid Build Coastguard Worker break; 391*58b9f456SAndroid Build Coastguard Worker } 392*58b9f456SAndroid Build Coastguard Worker } 393*58b9f456SAndroid Build Coastguard Worker __libcpp_thread_yield(); 394*58b9f456SAndroid Build Coastguard Worker } 395*58b9f456SAndroid Build Coastguard Worker} 396*58b9f456SAndroid Build Coastguard Worker 397*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG 398*58b9f456SAndroid Build Coastguard Worker 399*58b9f456SAndroid Build Coastguard Workertemplate <class _L0, class _L1, class _L2, class ..._L3> 400*58b9f456SAndroid Build Coastguard Workervoid 401*58b9f456SAndroid Build Coastguard Worker__lock_first(int __i, _L0& __l0, _L1& __l1, _L2& __l2, _L3& ...__l3) 402*58b9f456SAndroid Build Coastguard Worker{ 403*58b9f456SAndroid Build Coastguard Worker while (true) 404*58b9f456SAndroid Build Coastguard Worker { 405*58b9f456SAndroid Build Coastguard Worker switch (__i) 406*58b9f456SAndroid Build Coastguard Worker { 407*58b9f456SAndroid Build Coastguard Worker case 0: 408*58b9f456SAndroid Build Coastguard Worker { 409*58b9f456SAndroid Build Coastguard Worker unique_lock<_L0> __u0(__l0); 410*58b9f456SAndroid Build Coastguard Worker __i = try_lock(__l1, __l2, __l3...); 411*58b9f456SAndroid Build Coastguard Worker if (__i == -1) 412*58b9f456SAndroid Build Coastguard Worker { 413*58b9f456SAndroid Build Coastguard Worker __u0.release(); 414*58b9f456SAndroid Build Coastguard Worker return; 415*58b9f456SAndroid Build Coastguard Worker } 416*58b9f456SAndroid Build Coastguard Worker } 417*58b9f456SAndroid Build Coastguard Worker ++__i; 418*58b9f456SAndroid Build Coastguard Worker __libcpp_thread_yield(); 419*58b9f456SAndroid Build Coastguard Worker break; 420*58b9f456SAndroid Build Coastguard Worker case 1: 421*58b9f456SAndroid Build Coastguard Worker { 422*58b9f456SAndroid Build Coastguard Worker unique_lock<_L1> __u1(__l1); 423*58b9f456SAndroid Build Coastguard Worker __i = try_lock(__l2, __l3..., __l0); 424*58b9f456SAndroid Build Coastguard Worker if (__i == -1) 425*58b9f456SAndroid Build Coastguard Worker { 426*58b9f456SAndroid Build Coastguard Worker __u1.release(); 427*58b9f456SAndroid Build Coastguard Worker return; 428*58b9f456SAndroid Build Coastguard Worker } 429*58b9f456SAndroid Build Coastguard Worker } 430*58b9f456SAndroid Build Coastguard Worker if (__i == sizeof...(_L3) + 1) 431*58b9f456SAndroid Build Coastguard Worker __i = 0; 432*58b9f456SAndroid Build Coastguard Worker else 433*58b9f456SAndroid Build Coastguard Worker __i += 2; 434*58b9f456SAndroid Build Coastguard Worker __libcpp_thread_yield(); 435*58b9f456SAndroid Build Coastguard Worker break; 436*58b9f456SAndroid Build Coastguard Worker default: 437*58b9f456SAndroid Build Coastguard Worker __lock_first(__i - 2, __l2, __l3..., __l0, __l1); 438*58b9f456SAndroid Build Coastguard Worker return; 439*58b9f456SAndroid Build Coastguard Worker } 440*58b9f456SAndroid Build Coastguard Worker } 441*58b9f456SAndroid Build Coastguard Worker} 442*58b9f456SAndroid Build Coastguard Worker 443*58b9f456SAndroid Build Coastguard Workertemplate <class _L0, class _L1, class _L2, class ..._L3> 444*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 445*58b9f456SAndroid Build Coastguard Workervoid 446*58b9f456SAndroid Build Coastguard Workerlock(_L0& __l0, _L1& __l1, _L2& __l2, _L3& ...__l3) 447*58b9f456SAndroid Build Coastguard Worker{ 448*58b9f456SAndroid Build Coastguard Worker __lock_first(0, __l0, __l1, __l2, __l3...); 449*58b9f456SAndroid Build Coastguard Worker} 450*58b9f456SAndroid Build Coastguard Worker 451*58b9f456SAndroid Build Coastguard Workertemplate <class _L0> 452*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 453*58b9f456SAndroid Build Coastguard Workervoid __unlock(_L0& __l0) { 454*58b9f456SAndroid Build Coastguard Worker __l0.unlock(); 455*58b9f456SAndroid Build Coastguard Worker} 456*58b9f456SAndroid Build Coastguard Worker 457*58b9f456SAndroid Build Coastguard Workertemplate <class _L0, class _L1> 458*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 459*58b9f456SAndroid Build Coastguard Workervoid __unlock(_L0& __l0, _L1& __l1) { 460*58b9f456SAndroid Build Coastguard Worker __l0.unlock(); 461*58b9f456SAndroid Build Coastguard Worker __l1.unlock(); 462*58b9f456SAndroid Build Coastguard Worker} 463*58b9f456SAndroid Build Coastguard Worker 464*58b9f456SAndroid Build Coastguard Workertemplate <class _L0, class _L1, class _L2, class ..._L3> 465*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 466*58b9f456SAndroid Build Coastguard Workervoid __unlock(_L0& __l0, _L1& __l1, _L2& __l2, _L3&... __l3) { 467*58b9f456SAndroid Build Coastguard Worker __l0.unlock(); 468*58b9f456SAndroid Build Coastguard Worker __l1.unlock(); 469*58b9f456SAndroid Build Coastguard Worker _VSTD::__unlock(__l2, __l3...); 470*58b9f456SAndroid Build Coastguard Worker} 471*58b9f456SAndroid Build Coastguard Worker 472*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_CXX03_LANG 473*58b9f456SAndroid Build Coastguard Worker 474*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 14 475*58b9f456SAndroid Build Coastguard Workertemplate <class ..._Mutexes> 476*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS scoped_lock; 477*58b9f456SAndroid Build Coastguard Worker 478*58b9f456SAndroid Build Coastguard Workertemplate <> 479*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS scoped_lock<> { 480*58b9f456SAndroid Build Coastguard Workerpublic: 481*58b9f456SAndroid Build Coastguard Worker explicit scoped_lock() {} 482*58b9f456SAndroid Build Coastguard Worker ~scoped_lock() = default; 483*58b9f456SAndroid Build Coastguard Worker 484*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 485*58b9f456SAndroid Build Coastguard Worker explicit scoped_lock(adopt_lock_t) {} 486*58b9f456SAndroid Build Coastguard Worker 487*58b9f456SAndroid Build Coastguard Worker scoped_lock(scoped_lock const&) = delete; 488*58b9f456SAndroid Build Coastguard Worker scoped_lock& operator=(scoped_lock const&) = delete; 489*58b9f456SAndroid Build Coastguard Worker}; 490*58b9f456SAndroid Build Coastguard Worker 491*58b9f456SAndroid Build Coastguard Workertemplate <class _Mutex> 492*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS _LIBCPP_THREAD_SAFETY_ANNOTATION(scoped_lockable) scoped_lock<_Mutex> { 493*58b9f456SAndroid Build Coastguard Workerpublic: 494*58b9f456SAndroid Build Coastguard Worker typedef _Mutex mutex_type; 495*58b9f456SAndroid Build Coastguard Workerprivate: 496*58b9f456SAndroid Build Coastguard Worker mutex_type& __m_; 497*58b9f456SAndroid Build Coastguard Workerpublic: 498*58b9f456SAndroid Build Coastguard Worker explicit scoped_lock(mutex_type & __m) _LIBCPP_THREAD_SAFETY_ANNOTATION(acquire_capability(__m)) 499*58b9f456SAndroid Build Coastguard Worker : __m_(__m) {__m_.lock();} 500*58b9f456SAndroid Build Coastguard Worker 501*58b9f456SAndroid Build Coastguard Worker ~scoped_lock() _LIBCPP_THREAD_SAFETY_ANNOTATION(release_capability()) {__m_.unlock();} 502*58b9f456SAndroid Build Coastguard Worker 503*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 504*58b9f456SAndroid Build Coastguard Worker explicit scoped_lock(adopt_lock_t, mutex_type& __m) _LIBCPP_THREAD_SAFETY_ANNOTATION(requires_capability(__m)) 505*58b9f456SAndroid Build Coastguard Worker : __m_(__m) {} 506*58b9f456SAndroid Build Coastguard Worker 507*58b9f456SAndroid Build Coastguard Worker scoped_lock(scoped_lock const&) = delete; 508*58b9f456SAndroid Build Coastguard Worker scoped_lock& operator=(scoped_lock const&) = delete; 509*58b9f456SAndroid Build Coastguard Worker}; 510*58b9f456SAndroid Build Coastguard Worker 511*58b9f456SAndroid Build Coastguard Workertemplate <class ..._MArgs> 512*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS scoped_lock 513*58b9f456SAndroid Build Coastguard Worker{ 514*58b9f456SAndroid Build Coastguard Worker static_assert(sizeof...(_MArgs) > 1, "At least 2 lock types required"); 515*58b9f456SAndroid Build Coastguard Worker typedef tuple<_MArgs&...> _MutexTuple; 516*58b9f456SAndroid Build Coastguard Worker 517*58b9f456SAndroid Build Coastguard Workerpublic: 518*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 519*58b9f456SAndroid Build Coastguard Worker explicit scoped_lock(_MArgs&... __margs) 520*58b9f456SAndroid Build Coastguard Worker : __t_(__margs...) 521*58b9f456SAndroid Build Coastguard Worker { 522*58b9f456SAndroid Build Coastguard Worker _VSTD::lock(__margs...); 523*58b9f456SAndroid Build Coastguard Worker } 524*58b9f456SAndroid Build Coastguard Worker 525*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 526*58b9f456SAndroid Build Coastguard Worker scoped_lock(adopt_lock_t, _MArgs&... __margs) 527*58b9f456SAndroid Build Coastguard Worker : __t_(__margs...) 528*58b9f456SAndroid Build Coastguard Worker { 529*58b9f456SAndroid Build Coastguard Worker } 530*58b9f456SAndroid Build Coastguard Worker 531*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 532*58b9f456SAndroid Build Coastguard Worker ~scoped_lock() { 533*58b9f456SAndroid Build Coastguard Worker typedef typename __make_tuple_indices<sizeof...(_MArgs)>::type _Indices; 534*58b9f456SAndroid Build Coastguard Worker __unlock_unpack(_Indices{}, __t_); 535*58b9f456SAndroid Build Coastguard Worker } 536*58b9f456SAndroid Build Coastguard Worker 537*58b9f456SAndroid Build Coastguard Worker scoped_lock(scoped_lock const&) = delete; 538*58b9f456SAndroid Build Coastguard Worker scoped_lock& operator=(scoped_lock const&) = delete; 539*58b9f456SAndroid Build Coastguard Worker 540*58b9f456SAndroid Build Coastguard Workerprivate: 541*58b9f456SAndroid Build Coastguard Worker template <size_t ..._Indx> 542*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 543*58b9f456SAndroid Build Coastguard Worker static void __unlock_unpack(__tuple_indices<_Indx...>, _MutexTuple& __mt) { 544*58b9f456SAndroid Build Coastguard Worker _VSTD::__unlock(_VSTD::get<_Indx>(__mt)...); 545*58b9f456SAndroid Build Coastguard Worker } 546*58b9f456SAndroid Build Coastguard Worker 547*58b9f456SAndroid Build Coastguard Worker _MutexTuple __t_; 548*58b9f456SAndroid Build Coastguard Worker}; 549*58b9f456SAndroid Build Coastguard Worker 550*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_STD_VER > 14 551*58b9f456SAndroid Build Coastguard Worker#endif // !_LIBCPP_HAS_NO_THREADS 552*58b9f456SAndroid Build Coastguard Worker 553*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS once_flag; 554*58b9f456SAndroid Build Coastguard Worker 555*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG 556*58b9f456SAndroid Build Coastguard Worker 557*58b9f456SAndroid Build Coastguard Workertemplate<class _Callable, class... _Args> 558*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY 559*58b9f456SAndroid Build Coastguard Workervoid call_once(once_flag&, _Callable&&, _Args&&...); 560*58b9f456SAndroid Build Coastguard Worker 561*58b9f456SAndroid Build Coastguard Worker#else // _LIBCPP_CXX03_LANG 562*58b9f456SAndroid Build Coastguard Worker 563*58b9f456SAndroid Build Coastguard Workertemplate<class _Callable> 564*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY 565*58b9f456SAndroid Build Coastguard Workervoid call_once(once_flag&, _Callable&); 566*58b9f456SAndroid Build Coastguard Worker 567*58b9f456SAndroid Build Coastguard Workertemplate<class _Callable> 568*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY 569*58b9f456SAndroid Build Coastguard Workervoid call_once(once_flag&, const _Callable&); 570*58b9f456SAndroid Build Coastguard Worker 571*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_CXX03_LANG 572*58b9f456SAndroid Build Coastguard Worker 573*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS once_flag 574*58b9f456SAndroid Build Coastguard Worker{ 575*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 576*58b9f456SAndroid Build Coastguard Worker _LIBCPP_CONSTEXPR 577*58b9f456SAndroid Build Coastguard Worker once_flag() _NOEXCEPT : __state_(0) {} 578*58b9f456SAndroid Build Coastguard Worker 579*58b9f456SAndroid Build Coastguard Workerprivate: 580*58b9f456SAndroid Build Coastguard Worker once_flag(const once_flag&); // = delete; 581*58b9f456SAndroid Build Coastguard Worker once_flag& operator=(const once_flag&); // = delete; 582*58b9f456SAndroid Build Coastguard Worker 583*58b9f456SAndroid Build Coastguard Worker unsigned long __state_; 584*58b9f456SAndroid Build Coastguard Worker 585*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG 586*58b9f456SAndroid Build Coastguard Worker template<class _Callable, class... _Args> 587*58b9f456SAndroid Build Coastguard Worker friend 588*58b9f456SAndroid Build Coastguard Worker void call_once(once_flag&, _Callable&&, _Args&&...); 589*58b9f456SAndroid Build Coastguard Worker#else // _LIBCPP_CXX03_LANG 590*58b9f456SAndroid Build Coastguard Worker template<class _Callable> 591*58b9f456SAndroid Build Coastguard Worker friend 592*58b9f456SAndroid Build Coastguard Worker void call_once(once_flag&, _Callable&); 593*58b9f456SAndroid Build Coastguard Worker 594*58b9f456SAndroid Build Coastguard Worker template<class _Callable> 595*58b9f456SAndroid Build Coastguard Worker friend 596*58b9f456SAndroid Build Coastguard Worker void call_once(once_flag&, const _Callable&); 597*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_CXX03_LANG 598*58b9f456SAndroid Build Coastguard Worker}; 599*58b9f456SAndroid Build Coastguard Worker 600*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG 601*58b9f456SAndroid Build Coastguard Worker 602*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp> 603*58b9f456SAndroid Build Coastguard Workerclass __call_once_param 604*58b9f456SAndroid Build Coastguard Worker{ 605*58b9f456SAndroid Build Coastguard Worker _Fp& __f_; 606*58b9f456SAndroid Build Coastguard Workerpublic: 607*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 608*58b9f456SAndroid Build Coastguard Worker explicit __call_once_param(_Fp& __f) : __f_(__f) {} 609*58b9f456SAndroid Build Coastguard Worker 610*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 611*58b9f456SAndroid Build Coastguard Worker void operator()() 612*58b9f456SAndroid Build Coastguard Worker { 613*58b9f456SAndroid Build Coastguard Worker typedef typename __make_tuple_indices<tuple_size<_Fp>::value, 1>::type _Index; 614*58b9f456SAndroid Build Coastguard Worker __execute(_Index()); 615*58b9f456SAndroid Build Coastguard Worker } 616*58b9f456SAndroid Build Coastguard Worker 617*58b9f456SAndroid Build Coastguard Workerprivate: 618*58b9f456SAndroid Build Coastguard Worker template <size_t ..._Indices> 619*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 620*58b9f456SAndroid Build Coastguard Worker void __execute(__tuple_indices<_Indices...>) 621*58b9f456SAndroid Build Coastguard Worker { 622*58b9f456SAndroid Build Coastguard Worker __invoke(_VSTD::get<0>(_VSTD::move(__f_)), _VSTD::get<_Indices>(_VSTD::move(__f_))...); 623*58b9f456SAndroid Build Coastguard Worker } 624*58b9f456SAndroid Build Coastguard Worker}; 625*58b9f456SAndroid Build Coastguard Worker 626*58b9f456SAndroid Build Coastguard Worker#else 627*58b9f456SAndroid Build Coastguard Worker 628*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp> 629*58b9f456SAndroid Build Coastguard Workerclass __call_once_param 630*58b9f456SAndroid Build Coastguard Worker{ 631*58b9f456SAndroid Build Coastguard Worker _Fp& __f_; 632*58b9f456SAndroid Build Coastguard Workerpublic: 633*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 634*58b9f456SAndroid Build Coastguard Worker explicit __call_once_param(_Fp& __f) : __f_(__f) {} 635*58b9f456SAndroid Build Coastguard Worker 636*58b9f456SAndroid Build Coastguard Worker _LIBCPP_INLINE_VISIBILITY 637*58b9f456SAndroid Build Coastguard Worker void operator()() 638*58b9f456SAndroid Build Coastguard Worker { 639*58b9f456SAndroid Build Coastguard Worker __f_(); 640*58b9f456SAndroid Build Coastguard Worker } 641*58b9f456SAndroid Build Coastguard Worker}; 642*58b9f456SAndroid Build Coastguard Worker 643*58b9f456SAndroid Build Coastguard Worker#endif 644*58b9f456SAndroid Build Coastguard Worker 645*58b9f456SAndroid Build Coastguard Workertemplate <class _Fp> 646*58b9f456SAndroid Build Coastguard Workervoid 647*58b9f456SAndroid Build Coastguard Worker__call_once_proxy(void* __vp) 648*58b9f456SAndroid Build Coastguard Worker{ 649*58b9f456SAndroid Build Coastguard Worker __call_once_param<_Fp>* __p = static_cast<__call_once_param<_Fp>*>(__vp); 650*58b9f456SAndroid Build Coastguard Worker (*__p)(); 651*58b9f456SAndroid Build Coastguard Worker} 652*58b9f456SAndroid Build Coastguard Worker 653*58b9f456SAndroid Build Coastguard Worker_LIBCPP_FUNC_VIS void __call_once(volatile unsigned long&, void*, void(*)(void*)); 654*58b9f456SAndroid Build Coastguard Worker 655*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG 656*58b9f456SAndroid Build Coastguard Worker 657*58b9f456SAndroid Build Coastguard Workertemplate<class _Callable, class... _Args> 658*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 659*58b9f456SAndroid Build Coastguard Workervoid 660*58b9f456SAndroid Build Coastguard Workercall_once(once_flag& __flag, _Callable&& __func, _Args&&... __args) 661*58b9f456SAndroid Build Coastguard Worker{ 662*58b9f456SAndroid Build Coastguard Worker if (__libcpp_acquire_load(&__flag.__state_) != ~0ul) 663*58b9f456SAndroid Build Coastguard Worker { 664*58b9f456SAndroid Build Coastguard Worker typedef tuple<_Callable&&, _Args&&...> _Gp; 665*58b9f456SAndroid Build Coastguard Worker _Gp __f(_VSTD::forward<_Callable>(__func), _VSTD::forward<_Args>(__args)...); 666*58b9f456SAndroid Build Coastguard Worker __call_once_param<_Gp> __p(__f); 667*58b9f456SAndroid Build Coastguard Worker __call_once(__flag.__state_, &__p, &__call_once_proxy<_Gp>); 668*58b9f456SAndroid Build Coastguard Worker } 669*58b9f456SAndroid Build Coastguard Worker} 670*58b9f456SAndroid Build Coastguard Worker 671*58b9f456SAndroid Build Coastguard Worker#else // _LIBCPP_CXX03_LANG 672*58b9f456SAndroid Build Coastguard Worker 673*58b9f456SAndroid Build Coastguard Workertemplate<class _Callable> 674*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 675*58b9f456SAndroid Build Coastguard Workervoid 676*58b9f456SAndroid Build Coastguard Workercall_once(once_flag& __flag, _Callable& __func) 677*58b9f456SAndroid Build Coastguard Worker{ 678*58b9f456SAndroid Build Coastguard Worker if (__libcpp_acquire_load(&__flag.__state_) != ~0ul) 679*58b9f456SAndroid Build Coastguard Worker { 680*58b9f456SAndroid Build Coastguard Worker __call_once_param<_Callable> __p(__func); 681*58b9f456SAndroid Build Coastguard Worker __call_once(__flag.__state_, &__p, &__call_once_proxy<_Callable>); 682*58b9f456SAndroid Build Coastguard Worker } 683*58b9f456SAndroid Build Coastguard Worker} 684*58b9f456SAndroid Build Coastguard Worker 685*58b9f456SAndroid Build Coastguard Workertemplate<class _Callable> 686*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY 687*58b9f456SAndroid Build Coastguard Workervoid 688*58b9f456SAndroid Build Coastguard Workercall_once(once_flag& __flag, const _Callable& __func) 689*58b9f456SAndroid Build Coastguard Worker{ 690*58b9f456SAndroid Build Coastguard Worker if (__libcpp_acquire_load(&__flag.__state_) != ~0ul) 691*58b9f456SAndroid Build Coastguard Worker { 692*58b9f456SAndroid Build Coastguard Worker __call_once_param<const _Callable> __p(__func); 693*58b9f456SAndroid Build Coastguard Worker __call_once(__flag.__state_, &__p, &__call_once_proxy<const _Callable>); 694*58b9f456SAndroid Build Coastguard Worker } 695*58b9f456SAndroid Build Coastguard Worker} 696*58b9f456SAndroid Build Coastguard Worker 697*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_CXX03_LANG 698*58b9f456SAndroid Build Coastguard Worker 699*58b9f456SAndroid Build Coastguard Worker_LIBCPP_END_NAMESPACE_STD 700*58b9f456SAndroid Build Coastguard Worker 701*58b9f456SAndroid Build Coastguard Worker_LIBCPP_POP_MACROS 702*58b9f456SAndroid Build Coastguard Worker 703*58b9f456SAndroid Build Coastguard Worker#endif // _LIBCPP_MUTEX 704