1eb8650a7SLouis Dionne //===----------------------------------------------------------------------===//
2ce6153a5SLouis Dionne //
3ce6153a5SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4ce6153a5SLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5ce6153a5SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ce6153a5SLouis Dionne //
7ce6153a5SLouis Dionne //===----------------------------------------------------------------------===//
8ce6153a5SLouis Dionne 
9*bbb0f2c7SArthur O'Dwyer #include <algorithm>
10*bbb0f2c7SArthur O'Dwyer #include <random>
11*bbb0f2c7SArthur O'Dwyer 
12ce6153a5SLouis Dionne #ifndef _LIBCPP_HAS_NO_THREADS
13*bbb0f2c7SArthur O'Dwyer #  include <mutex>
14ce6153a5SLouis Dionne #  if defined(__ELF__) && defined(_LIBCPP_LINK_PTHREAD_LIB)
15ce6153a5SLouis Dionne #    pragma comment(lib, "pthread")
16ce6153a5SLouis Dionne #  endif
17ce6153a5SLouis Dionne #endif
18ce6153a5SLouis Dionne 
19ce6153a5SLouis Dionne _LIBCPP_BEGIN_NAMESPACE_STD
20ce6153a5SLouis Dionne 
21ce6153a5SLouis Dionne #ifndef _LIBCPP_HAS_NO_THREADS
2205337a75SArthur O'Dwyer static constinit __libcpp_mutex_t __rs_mut = _LIBCPP_MUTEX_INITIALIZER;
23ce6153a5SLouis Dionne #endif
24ce6153a5SLouis Dionne unsigned __rs_default::__c_ = 0;
25ce6153a5SLouis Dionne 
__rs_default()26ce6153a5SLouis Dionne __rs_default::__rs_default()
27ce6153a5SLouis Dionne {
28ce6153a5SLouis Dionne #ifndef _LIBCPP_HAS_NO_THREADS
29ce6153a5SLouis Dionne     __libcpp_mutex_lock(&__rs_mut);
30ce6153a5SLouis Dionne #endif
31ce6153a5SLouis Dionne     __c_ = 1;
32ce6153a5SLouis Dionne }
33ce6153a5SLouis Dionne 
__rs_default(const __rs_default &)34ce6153a5SLouis Dionne __rs_default::__rs_default(const __rs_default&)
35ce6153a5SLouis Dionne {
36ce6153a5SLouis Dionne     ++__c_;
37ce6153a5SLouis Dionne }
38ce6153a5SLouis Dionne 
~__rs_default()39ce6153a5SLouis Dionne __rs_default::~__rs_default()
40ce6153a5SLouis Dionne {
41ce6153a5SLouis Dionne #ifndef _LIBCPP_HAS_NO_THREADS
42ce6153a5SLouis Dionne     if (--__c_ == 0)
43ce6153a5SLouis Dionne        __libcpp_mutex_unlock(&__rs_mut);
44ce6153a5SLouis Dionne #else
45ce6153a5SLouis Dionne     --__c_;
46ce6153a5SLouis Dionne #endif
47ce6153a5SLouis Dionne }
48ce6153a5SLouis Dionne 
49ce6153a5SLouis Dionne __rs_default::result_type
operator ()()50ce6153a5SLouis Dionne __rs_default::operator()()
51ce6153a5SLouis Dionne {
52ce6153a5SLouis Dionne     static mt19937 __rs_g;
53ce6153a5SLouis Dionne     return __rs_g();
54ce6153a5SLouis Dionne }
55ce6153a5SLouis Dionne 
56ce6153a5SLouis Dionne __rs_default
__rs_get()57ce6153a5SLouis Dionne __rs_get()
58ce6153a5SLouis Dionne {
59ce6153a5SLouis Dionne     return __rs_default();
60ce6153a5SLouis Dionne }
61ce6153a5SLouis Dionne 
62ce6153a5SLouis Dionne _LIBCPP_END_NAMESPACE_STD
63