arc4random_global
struct arc4random_global_state arc4random_global = {
mutex_lock(&arc4random_global.lock);
(void)explicit_memset(&arc4random_global.prng, 0,
sizeof arc4random_global.prng);
mutex_unlock(&arc4random_global.lock);
mutex_init(&arc4random_global.lock, NULL);
arc4random_global.forksafe = true;
if (thr_keycreate(&arc4random_global.thread_key,
arc4random_global.per_thread = true;
arc4random_global.initialized = true;
thr_once(&arc4random_global.once, &arc4random_initialize);
prng = __predict_true(arc4random_global.per_thread)
? thr_getspecific(arc4random_global.thread_key)
if (__predict_false(prng == NULL) && arc4random_global.per_thread) {
thr_setspecific(arc4random_global.thread_key, prng);
if (__predict_true(arc4random_global.forksafe)) {
mutex_lock(&arc4random_global.lock);
prng = &arc4random_global.prng;
if (__predict_false(prng == &arc4random_global.prng))
mutex_unlock(&arc4random_global.lock);
prng = arc4random_global.per_thread
? thr_getspecific(arc4random_global.thread_key)
prng = &arc4random_global.prng;
extern struct arc4random_global_state arc4random_global;
ATF_CHECK_EQ(prng, &arc4random_global.prng);
ATF_CHECK(arc4random_global.initialized);
struct arc4random_prng *local, *global = &arc4random_global.prng;
struct arc4random_prng *local, *global = &arc4random_global.prng;
arc4random_global.per_thread = false;
memset(&arc4random_global.thread_key, 0x5a,
sizeof(arc4random_global.thread_key));
arc4random_global.prng.arc4_epoch = 0;
ATF_CHECK(arc4random_prng() == &arc4random_global.prng);
ATF_CHECK(arc4random_global.prng.arc4_epoch != 0);
ATF_CHECK(prng != &arc4random_global.prng);
memset(&arc4random_global.prng, 0, sizeof(arc4random_global.prng));
arc4random_global.forksafe = false;
arc4random_global.per_thread = false;
ATF_CHECK_EQ_MSG(arc4random_global.prng.arc4_epoch, 0,
"global epoch: %d", arc4random_global.prng.arc4_epoch);
if (arc4random_global.per_thread)
prng = thr_getspecific(arc4random_global.thread_key);
prng = &arc4random_global.prng;
} arc4random_global = {