thread safe randoms
authorMichael Wallner <mike@php.net>
Fri, 30 Oct 2020 12:37:41 +0000 (13:37 +0100)
committerMichael Wallner <mike@php.net>
Fri, 30 Oct 2020 12:37:41 +0000 (13:37 +0100)
test/lib/random.cpp
test/lib/random.hpp
test/setup.cpp

index 6aab887597f087e75b823f24773cf0515845c11d..1d9a20c9a9b166e0b5beda1743a04e5ffcfcb906 100644 (file)
@@ -3,6 +3,16 @@
 
 #include <unistd.h> // getpid()
 
+mt19937_64 rnd_eng;
+mutex rnd_mtx;
+
+void random_setup() {
+  using namespace chrono;
+
+  auto time = duration_cast<nanoseconds>(system_clock::now().time_since_epoch());
+  rnd_eng.seed(static_cast<mt19937_64::result_type>(time.count()));
+}
+
 unsigned random_port() {
   do {
     auto port = random_num(5000, 32000);
index 723146a9acd07a31e24f9b2deb1c77d522d7eb92..322de6af91392b59fede7d91945039fcc299e6fb 100644 (file)
 #include <string>
 #include <type_traits>
 #include <utility>
+#include <mutex>
 
 using namespace std;
 
 using kv_pair = pair<string, string>;
 
-template<typename T>
-enable_if_t<is_integral_v<T>, T> random_num(T min, T max) {
-  using namespace chrono;
-  using rnd = mt19937_64;
-  using dst = uniform_int_distribution<uintmax_t>;
+extern mt19937_64 rnd_eng;
+extern mutex rnd_mtx;
 
-  static auto time = duration_cast<nanoseconds>(system_clock::now().time_since_epoch());
-  static auto seed = static_cast<rnd::result_type>(time.count());
-  static auto rgen = rnd{seed};
+void random_setup();
 
-  return dst(min, max)(rgen);
+template<typename T>
+enable_if_t<is_integral_v<T>, T> random_num(T min, T max) {
+  lock_guard m{rnd_mtx};
+  return uniform_int_distribution<T>(min, max)(rnd_eng);
 }
 
 unsigned random_port();
index 9591a3569c7b982350bfdf35fe6dc8a6563c5698..a0325af52530637fb1b95058e7e6e3e41d72d862 100644 (file)
@@ -1,5 +1,6 @@
 #include "mem_config.h"
 #include "test/lib/env.hpp"
+#include "test/lib/random.hpp"
 #include <cstdlib>
 #include <cstdio>
 #include <cstring>
@@ -78,6 +79,8 @@ static inline void setup_sasl() {
 #endif
 
 int setup(int &, char ***argv) {
+  random_setup();
+
   setup_signals();
   setup_asan(*argv);
   setup_sasl();