Introducing thread-safe nxt_random().

This commit is contained in:
Igor Sysoev
2017-07-10 21:07:12 +03:00
parent dc874cd22e
commit 3bccb7f358
9 changed files with 12 additions and 32 deletions

View File

@@ -11,7 +11,6 @@ nxt_uint_t nxt_ncpu = 1;
nxt_uint_t nxt_pagesize;
nxt_task_t nxt_main_task;
nxt_atomic_t nxt_task_ident;
nxt_random_t nxt_random_data;
nxt_thread_declare_data(nxt_thread_t, nxt_thread_context);
@@ -100,7 +99,7 @@ nxt_lib_start(const char *app, char **argv, char ***envp)
nxt_thread_spin_init(nxt_ncpu, 0);
nxt_random_init(&nxt_random_data);
nxt_random_init(&thread->random);
nxt_pagesize = getpagesize();

View File

@@ -175,7 +175,6 @@ NXT_EXPORT extern nxt_uint_t nxt_ncpu;
NXT_EXPORT extern nxt_uint_t nxt_pagesize;
NXT_EXPORT extern nxt_task_t nxt_main_task;
NXT_EXPORT extern nxt_atomic_t nxt_task_ident;
NXT_EXPORT extern nxt_random_t nxt_random_data;
#endif /* _NXT_LIB_H_INCLUDED_ */

View File

@@ -217,7 +217,7 @@ nxt_port_new_port_mmap(nxt_task_t *task, nxt_process_t *process,
}
p = nxt_sprintf(name, name + sizeof(name), "/nginext.%PI.%uxD",
nxt_pid, nxt_random(&nxt_random_data));
nxt_pid, nxt_random(&task->thread->random));
*p = '\0';
#if (NXT_HAVE_MEMFD_CREATE)

View File

@@ -82,7 +82,9 @@ nxt_process_start(nxt_task_t *task, nxt_process_init_t *process)
nxt_process_title(task, "nginext: %s", process->name);
nxt_random_init(&nxt_random_data);
thread = task->thread;
nxt_random_init(&thread->random);
if (process->user_cred != NULL && getuid() == 0) {
/* Super-user. */
@@ -93,7 +95,6 @@ nxt_process_start(nxt_task_t *task, nxt_process_init_t *process)
}
}
thread = task->thread;
rt = thread->runtime;
rt->types |= (1U << process->type);

View File

@@ -8,8 +8,6 @@
#include <nxt_main.h>
#if !(NXT_HAVE_ARC4RANDOM)
/*
* The pseudorandom generator based on OpenBSD arc4random. Although it is
* usually stated that arc4random uses RC4 pseudorandom generation algorithm
@@ -56,7 +54,7 @@ nxt_random_stir(nxt_random_t *r)
ssize_t n;
struct timeval tv;
union {
uint32_t value[3];
uint32_t value[4];
u_char bytes[NXT_RANDOM_KEY_SIZE];
} key;
@@ -87,6 +85,7 @@ nxt_random_stir(nxt_random_t *r)
key.value[0] ^= tv.tv_usec;
key.value[1] ^= tv.tv_sec;
key.value[2] ^= nxt_pid;
key.value[3] ^= nxt_thread_tid(NULL);
}
nxt_random_add(r, key.bytes, NXT_RANDOM_KEY_SIZE);
@@ -202,5 +201,3 @@ nxt_random_unit_test(nxt_thread_t *thr)
}
#endif
#endif

View File

@@ -8,24 +8,6 @@
#define _NXT_RANDOM_H_INCLUDED_
#if (NXT_HAVE_ARC4RANDOM)
/*
* arc4random() has been introduced in OpenBSD 2.1 and then was ported
* to FreeBSD 2.2.6, NetBSD 2.0, MacOSX and SmartOS.
*
* arc4random() automatically initializes itself in the first call and
* then reinitializes itself in the first call in every forked processes.
*/
typedef void *nxt_random_t;
#define nxt_random_init(r)
#define nxt_random(r) arc4random()
#else
typedef struct {
uint8_t i;
uint8_t j;
@@ -41,7 +23,5 @@ uint32_t nxt_random(nxt_random_t *r);
nxt_int_t nxt_random_unit_test(nxt_thread_t *thr);
#endif
#endif
#endif /* _NXT_RANDOM_H_INCLUDED_ */

View File

@@ -1655,7 +1655,7 @@ nxt_router_process_http_request(nxt_task_t *task, nxt_conn_t *c,
engine = task->thread->engine;
do {
req_id = nxt_random(&nxt_random_data);
req_id = nxt_random(&task->thread->random);
} while (nxt_event_engine_request_find(engine, req_id) != NULL);
rc = nxt_conn_request_add(c, req_id);

View File

@@ -160,6 +160,8 @@ nxt_thread_init(void)
nxt_thread_time_update(thr);
}
nxt_random_init(&thr->random);
return thr;
}

View File

@@ -188,6 +188,8 @@ struct nxt_thread_s {
* engine->fibers, its placement here eliminates 2 memory accesses.
*/
nxt_fiber_t *fiber;
nxt_random_t random;
};