diff options
author | Max Romanov <max.romanov@nginx.com> | 2021-10-28 17:46:52 +0300 |
---|---|---|
committer | Max Romanov <max.romanov@nginx.com> | 2021-10-28 17:46:52 +0300 |
commit | 803e0373029a80994a85781d0b73b6cfa95bcf5a (patch) | |
tree | 39a40729dfc648c471cb4e56e48f12c93073f4f1 | |
parent | 86138113eb9a9730dba3073fcb0ff6b242de0e72 (diff) | |
download | unit-803e0373029a80994a85781d0b73b6cfa95bcf5a.tar.gz unit-803e0373029a80994a85781d0b73b6cfa95bcf5a.tar.bz2 |
Python: creating and reusing asgi_add_reader() wrapper.
Diffstat (limited to '')
-rw-r--r-- | src/python/nxt_python_asgi.c | 83 |
1 files changed, 21 insertions, 62 deletions
diff --git a/src/python/nxt_python_asgi.c b/src/python/nxt_python_asgi.c index 26003805..8bf43d94 100644 --- a/src/python/nxt_python_asgi.c +++ b/src/python/nxt_python_asgi.c @@ -36,6 +36,7 @@ static PyObject *nxt_py_asgi_create_subprotocols(nxt_unit_field_t *f); static int nxt_python_asgi_ready(nxt_unit_ctx_t *ctx); static int nxt_py_asgi_add_port(nxt_unit_ctx_t *ctx, nxt_unit_port_t *port); +static int nxt_py_asgi_add_reader(nxt_unit_ctx_t *ctx, nxt_unit_port_t *port); static void nxt_py_asgi_remove_port(nxt_unit_t *lib, nxt_unit_port_t *port); static void nxt_py_asgi_quit(nxt_unit_ctx_t *ctx); static void nxt_py_asgi_shm_ack_handler(nxt_unit_ctx_t *ctx); @@ -365,7 +366,6 @@ nxt_python_asgi_run(nxt_unit_ctx_t *ctx) nxt_py_asgi_remove_reader(ctx, ctx_data->port); if (ctx_data->port != NULL) { - ctx_data->port->data = NULL; ctx_data->port = NULL; } @@ -894,10 +894,7 @@ fail: static int nxt_python_asgi_ready(nxt_unit_ctx_t *ctx) { - int rc; - PyObject *res, *fd, *py_ctx, *py_port; - nxt_unit_port_t *port; - nxt_py_asgi_ctx_data_t *ctx_data; + nxt_unit_port_t *port; if (nxt_slow_path(nxt_py_shared_port == NULL)) { return NXT_UNIT_ERROR; @@ -907,66 +904,14 @@ nxt_python_asgi_ready(nxt_unit_ctx_t *ctx) nxt_unit_debug(ctx, "asgi_ready %d %p %p", port->in_fd, ctx, port); - ctx_data = ctx->data; - - rc = NXT_UNIT_ERROR; - - fd = PyLong_FromLong(port->in_fd); - if (nxt_slow_path(fd == NULL)) { - nxt_unit_alert(ctx, "Python failed to create fd"); - nxt_python_print_exception(); - - return rc; - } - - py_ctx = PyLong_FromVoidPtr(ctx); - if (nxt_slow_path(py_ctx == NULL)) { - nxt_unit_alert(ctx, "Python failed to create py_ctx"); - nxt_python_print_exception(); - - goto clean_fd; - } - - py_port = PyLong_FromVoidPtr(port); - if (nxt_slow_path(py_port == NULL)) { - nxt_unit_alert(ctx, "Python failed to create py_port"); - nxt_python_print_exception(); - - goto clean_py_ctx; - } - - res = PyObject_CallFunctionObjArgs(ctx_data->loop_add_reader, - fd, nxt_py_port_read, - py_ctx, py_port, NULL); - if (nxt_slow_path(res == NULL)) { - nxt_unit_alert(ctx, "Python failed to add_reader"); - nxt_python_print_exception(); - - } else { - Py_DECREF(res); - - rc = NXT_UNIT_OK; - } - - Py_DECREF(py_port); - -clean_py_ctx: - - Py_DECREF(py_ctx); - -clean_fd: - - Py_DECREF(fd); - - return rc; + return nxt_py_asgi_add_reader(ctx, port); } static int nxt_py_asgi_add_port(nxt_unit_ctx_t *ctx, nxt_unit_port_t *port) { - int nb, rc; - PyObject *res, *fd, *py_ctx, *py_port; + int nb; nxt_py_asgi_ctx_data_t *ctx_data; if (port->in_fd == -1) { @@ -993,18 +938,32 @@ nxt_py_asgi_add_port(nxt_unit_ctx_t *ctx, nxt_unit_port_t *port) ctx_data = ctx->data; ctx_data->port = port; - port->data = ctx_data; - rc = NXT_UNIT_ERROR; + return nxt_py_asgi_add_reader(ctx, port); +} + + +static int +nxt_py_asgi_add_reader(nxt_unit_ctx_t *ctx, nxt_unit_port_t *port) +{ + int rc; + PyObject *res, *fd, *py_ctx, *py_port; + nxt_py_asgi_ctx_data_t *ctx_data; + + nxt_unit_debug(ctx, "asgi_add_reader %d %p %p", port->in_fd, ctx, port); + + ctx_data = ctx->data; fd = PyLong_FromLong(port->in_fd); if (nxt_slow_path(fd == NULL)) { nxt_unit_alert(ctx, "Python failed to create fd"); nxt_python_print_exception(); - return rc; + return NXT_UNIT_ERROR; } + rc = NXT_UNIT_ERROR; + py_ctx = PyLong_FromVoidPtr(ctx); if (nxt_slow_path(py_ctx == NULL)) { nxt_unit_alert(ctx, "Python failed to create py_ctx"); |