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