1349cc55cSDimitry Andric //===----------------------------------------------------------------------===// 25ffd83dbSDimitry Andric // 35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65ffd83dbSDimitry Andric // 75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 85ffd83dbSDimitry Andric 9*81ad6265SDimitry Andric #include <algorithm> 10*81ad6265SDimitry Andric #include <random> 11*81ad6265SDimitry Andric 125ffd83dbSDimitry Andric #ifndef _LIBCPP_HAS_NO_THREADS 13*81ad6265SDimitry Andric # include <mutex> 145ffd83dbSDimitry Andric # if defined(__ELF__) && defined(_LIBCPP_LINK_PTHREAD_LIB) 155ffd83dbSDimitry Andric # pragma comment(lib, "pthread") 165ffd83dbSDimitry Andric # endif 175ffd83dbSDimitry Andric #endif 185ffd83dbSDimitry Andric 195ffd83dbSDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD 205ffd83dbSDimitry Andric 215ffd83dbSDimitry Andric #ifndef _LIBCPP_HAS_NO_THREADS 22*81ad6265SDimitry Andric static constinit __libcpp_mutex_t __rs_mut = _LIBCPP_MUTEX_INITIALIZER; 235ffd83dbSDimitry Andric #endif 245ffd83dbSDimitry Andric unsigned __rs_default::__c_ = 0; 255ffd83dbSDimitry Andric 265ffd83dbSDimitry Andric __rs_default::__rs_default() 275ffd83dbSDimitry Andric { 285ffd83dbSDimitry Andric #ifndef _LIBCPP_HAS_NO_THREADS 295ffd83dbSDimitry Andric __libcpp_mutex_lock(&__rs_mut); 305ffd83dbSDimitry Andric #endif 315ffd83dbSDimitry Andric __c_ = 1; 325ffd83dbSDimitry Andric } 335ffd83dbSDimitry Andric 345ffd83dbSDimitry Andric __rs_default::__rs_default(const __rs_default&) 355ffd83dbSDimitry Andric { 365ffd83dbSDimitry Andric ++__c_; 375ffd83dbSDimitry Andric } 385ffd83dbSDimitry Andric 395ffd83dbSDimitry Andric __rs_default::~__rs_default() 405ffd83dbSDimitry Andric { 415ffd83dbSDimitry Andric #ifndef _LIBCPP_HAS_NO_THREADS 425ffd83dbSDimitry Andric if (--__c_ == 0) 435ffd83dbSDimitry Andric __libcpp_mutex_unlock(&__rs_mut); 445ffd83dbSDimitry Andric #else 455ffd83dbSDimitry Andric --__c_; 465ffd83dbSDimitry Andric #endif 475ffd83dbSDimitry Andric } 485ffd83dbSDimitry Andric 495ffd83dbSDimitry Andric __rs_default::result_type 505ffd83dbSDimitry Andric __rs_default::operator()() 515ffd83dbSDimitry Andric { 525ffd83dbSDimitry Andric static mt19937 __rs_g; 535ffd83dbSDimitry Andric return __rs_g(); 545ffd83dbSDimitry Andric } 555ffd83dbSDimitry Andric 565ffd83dbSDimitry Andric __rs_default 575ffd83dbSDimitry Andric __rs_get() 585ffd83dbSDimitry Andric { 595ffd83dbSDimitry Andric return __rs_default(); 605ffd83dbSDimitry Andric } 615ffd83dbSDimitry Andric 625ffd83dbSDimitry Andric _LIBCPP_END_NAMESPACE_STD 63