diff options
author | Max Romanov <max.romanov@nginx.com> | 2020-08-11 19:19:55 +0300 |
---|---|---|
committer | Max Romanov <max.romanov@nginx.com> | 2020-08-11 19:19:55 +0300 |
commit | ec3389b63bd7a9159d2be4a2863140f75095c7d3 (patch) | |
tree | f88972c19c713748b56c339dab1bdd60892eaeec /src/nodejs | |
parent | 3a721e1d96720505d4d6638e77d2c296d962519c (diff) | |
download | unit-ec3389b63bd7a9159d2be4a2863140f75095c7d3.tar.gz unit-ec3389b63bd7a9159d2be4a2863140f75095c7d3.tar.bz2 |
Libunit refactoring: port management.
- Changed the port management callbacks to notifications, which e. g. avoids
the need to call the libunit function
- Added context and library instance reference counts for a safer resource
release
- Added the router main port initialization
Diffstat (limited to 'src/nodejs')
-rw-r--r-- | src/nodejs/unit-http/unit.cpp | 46 | ||||
-rw-r--r-- | src/nodejs/unit-http/unit.h | 2 |
2 files changed, 23 insertions, 25 deletions
diff --git a/src/nodejs/unit-http/unit.cpp b/src/nodejs/unit-http/unit.cpp index 555b21fa..468acf96 100644 --- a/src/nodejs/unit-http/unit.cpp +++ b/src/nodejs/unit-http/unit.cpp @@ -18,7 +18,8 @@ static void delete_port_data(uv_handle_t* handle); napi_ref Unit::constructor_; -struct nxt_nodejs_ctx_t { +struct port_data_t { + nxt_unit_ctx_t *ctx; nxt_unit_port_id_t port_id; uv_poll_t poll; }; @@ -360,8 +361,8 @@ Unit::add_port(nxt_unit_ctx_t *ctx, nxt_unit_port_t *port) int err; Unit *obj; uv_loop_t *loop; + port_data_t *data; napi_status status; - nxt_nodejs_ctx_t *node_ctx; if (port->in_fd != -1) { obj = reinterpret_cast<Unit *>(ctx->unit->data); @@ -378,27 +379,28 @@ Unit::add_port(nxt_unit_ctx_t *ctx, nxt_unit_port_t *port) return NXT_UNIT_ERROR; } - node_ctx = new nxt_nodejs_ctx_t; + data = new port_data_t; - err = uv_poll_init(loop, &node_ctx->poll, port->in_fd); + err = uv_poll_init(loop, &data->poll, port->in_fd); if (err < 0) { nxt_unit_warn(ctx, "Failed to init uv.poll"); return NXT_UNIT_ERROR; } - err = uv_poll_start(&node_ctx->poll, UV_READABLE, nxt_uv_read_callback); + err = uv_poll_start(&data->poll, UV_READABLE, nxt_uv_read_callback); if (err < 0) { nxt_unit_warn(ctx, "Failed to start uv.poll"); return NXT_UNIT_ERROR; } - ctx->data = node_ctx; + port->data = data; - node_ctx->port_id = port->id; - node_ctx->poll.data = ctx; + data->ctx = ctx; + data->port_id = port->id; + data->poll.data = ctx; } - return nxt_unit_add_port(ctx, port); + return NXT_UNIT_OK; } @@ -410,35 +412,31 @@ operator == (const nxt_unit_port_id_t &p1, const nxt_unit_port_id_t &p2) void -Unit::remove_port(nxt_unit_ctx_t *ctx, nxt_unit_port_id_t *port_id) +Unit::remove_port(nxt_unit_t *unit, nxt_unit_port_t *port) { - nxt_nodejs_ctx_t *node_ctx; + port_data_t *data; - if (ctx->data != NULL) { - node_ctx = (nxt_nodejs_ctx_t *) ctx->data; + if (port->data != NULL) { + data = (port_data_t *) port->data; - if (node_ctx->port_id == *port_id) { - uv_poll_stop(&node_ctx->poll); + if (data->port_id == port->id) { + uv_poll_stop(&data->poll); - node_ctx->poll.data = node_ctx; - uv_close((uv_handle_t *) &node_ctx->poll, delete_port_data); - - ctx->data = NULL; + data->poll.data = data; + uv_close((uv_handle_t *) &data->poll, delete_port_data); } } - - nxt_unit_remove_port(ctx, port_id); } static void delete_port_data(uv_handle_t* handle) { - nxt_nodejs_ctx_t *node_ctx; + port_data_t *data; - node_ctx = (nxt_nodejs_ctx_t *) handle->data; + data = (port_data_t *) handle->data; - delete node_ctx; + delete data; } diff --git a/src/nodejs/unit-http/unit.h b/src/nodejs/unit-http/unit.h index 18359118..07823c26 100644 --- a/src/nodejs/unit-http/unit.h +++ b/src/nodejs/unit-http/unit.h @@ -40,7 +40,7 @@ private: void shm_ack_handler(nxt_unit_ctx_t *ctx); static int add_port(nxt_unit_ctx_t *ctx, nxt_unit_port_t *port); - static void remove_port(nxt_unit_ctx_t *ctx, nxt_unit_port_id_t *port_id); + static void remove_port(nxt_unit_t *unit, nxt_unit_port_t *port); static void quit_cb(nxt_unit_ctx_t *ctx); void quit(nxt_unit_ctx_t *ctx); |