Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1648)

Unified Diff: src/utils/random-number-generator.cc

Issue 358363002: Move platform abstraction to base library (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: updates Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« src/base/macros.h ('K') | « src/utils/random-number-generator.h ('k') | src/v8.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698