Moving nxt_stream_ident to shared memory.

This aims to avoid stream id clashes after router restart.
This commit is contained in:
Max Romanov 2020-05-28 12:41:00 +03:00
parent de368f033d
commit aacf11152c
3 changed files with 31 additions and 3 deletions

View file

@ -8,7 +8,7 @@
#include <nxt_port_rpc.h>
static nxt_atomic_t nxt_stream_ident = 1;
static volatile uint32_t *nxt_stream_ident;
typedef struct nxt_port_rpc_reg_s nxt_port_rpc_reg_t;
@ -30,6 +30,29 @@ nxt_port_rpc_remove_from_peers(nxt_task_t *task, nxt_port_t *port,
nxt_port_rpc_reg_t *reg);
nxt_int_t
nxt_port_rpc_init(void)
{
void *p;
if (nxt_stream_ident != NULL) {
return NXT_OK;
}
p = nxt_mem_mmap(NULL, sizeof(*nxt_stream_ident), PROT_READ | PROT_WRITE,
MAP_ANON | MAP_SHARED, -1, 0);
if (nxt_slow_path(p == MAP_FAILED)) {
return NXT_ERROR;
}
nxt_stream_ident = p;
*nxt_stream_ident = 1;
return NXT_OK;
}
static nxt_int_t
nxt_rpc_reg_test(nxt_lvlhsh_query_t *lhq, void *data)
{
@ -105,8 +128,7 @@ nxt_port_rpc_register_handler_ex(nxt_task_t *task, nxt_port_t *port,
nxt_assert(port->pair[0] != -1);
stream =
(uint32_t) nxt_atomic_fetch_add(&nxt_stream_ident, 1) & 0x3FFFFFFF;
stream = nxt_atomic_fetch_add(nxt_stream_ident, 1);
reg = nxt_mp_zalloc(port->mem_pool, sizeof(nxt_port_rpc_reg_t) + ex_size);

View file

@ -11,6 +11,8 @@
typedef void (*nxt_port_rpc_handler_t)(nxt_task_t *task,
nxt_port_recv_msg_t *msg, void *data);
nxt_int_t nxt_port_rpc_init(void);
uint32_t nxt_port_rpc_register_handler(nxt_task_t *task, nxt_port_t *port,
nxt_port_rpc_handler_t ready_handler, nxt_port_rpc_handler_t error_handler,
nxt_pid_t peer, void *data);

View file

@ -118,6 +118,10 @@ nxt_runtime_create(nxt_task_t *task)
goto fail;
}
if (nxt_port_rpc_init() != NXT_OK) {
goto fail;
}
nxt_work_queue_add(&task->thread->engine->fast_work_queue,
nxt_runtime_start, task, rt, NULL);