Add a global counter in ddsrt_random_init fallback
It currently uses process id and timestamp, but on a low-resolution clock that might result in two subsequent initialisations in the same process yielding the same seed, and that wasn't the intent. Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
parent
68b85d0a2d
commit
a632f80000
1 changed files with 4 additions and 1 deletions
|
@ -61,6 +61,7 @@
|
||||||
#include "dds/ddsrt/sync.h"
|
#include "dds/ddsrt/sync.h"
|
||||||
#include "dds/ddsrt/time.h"
|
#include "dds/ddsrt/time.h"
|
||||||
#include "dds/ddsrt/process.h"
|
#include "dds/ddsrt/process.h"
|
||||||
|
#include "dds/ddsrt/atomics.h"
|
||||||
#include "dds/ddsrt/static_assert.h"
|
#include "dds/ddsrt/static_assert.h"
|
||||||
|
|
||||||
#define N DDSRT_MT19937_N
|
#define N DDSRT_MT19937_N
|
||||||
|
@ -186,13 +187,15 @@ void ddsrt_random_init (void)
|
||||||
ddsrt_prng_seed_t seed;
|
ddsrt_prng_seed_t seed;
|
||||||
if (!ddsrt_prng_makeseed (&seed))
|
if (!ddsrt_prng_makeseed (&seed))
|
||||||
{
|
{
|
||||||
|
static ddsrt_atomic_uint32_t counter = DDSRT_ATOMIC_UINT32_INIT (0);
|
||||||
/* Poor man's initialisation */
|
/* Poor man's initialisation */
|
||||||
DDSRT_STATIC_ASSERT (sizeof (seed.key) / sizeof (seed.key[0]) >= 3);
|
DDSRT_STATIC_ASSERT (sizeof (seed.key) / sizeof (seed.key[0]) >= 4);
|
||||||
memset (&seed, 0, sizeof (seed));
|
memset (&seed, 0, sizeof (seed));
|
||||||
dds_time_t now = dds_time ();
|
dds_time_t now = dds_time ();
|
||||||
seed.key[0] = (uint32_t) ddsrt_getpid ();
|
seed.key[0] = (uint32_t) ddsrt_getpid ();
|
||||||
seed.key[1] = (uint32_t) ((uint64_t) now >> 32);
|
seed.key[1] = (uint32_t) ((uint64_t) now >> 32);
|
||||||
seed.key[2] = (uint32_t) now;
|
seed.key[2] = (uint32_t) now;
|
||||||
|
seed.key[3] = ddsrt_atomic_inc32_ov (&counter);
|
||||||
}
|
}
|
||||||
ddsrt_prng_init (&default_prng, &seed);
|
ddsrt_prng_init (&default_prng, &seed);
|
||||||
ddsrt_mutex_init (&default_prng_lock);
|
ddsrt_mutex_init (&default_prng_lock);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue