Fix issue http://code.google.com/p/v8/issues/detail?id=58:
authoriposva@chromium.org <iposva@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 10 Sep 2008 06:59:41 +0000 (06:59 +0000)
committeriposva@chromium.org <iposva@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 10 Sep 2008 06:59:41 +0000 (06:59 +0000)
- Prevent a clipping of values when converting a double to an unsigned int
  for use as the random generator's seed value.
Review URL: http://codereview.chromium.org/1887

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@246 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/platform-linux.cc
src/platform-macos.cc
src/platform-win32.cc

index 9bac309..ba72768 100644 (file)
@@ -67,7 +67,12 @@ double ceiling(double x) {
 
 void OS::Setup() {
   // Seed the random number generator.
-  srandom(static_cast<unsigned int>(TimeCurrentMillis()));
+  // Convert the current time to a 64-bit integer first, before converting it
+  // to an unsigned. Going directly can cause an overflow and the seed to be
+  // set to all ones. The seed will be identical for different instances that
+  // call this setup code within the same millisecond.
+  uint64_t seed = static_cast<uint64_t>(TimeCurrentMillis());
+  srandom(static_cast<unsigned int>(seed));
 }
 
 
index 5edd7a6..7573125 100644 (file)
@@ -73,7 +73,12 @@ double ceiling(double x) {
 
 void OS::Setup() {
   // Seed the random number generator.
-  srandom(static_cast<unsigned int>(TimeCurrentMillis()));
+  // Convert the current time to a 64-bit integer first, before converting it
+  // to an unsigned. Going directly will cause an overflow and the seed to be
+  // set to all ones. The seed will be identical for different instances that
+  // call this setup code within the same millisecond.
+  uint64_t seed = static_cast<uint64_t>(TimeCurrentMillis());
+  srandom(static_cast<unsigned int>(seed));
 }
 
 
index 2d54b6b..6035465 100644 (file)
@@ -493,7 +493,12 @@ char* Time::LocalTimezone() {
 
 void OS::Setup() {
   // Seed the random number generator.
-  srand(static_cast<unsigned int>(TimeCurrentMillis()));
+  // Convert the current time to a 64-bit integer first, before converting it
+  // to an unsigned. Going directly can cause an overflow and the seed to be
+  // set to all ones. The seed will be identical for different instances that
+  // call this setup code within the same millisecond.
+  uint64_t seed = static_cast<uint64_t>(TimeCurrentMillis());
+  srand(static_cast<unsigned int>(seed));
 }