xref: /aosp_15_r20/external/libcxx/include/mutex (revision 58b9f456b02922dfdb1fad8a988d5fd8765ecb80)
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