Browse Source

Workaround thread_local not supported on OSX

Drop back to xcode7.3 on TravisCI
adaptive-webui-19844
Chocobo1 8 years ago
parent
commit
cae2f3059c
  1. 2
      .travis.yml
  2. 32
      src/base/utils/random.cpp

2
.travis.yml

@ -3,7 +3,7 @@ language: cpp @@ -3,7 +3,7 @@ language: cpp
os:
- linux
- osx
osx_image: xcode8
osx_image: xcode7.3
env:
matrix:

32
src/base/utils/random.cpp

@ -33,21 +33,43 @@ @@ -33,21 +33,43 @@
#include <chrono>
#include <random>
#include <QtGlobal>
#ifdef Q_OS_MAC
#include <QThreadStorage>
#endif
// on some platform `std::random_device` may generate the same number sequence
static bool hasTrueRandomDevice{ std::random_device{}() != std::random_device{}() };
static thread_local std::mt19937 generator{
hasTrueRandomDevice
? std::random_device{}()
: (std::random_device::result_type) std::chrono::system_clock::now().time_since_epoch().count()
};
uint32_t Utils::Random::rand(const uint32_t min, const uint32_t max)
{
#ifdef Q_OS_MAC // workaround for Apple xcode: https://stackoverflow.com/a/29929949
static QThreadStorage<std::mt19937> generator;
if (!generator.hasLocalData())
generator.localData().seed(
hasTrueRandomDevice
? std::random_device{}()
: (std::random_device::result_type) std::chrono::system_clock::now().time_since_epoch().count()
);
#else
static thread_local std::mt19937 generator{
hasTrueRandomDevice
? std::random_device{}()
: (std::random_device::result_type) std::chrono::system_clock::now().time_since_epoch().count()
};
#endif
// better replacement for `std::rand`, don't use this for real cryptography application
// min <= returned_value <= max
assert(min <= max);
// new distribution is cheap: http://stackoverflow.com/a/19036349
std::uniform_int_distribution<uint32_t> uniform(min, max);
#ifdef Q_OS_MAC
return uniform(generator.localData());
#else
return uniform(generator);
#endif
}

Loading…
Cancel
Save