mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
Avoid buffered reads of /dev/urandom
I am seeing disappointing clang performance on a large PowerPC64 Linux box. GetRandomNumberSeed() does a buffered read from /dev/urandom to seed its PRNG. As a result we read an entire page even though we only need 4 bytes. With every clang task reading a page worth of /dev/urandom we end up spending a large amount of time stuck on kernel spinlock. Patch by Anton Blanchard! llvm-svn: 255386
This commit is contained in:
parent
5f81084374
commit
8ea226400f
@ -430,13 +430,18 @@ const char *Process::ResetColor() {
|
||||
#if !defined(HAVE_DECL_ARC4RANDOM) || !HAVE_DECL_ARC4RANDOM
|
||||
static unsigned GetRandomNumberSeed() {
|
||||
// Attempt to get the initial seed from /dev/urandom, if possible.
|
||||
if (FILE *RandomSource = ::fopen("/dev/urandom", "r")) {
|
||||
int urandomFD = open("/dev/urandom", O_RDONLY);
|
||||
|
||||
if (urandomFD != -1) {
|
||||
unsigned seed;
|
||||
int count = ::fread((void *)&seed, sizeof(seed), 1, RandomSource);
|
||||
::fclose(RandomSource);
|
||||
// Don't use a buffered read to avoid reading more data
|
||||
// from /dev/urandom than we need.
|
||||
int count = read(urandomFD, (void *)&seed, sizeof(seed));
|
||||
|
||||
close(urandomFD);
|
||||
|
||||
// Return the seed if the read was successful.
|
||||
if (count == 1)
|
||||
if (count == sizeof(seed))
|
||||
return seed;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user