[ubsan] Change ubsan-unique-traps to use nomerge instead of counter (#117651)
[llvm-project.git] / libcxx / src / random_shuffle.cpp
blob4f2669a6c7fa567c34968b54a7d71884aca074ac
1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
9 #include <algorithm>
10 #include <random>
12 #if _LIBCPP_HAS_THREADS
13 # include <mutex>
14 # if defined(__ELF__) && defined(_LIBCPP_LINK_PTHREAD_LIB)
15 # pragma comment(lib, "pthread")
16 # endif
17 #endif
19 _LIBCPP_BEGIN_NAMESPACE_STD
21 #if _LIBCPP_HAS_THREADS
22 static constinit __libcpp_mutex_t __rs_mut = _LIBCPP_MUTEX_INITIALIZER;
23 #endif
24 unsigned __rs_default::__c_ = 0;
26 __rs_default::__rs_default() {
27 #if _LIBCPP_HAS_THREADS
28 __libcpp_mutex_lock(&__rs_mut);
29 #endif
30 __c_ = 1;
33 __rs_default::__rs_default(const __rs_default&) { ++__c_; }
35 __rs_default::~__rs_default() {
36 #if _LIBCPP_HAS_THREADS
37 if (--__c_ == 0)
38 __libcpp_mutex_unlock(&__rs_mut);
39 #else
40 --__c_;
41 #endif
44 __rs_default::result_type __rs_default::operator()() {
45 static mt19937 __rs_g;
46 return __rs_g();
49 __rs_default __rs_get() { return __rs_default(); }
51 _LIBCPP_END_NAMESPACE_STD