| //===----------------------------------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include <algorithm> |
| #include <random> |
| |
| #ifndef _LIBCPP_HAS_NO_THREADS |
| # include <mutex> |
| # if defined(__ELF__) && defined(_LIBCPP_LINK_PTHREAD_LIB) |
| # pragma comment(lib, "pthread") |
| # endif |
| #endif |
| |
| _LIBCPP_BEGIN_NAMESPACE_STD |
| |
| #ifndef _LIBCPP_HAS_NO_THREADS |
| static constinit __libcpp_mutex_t __rs_mut = _LIBCPP_MUTEX_INITIALIZER; |
| #endif |
| unsigned __rs_default::__c_ = 0; |
| |
| __rs_default::__rs_default() |
| { |
| #ifndef _LIBCPP_HAS_NO_THREADS |
| __libcpp_mutex_lock(&__rs_mut); |
| #endif |
| __c_ = 1; |
| } |
| |
| __rs_default::__rs_default(const __rs_default&) |
| { |
| ++__c_; |
| } |
| |
| __rs_default::~__rs_default() |
| { |
| #ifndef _LIBCPP_HAS_NO_THREADS |
| if (--__c_ == 0) |
| __libcpp_mutex_unlock(&__rs_mut); |
| #else |
| --__c_; |
| #endif |
| } |
| |
| __rs_default::result_type |
| __rs_default::operator()() |
| { |
| static mt19937 __rs_g; |
| return __rs_g(); |
| } |
| |
| __rs_default |
| __rs_get() |
| { |
| return __rs_default(); |
| } |
| |
| _LIBCPP_END_NAMESPACE_STD |