[poppler] config.h.cmake ConfigureChecks.cmake goo/grandom.cc goo/grandom.h
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Sep 28 15:57:31 UTC 2018
ConfigureChecks.cmake | 1
config.h.cmake | 3 --
goo/grandom.cc | 58 ++++++++++++--------------------------------------
goo/grandom.h | 20 +++--------------
4 files changed, 19 insertions(+), 63 deletions(-)
New commits:
commit c46717a70341ac0120579c867d49c250bed4ed52
Author: Adam Reichold <adam.reichold at t-online.de>
Date: Fri Aug 31 23:05:05 2018 +0200
Use the C++ standard library facilities for thread-safe random number generation avoiding the need for explicit configure checks.
diff --git a/ConfigureChecks.cmake b/ConfigureChecks.cmake
index 21bad506..6a910394 100644
--- a/ConfigureChecks.cmake
+++ b/ConfigureChecks.cmake
@@ -29,7 +29,6 @@ check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
check_function_exists(localtime_r HAVE_LOCALTIME_R)
check_function_exists(popen HAVE_POPEN)
check_function_exists(mkstemp HAVE_MKSTEMP)
-check_function_exists(rand_r HAVE_RAND_R)
check_function_exists(strcpy_s HAVE_STRCPY_S)
check_function_exists(strcat_s HAVE_STRCAT_S)
check_function_exists(strtok_r HAVE_STRTOK_R)
diff --git a/config.h.cmake b/config.h.cmake
index 194ccc41..74355a69 100644
--- a/config.h.cmake
+++ b/config.h.cmake
@@ -82,9 +82,6 @@
/* Define to 1 if you have the `mkstemp' function. */
#cmakedefine HAVE_MKSTEMP 1
-/* Define to 1 if you have the `rand_r' function. */
-#cmakedefine HAVE_RAND_R 1
-
/* Define to 1 if you have the `strcpy_s' function. */
#cmakedefine HAVE_STRCPY_S 1
diff --git a/goo/grandom.cc b/goo/grandom.cc
index 3171af85..a9a28a59 100644
--- a/goo/grandom.cc
+++ b/goo/grandom.cc
@@ -8,63 +8,35 @@
* Copyright (C) 2012 Fabio D'Urso <fabiodurso at hotmail.it>
*/
-#include <config.h>
#include "grandom.h"
-#include "gtypes.h"
-#ifdef HAVE_RAND_R // rand_r backend (POSIX)
+#include <random>
-static GBool initialized = gFalse;
-
-#include <stdlib.h>
-#include <time.h>
-static unsigned int seed;
-
-static void initialize() {
- if (!initialized) {
- seed = time(nullptr);
- initialized = gTrue;
- }
-}
-
-void grandom_fill(Guchar *buff, int size)
+namespace
{
- initialize();
- while (size--)
- *buff++ = rand_r(&seed) % 256;
-}
-double grandom_double()
+auto& grandom_engine()
{
- initialize();
- return rand_r(&seed) / (1 + (double)RAND_MAX);
+ static thread_local std::independent_bits_engine<std::default_random_engine, std::numeric_limits<Guchar>::digits, Guchar> engine{
+ std::default_random_engine{
+ std::random_device{}()
+ }
+ };
+ return engine;
}
-#else // srand+rand backend (unsafe, because it may interfere with the application)
-
-static GBool initialized = gFalse;
-
-#include <stdlib.h>
-#include <time.h>
-
-static void initialize() {
- if (!initialized) {
- srand(time(nullptr));
- initialized = gTrue;
- }
}
void grandom_fill(Guchar *buff, int size)
{
- initialize();
- while (size--)
- *buff++ = rand() % 256;
+ auto& engine = grandom_engine();
+ for (int index = 0; index < size; ++index) {
+ buff[index] = engine();
+ }
}
double grandom_double()
{
- initialize();
- return rand() / (1 + (double)RAND_MAX);
+ auto& engine = grandom_engine();
+ return std::generate_canonical<double, std::numeric_limits<double>::digits>(engine);
}
-
-#endif
diff --git a/goo/grandom.h b/goo/grandom.h
index 45fa791a..b70dd7e2 100644
--- a/goo/grandom.h
+++ b/goo/grandom.h
@@ -13,22 +13,10 @@
#include "gtypes.h"
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Fills the given buffer with random bytes
- */
-extern void grandom_fill(Guchar *buff, int size);
+/// Fills the given buffer with random bytes
+void grandom_fill(Guchar *buff, int size);
-/*
- * Returns a random number in [0,1)
- */
-extern double grandom_double();
-
-#ifdef __cplusplus
-}
-#endif
+/// Returns a random number in [0,1)
+double grandom_double();
#endif
More information about the poppler
mailing list