From 28be2ddd7f721b208dc6e0ae42467e521372ea1e Mon Sep 17 00:00:00 2001 From: Matteo De Carlo Date: Sat, 6 Nov 2021 19:59:44 +0100 Subject: [PATCH] Fixed wiRandom initialization order (#344) On some compilers, wiRandom would initialize later than other modules that depend on it for initialization, resuling in undefined behaviour (infinite loop in my case). Co-authored-by: Amer Koleci --- WickedEngine/wiRandom.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/WickedEngine/wiRandom.cpp b/WickedEngine/wiRandom.cpp index 3c66419de..2c14b0148 100644 --- a/WickedEngine/wiRandom.cpp +++ b/WickedEngine/wiRandom.cpp @@ -3,13 +3,16 @@ namespace wiRandom { - std::random_device rand_dev; - std::mt19937 generator(rand_dev()); + std::mt19937 &generator() { + static std::random_device rand_dev; + static std::mt19937 generator(rand_dev()); + return generator; + } int getRandom(int minValue, int maxValue) { std::uniform_int_distribution distr(minValue, maxValue); - return distr(generator); + return distr(generator()); } int getRandom(int maxValue) { @@ -19,7 +22,7 @@ namespace wiRandom uint32_t getRandom(uint32_t minValue, uint32_t maxValue) { std::uniform_int_distribution distr(minValue, maxValue); - return distr(generator); + return distr(generator()); } uint32_t getRandom(uint32_t maxValue) { @@ -29,7 +32,7 @@ namespace wiRandom uint64_t getRandom(uint64_t minValue, uint64_t maxValue) { std::uniform_int_distribution distr(minValue, maxValue); - return distr(generator); + return distr(generator()); } uint64_t getRandom(uint64_t maxValue) {