Index: src/utils/random-number-generator.cc |
diff --git a/src/utils/random-number-generator.cc b/src/utils/random-number-generator.cc |
deleted file mode 100644 |
index 3da6a5aa4ac3e99d786a44a0a3a93580eaa61bbf..0000000000000000000000000000000000000000 |
--- a/src/utils/random-number-generator.cc |
+++ /dev/null |
@@ -1,131 +0,0 @@ |
-// Copyright 2013 the V8 project authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "src/utils/random-number-generator.h" |
- |
-#include <stdio.h> |
-#include <stdlib.h> |
- |
-#include <new> |
- |
-#include "src/base/macros.h" |
-#include "src/platform/mutex.h" |
-#include "src/platform/time.h" |
- |
-namespace v8 { |
-namespace internal { |
- |
-static LazyMutex entropy_mutex = LAZY_MUTEX_INITIALIZER; |
-static RandomNumberGenerator::EntropySource entropy_source = NULL; |
- |
- |
-// static |
-void RandomNumberGenerator::SetEntropySource(EntropySource source) { |
- LockGuard<Mutex> lock_guard(entropy_mutex.Pointer()); |
- entropy_source = source; |
-} |
- |
- |
-RandomNumberGenerator::RandomNumberGenerator() { |
- // Check if embedder supplied an entropy source. |
- { LockGuard<Mutex> lock_guard(entropy_mutex.Pointer()); |
- if (entropy_source != NULL) { |
- int64_t seed; |
- if (entropy_source(reinterpret_cast<unsigned char*>(&seed), |
- sizeof(seed))) { |
- SetSeed(seed); |
- return; |
- } |
- } |
- } |
- |
-#if V8_OS_CYGWIN || V8_OS_WIN |
- // Use rand_s() to gather entropy on Windows. See: |
- // https://code.google.com/p/v8/issues/detail?id=2905 |
- unsigned first_half, second_half; |
- errno_t result = rand_s(&first_half); |
- ASSERT_EQ(0, result); |
- result = rand_s(&second_half); |
- ASSERT_EQ(0, result); |
- SetSeed((static_cast<int64_t>(first_half) << 32) + second_half); |
-#else |
- // Gather entropy from /dev/urandom if available. |
- FILE* fp = fopen("/dev/urandom", "rb"); |
- if (fp != NULL) { |
- int64_t seed; |
- size_t n = fread(&seed, sizeof(seed), 1, fp); |
- fclose(fp); |
- if (n == 1) { |
- SetSeed(seed); |
- return; |
- } |
- } |
- |
- // We cannot assume that random() or rand() were seeded |
- // properly, so instead of relying on random() or rand(), |
- // we just seed our PRNG using timing data as fallback. |
- // This is weak entropy, but it's sufficient, because |
- // it is the responsibility of the embedder to install |
- // an entropy source using v8::V8::SetEntropySource(), |
- // which provides reasonable entropy, see: |
- // https://code.google.com/p/v8/issues/detail?id=2905 |
- int64_t seed = Time::NowFromSystemTime().ToInternalValue() << 24; |
- seed ^= TimeTicks::HighResolutionNow().ToInternalValue() << 16; |
- seed ^= TimeTicks::Now().ToInternalValue() << 8; |
- SetSeed(seed); |
-#endif // V8_OS_CYGWIN || V8_OS_WIN |
-} |
- |
- |
-int RandomNumberGenerator::NextInt(int max) { |
- ASSERT_LE(0, max); |
- |
- // Fast path if max is a power of 2. |
- if (IS_POWER_OF_TWO(max)) { |
- return static_cast<int>((max * static_cast<int64_t>(Next(31))) >> 31); |
- } |
- |
- while (true) { |
- int rnd = Next(31); |
- int val = rnd % max; |
- if (rnd - val + (max - 1) >= 0) { |
- return val; |
- } |
- } |
-} |
- |
- |
-double RandomNumberGenerator::NextDouble() { |
- return ((static_cast<int64_t>(Next(26)) << 27) + Next(27)) / |
- static_cast<double>(static_cast<int64_t>(1) << 53); |
-} |
- |
- |
-void RandomNumberGenerator::NextBytes(void* buffer, size_t buflen) { |
- for (size_t n = 0; n < buflen; ++n) { |
- static_cast<uint8_t*>(buffer)[n] = static_cast<uint8_t>(Next(8)); |
- } |
-} |
- |
- |
-int RandomNumberGenerator::Next(int bits) { |
- ASSERT_LT(0, bits); |
- ASSERT_GE(32, bits); |
- // Do unsigned multiplication, which has the intended modulo semantics, while |
- // signed multiplication would expose undefined behavior. |
- uint64_t product = static_cast<uint64_t>(seed_) * kMultiplier; |
- // Assigning a uint64_t to an int64_t is implementation defined, but this |
- // should be OK. Use a static_cast to explicitly state that we know what we're |
- // doing. (Famous last words...) |
- int64_t seed = static_cast<int64_t>((product + kAddend) & kMask); |
- seed_ = seed; |
- return static_cast<int>(seed >> (48 - bits)); |
-} |
- |
- |
-void RandomNumberGenerator::SetSeed(int64_t seed) { |
- seed_ = (seed ^ kMultiplier) & kMask; |
-} |
- |
-} } // namespace v8::internal |