Commit a8c3f4c9 by Ulrich Drepper

random.h (random_device): Move implementation to...


	* include/bits/random.h (random_device): Move implementation to...
	* src/c++11/random.cc: ...here.  New file.
	* config/abi/pre/gnu.ver: Add new version GLIBCXX_3.4.18.  Export
	std::random_device::* symbols.
	* config/abi/post/x86_64-linux-gnu/baseline_symbols.txt: Generated.
	* src/c++11/Makefile.am (sources): Add random.cc.
	* src/c++11/Makefile.in: Regenerated.

From-SVN: r190787
parent 1dd5907e
......@@ -1485,6 +1485,10 @@ FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEs@@GLIBCXX_3.4
FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEt@@GLIBCXX_3.4
FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEx@@GLIBCXX_3.4
FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEy@@GLIBCXX_3.4
FUNC:_ZNSt13random_device14_M_init_pretr1ERKSs@@GLIBCXX_3.4.18
FUNC:_ZNSt13random_device16_M_getval_pretr1Ev@@GLIBCXX_3.4.18
FUNC:_ZNSt13random_device7_M_initERKSs@@GLIBCXX_3.4.18
FUNC:_ZNSt13random_device9_M_getvalEv@@GLIBCXX_3.4.18
FUNC:_ZNSt13runtime_errorC1ERKSs@@GLIBCXX_3.4
FUNC:_ZNSt13runtime_errorC2ERKSs@@GLIBCXX_3.4
FUNC:_ZNSt13runtime_errorD0Ev@@GLIBCXX_3.4
......@@ -2502,6 +2506,7 @@ OBJECT:0:GLIBCXX_3.4.14
OBJECT:0:GLIBCXX_3.4.15
OBJECT:0:GLIBCXX_3.4.16
OBJECT:0:GLIBCXX_3.4.17
OBJECT:0:GLIBCXX_3.4.18
OBJECT:0:GLIBCXX_3.4.2
OBJECT:0:GLIBCXX_3.4.3
OBJECT:0:GLIBCXX_3.4.4
......@@ -3683,3 +3688,5 @@ OBJECT:96:_ZTVSt12ctype_bynameIcE@@GLIBCXX_3.4
OBJECT:96:_ZTVSt5ctypeIcE@@GLIBCXX_3.4
OBJECT:96:_ZTVSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
OBJECT:96:_ZTVSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
TLS:8:_ZSt11__once_call@@GLIBCXX_3.4.11
TLS:8:_ZSt15__once_callable@@GLIBCXX_3.4.11
......@@ -1321,6 +1321,17 @@ GLIBCXX_3.4.17 {
} GLIBCXX_3.4.16;
GLIBCXX_3.4.18 {
global:
# Names inside the 'extern' block are demangled names.
extern "C++"
{
std::random_device::*;
};
} GLIBCXX_3.4.17;
# Symbols in the support library (libsupc++) have their own tag.
CXXABI_1.3 {
......@@ -1523,4 +1534,4 @@ CXXABI_TM_1 {
global:
__cxa_tm_cleanup;
};
\ No newline at end of file
};
......@@ -1575,39 +1575,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
#ifdef _GLIBCXX_USE_RANDOM_TR1
explicit
random_device(const std::string& __token = "/dev/urandom")
random_device(const std::string& __token = "default")
{
if ((__token != "/dev/urandom" && __token != "/dev/random")
|| !(_M_file = std::fopen(__token.c_str(), "rb")))
std::__throw_runtime_error(__N("random_device::"
"random_device(const std::string&)"));
_M_init(__token);
}
~random_device()
{ std::fclose(_M_file); }
{ _M_fini(); }
#else
explicit
random_device(const std::string& __token = "mt19937")
: _M_mt(_M_strtoul(__token)) { }
private:
static unsigned long
_M_strtoul(const std::string& __str)
{
unsigned long __ret = 5489UL;
if (__str != "mt19937")
{
const char* __nptr = __str.c_str();
char* __endptr;
__ret = std::strtoul(__nptr, &__endptr, 0);
if (*__nptr == '\0' || *__endptr != '\0')
std::__throw_runtime_error(__N("random_device::_M_strtoul"
"(const std::string&)"));
}
return __ret;
}
{ return _M_init_pretr1(__token); }
public:
......@@ -1629,12 +1609,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
operator()()
{
#ifdef _GLIBCXX_USE_RANDOM_TR1
result_type __ret;
std::fread(reinterpret_cast<void*>(&__ret), sizeof(result_type),
1, _M_file);
return __ret;
return this->_M_getval();
#else
return _M_mt();
return this->_M_getval_pretr1();
#endif
}
......@@ -1644,11 +1621,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
private:
#ifdef _GLIBCXX_USE_RANDOM_TR1
void _M_init(const std::string& __token);
void _M_init_pretr1(const std::string& __token);
void _M_fini();
result_type _M_getval();
result_type _M_getval_pretr1();
union
{
FILE* _M_file;
#else
mt19937 _M_mt;
#endif
};
};
/* @} */ // group random_generators
......
......@@ -41,6 +41,7 @@ sources = \
limits.cc \
mutex.cc \
placeholders.cc \
random.cc \
regex.cc \
shared_ptr.cc \
system_error.cc \
......
# Makefile.in generated by automake 1.11.1 from Makefile.am.
# Makefile.in generated by automake 1.11.3 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
# Inc.
# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
# Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
......@@ -68,8 +68,8 @@ LTLIBRARIES = $(noinst_LTLIBRARIES)
libc__11convenience_la_LIBADD =
am__objects_1 = chrono.lo condition_variable.lo debug.lo \
functexcept.lo functional.lo future.lo hash_c++0x.lo \
hashtable_c++0x.lo limits.lo mutex.lo placeholders.lo regex.lo \
shared_ptr.lo system_error.lo thread.lo
hashtable_c++0x.lo limits.lo mutex.lo placeholders.lo \
random.lo regex.lo shared_ptr.lo system_error.lo thread.lo
@ENABLE_EXTERN_TEMPLATE_TRUE@am__objects_2 = fstream-inst.lo \
@ENABLE_EXTERN_TEMPLATE_TRUE@ string-inst.lo wstring-inst.lo
am_libc__11convenience_la_OBJECTS = $(am__objects_1) $(am__objects_2)
......@@ -309,6 +309,7 @@ sources = \
limits.cc \
mutex.cc \
placeholders.cc \
random.cc \
regex.cc \
shared_ptr.cc \
system_error.cc \
......@@ -404,6 +405,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
esac;
$(top_srcdir)/fragment.am:
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
......@@ -422,7 +424,7 @@ clean-noinstLTLIBRARIES:
echo "rm -f \"$${dir}/so_locations\""; \
rm -f "$${dir}/so_locations"; \
done
libc++11convenience.la: $(libc__11convenience_la_OBJECTS) $(libc__11convenience_la_DEPENDENCIES)
libc++11convenience.la: $(libc__11convenience_la_OBJECTS) $(libc__11convenience_la_DEPENDENCIES) $(EXTRA_libc__11convenience_la_DEPENDENCIES)
$(CXXLINK) $(libc__11convenience_la_OBJECTS) $(libc__11convenience_la_LIBADD) $(LIBS)
mostlyclean-compile:
......@@ -511,10 +513,15 @@ install-am: all-am
installcheck: installcheck-am
install-strip:
if test -z '$(STRIP)'; then \
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
install; \
else \
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic:
clean-generic:
......
// random -*- C++ -*-
// Copyright (C) 2012 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 3, or (at your option)
// any later version.
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.
// You should have received a copy of the GNU General Public License and
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
// <http://www.gnu.org/licenses/>.
#include <random>
#if defined __i386__ || defined __x86_64__
# include <cpuid.h>
#endif
namespace std _GLIBCXX_VISIBILITY(default)
{
namespace
{
static unsigned long
_M_strtoul(const std::string& __str)
{
unsigned long __ret = 5489UL;
if (__str != "mt19937")
{
const char* __nptr = __str.c_str();
char* __endptr;
__ret = std::strtoul(__nptr, &__endptr, 0);
if (*__nptr == '\0' || *__endptr != '\0')
std::__throw_runtime_error(__N("random_device::_M_strtoul"
"(const std::string&)"));
}
return __ret;
}
#if defined __i386__ || defined __x86_64__
unsigned int
__attribute__ ((target("rdrnd")))
__x86_rdrand(void)
{
unsigned int retries = 100;
unsigned int val;
while (__builtin_ia32_rdrand32_step(&val) == 0)
if (--retries == 0)
std::__throw_runtime_error(__N("random_device::__x86_rdrand(void)"));
return val;
}
#endif
}
void
random_device::_M_init(const std::string& token)
{
const char *fname = token.c_str();
if (token == "default")
{
#if defined __i386__ || defined __x86_64__
unsigned int eax, ebx, ecx, edx;
__cpuid(0, eax, ebx, ecx, edx);
// Check for "GenuineIntel"
if (ebx == 0x756e6547 && ecx == 0x6c65746e && edx == 0x49656e69)
{
__cpuid(1, eax, ebx, ecx, edx);
if (ecx & bit_RDRND)
{
_M_file = nullptr;
return;
}
}
#endif
fname = "/dev/urandom";
}
else if (token != "/dev/urandom" && token != "/dev/random")
fail:
std::__throw_runtime_error(__N("random_device::"
"random_device(const std::string&)"));
_M_file = std::fopen(fname, "rb");
if (! _M_file)
goto fail;
}
void
random_device::_M_init_pretr1(const std::string& token)
{
_M_mt.seed(_M_strtoul(token));
}
void
random_device::_M_fini()
{
if (_M_file)
std::fclose(_M_file);
}
random_device::result_type
random_device::_M_getval()
{
#if (defined __i386__ || defined __x86_64__)
if (! _M_file)
return __x86_rdrand();
#endif
result_type __ret;
std::fread(reinterpret_cast<void*>(&__ret), sizeof(result_type),
1, _M_file);
return __ret;
}
random_device::result_type
random_device::_M_getval_pretr1()
{
return _M_mt();
}
template class mersenne_twister_engine<
uint_fast32_t,
32, 624, 397, 31,
0x9908b0dfUL, 11,
0xffffffffUL, 7,
0x9d2c5680UL, 15,
0xefc60000UL, 18, 1812433253UL>;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment