Introducing thread-safe nxt_random().
This commit is contained in:
@@ -11,7 +11,6 @@ nxt_uint_t nxt_ncpu = 1;
|
|||||||
nxt_uint_t nxt_pagesize;
|
nxt_uint_t nxt_pagesize;
|
||||||
nxt_task_t nxt_main_task;
|
nxt_task_t nxt_main_task;
|
||||||
nxt_atomic_t nxt_task_ident;
|
nxt_atomic_t nxt_task_ident;
|
||||||
nxt_random_t nxt_random_data;
|
|
||||||
|
|
||||||
nxt_thread_declare_data(nxt_thread_t, nxt_thread_context);
|
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_thread_spin_init(nxt_ncpu, 0);
|
||||||
|
|
||||||
nxt_random_init(&nxt_random_data);
|
nxt_random_init(&thread->random);
|
||||||
|
|
||||||
nxt_pagesize = getpagesize();
|
nxt_pagesize = getpagesize();
|
||||||
|
|
||||||
|
|||||||
@@ -175,7 +175,6 @@ NXT_EXPORT extern nxt_uint_t nxt_ncpu;
|
|||||||
NXT_EXPORT extern nxt_uint_t nxt_pagesize;
|
NXT_EXPORT extern nxt_uint_t nxt_pagesize;
|
||||||
NXT_EXPORT extern nxt_task_t nxt_main_task;
|
NXT_EXPORT extern nxt_task_t nxt_main_task;
|
||||||
NXT_EXPORT extern nxt_atomic_t nxt_task_ident;
|
NXT_EXPORT extern nxt_atomic_t nxt_task_ident;
|
||||||
NXT_EXPORT extern nxt_random_t nxt_random_data;
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* _NXT_LIB_H_INCLUDED_ */
|
#endif /* _NXT_LIB_H_INCLUDED_ */
|
||||||
|
|||||||
@@ -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",
|
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';
|
*p = '\0';
|
||||||
|
|
||||||
#if (NXT_HAVE_MEMFD_CREATE)
|
#if (NXT_HAVE_MEMFD_CREATE)
|
||||||
|
|||||||
@@ -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_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) {
|
if (process->user_cred != NULL && getuid() == 0) {
|
||||||
/* Super-user. */
|
/* 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 = thread->runtime;
|
||||||
|
|
||||||
rt->types |= (1U << process->type);
|
rt->types |= (1U << process->type);
|
||||||
|
|||||||
@@ -8,8 +8,6 @@
|
|||||||
#include <nxt_main.h>
|
#include <nxt_main.h>
|
||||||
|
|
||||||
|
|
||||||
#if !(NXT_HAVE_ARC4RANDOM)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The pseudorandom generator based on OpenBSD arc4random. Although it is
|
* The pseudorandom generator based on OpenBSD arc4random. Although it is
|
||||||
* usually stated that arc4random uses RC4 pseudorandom generation algorithm
|
* usually stated that arc4random uses RC4 pseudorandom generation algorithm
|
||||||
@@ -56,7 +54,7 @@ nxt_random_stir(nxt_random_t *r)
|
|||||||
ssize_t n;
|
ssize_t n;
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
union {
|
union {
|
||||||
uint32_t value[3];
|
uint32_t value[4];
|
||||||
u_char bytes[NXT_RANDOM_KEY_SIZE];
|
u_char bytes[NXT_RANDOM_KEY_SIZE];
|
||||||
} key;
|
} key;
|
||||||
|
|
||||||
@@ -87,6 +85,7 @@ nxt_random_stir(nxt_random_t *r)
|
|||||||
key.value[0] ^= tv.tv_usec;
|
key.value[0] ^= tv.tv_usec;
|
||||||
key.value[1] ^= tv.tv_sec;
|
key.value[1] ^= tv.tv_sec;
|
||||||
key.value[2] ^= nxt_pid;
|
key.value[2] ^= nxt_pid;
|
||||||
|
key.value[3] ^= nxt_thread_tid(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
nxt_random_add(r, key.bytes, NXT_RANDOM_KEY_SIZE);
|
nxt_random_add(r, key.bytes, NXT_RANDOM_KEY_SIZE);
|
||||||
@@ -202,5 +201,3 @@ nxt_random_unit_test(nxt_thread_t *thr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -8,24 +8,6 @@
|
|||||||
#define _NXT_RANDOM_H_INCLUDED_
|
#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 {
|
typedef struct {
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
uint8_t j;
|
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);
|
nxt_int_t nxt_random_unit_test(nxt_thread_t *thr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* _NXT_RANDOM_H_INCLUDED_ */
|
#endif /* _NXT_RANDOM_H_INCLUDED_ */
|
||||||
|
|||||||
@@ -1655,7 +1655,7 @@ nxt_router_process_http_request(nxt_task_t *task, nxt_conn_t *c,
|
|||||||
engine = task->thread->engine;
|
engine = task->thread->engine;
|
||||||
|
|
||||||
do {
|
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);
|
} while (nxt_event_engine_request_find(engine, req_id) != NULL);
|
||||||
|
|
||||||
rc = nxt_conn_request_add(c, req_id);
|
rc = nxt_conn_request_add(c, req_id);
|
||||||
|
|||||||
@@ -160,6 +160,8 @@ nxt_thread_init(void)
|
|||||||
nxt_thread_time_update(thr);
|
nxt_thread_time_update(thr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nxt_random_init(&thr->random);
|
||||||
|
|
||||||
return thr;
|
return thr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -188,6 +188,8 @@ struct nxt_thread_s {
|
|||||||
* engine->fibers, its placement here eliminates 2 memory accesses.
|
* engine->fibers, its placement here eliminates 2 memory accesses.
|
||||||
*/
|
*/
|
||||||
nxt_fiber_t *fiber;
|
nxt_fiber_t *fiber;
|
||||||
|
|
||||||
|
nxt_random_t random;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user