Python: ASGI: Factor out event loop creation to its own function.
This is a preparatory patch that factors out the asyncio event loop creation code from nxt_python_asgi_ctx_data_alloc() into its own function, to facilitate being called multiple times. This a part of the work to move away from using the asyncio.get_event_loop() function due to it no longer creating event loops if there wasn't one running. See the following commit for the gory details. Reviewed-by: Alejandro Colomar <alx@nginx.com> Signed-off-by: Andrew Clayton <a.clayton@nginx.com>
This commit is contained in:
@@ -17,6 +17,8 @@
|
|||||||
|
|
||||||
|
|
||||||
static PyObject *nxt_python_asgi_get_func(PyObject *obj);
|
static PyObject *nxt_python_asgi_get_func(PyObject *obj);
|
||||||
|
static PyObject *nxt_python_asgi_get_event_loop(PyObject *asyncio,
|
||||||
|
const char *event_loop_func);
|
||||||
static int nxt_python_asgi_ctx_data_alloc(void **pdata, int main);
|
static int nxt_python_asgi_ctx_data_alloc(void **pdata, int main);
|
||||||
static void nxt_python_asgi_ctx_data_free(void *data);
|
static void nxt_python_asgi_ctx_data_free(void *data);
|
||||||
static int nxt_python_asgi_startup(void *data);
|
static int nxt_python_asgi_startup(void *data);
|
||||||
@@ -201,11 +203,41 @@ nxt_python_asgi_init(nxt_unit_init_t *init, nxt_python_proto_t *proto)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
nxt_python_asgi_get_event_loop(PyObject *asyncio, const char *event_loop_func)
|
||||||
|
{
|
||||||
|
PyObject *event_loop, *loop;
|
||||||
|
|
||||||
|
event_loop = PyDict_GetItemString(PyModule_GetDict(asyncio),
|
||||||
|
event_loop_func);
|
||||||
|
if (nxt_slow_path(event_loop == NULL)) {
|
||||||
|
nxt_unit_alert(NULL, "Python failed to get '%s' from module 'asyncio'",
|
||||||
|
event_loop_func);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nxt_slow_path(PyCallable_Check(event_loop) == 0)) {
|
||||||
|
nxt_unit_alert(NULL, "'asyncio.%s' is not a callable object",
|
||||||
|
event_loop_func);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
loop = PyObject_CallObject(event_loop, NULL);
|
||||||
|
if (nxt_slow_path(loop == NULL)) {
|
||||||
|
nxt_unit_alert(NULL, "Python failed to call 'asyncio.%s'",
|
||||||
|
event_loop_func);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return loop;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
nxt_python_asgi_ctx_data_alloc(void **pdata, int main)
|
nxt_python_asgi_ctx_data_alloc(void **pdata, int main)
|
||||||
{
|
{
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
PyObject *asyncio, *loop, *event_loop, *obj;
|
PyObject *asyncio, *loop, *obj;
|
||||||
const char *event_loop_func;
|
const char *event_loop_func;
|
||||||
nxt_py_asgi_ctx_data_t *ctx_data;
|
nxt_py_asgi_ctx_data_t *ctx_data;
|
||||||
|
|
||||||
@@ -243,26 +275,8 @@ nxt_python_asgi_ctx_data_alloc(void **pdata, int main)
|
|||||||
|
|
||||||
event_loop_func = main ? "get_event_loop" : "new_event_loop";
|
event_loop_func = main ? "get_event_loop" : "new_event_loop";
|
||||||
|
|
||||||
event_loop = PyDict_GetItemString(PyModule_GetDict(asyncio),
|
loop = nxt_python_asgi_get_event_loop(asyncio, event_loop_func);
|
||||||
event_loop_func);
|
if (loop == NULL) {
|
||||||
if (nxt_slow_path(event_loop == NULL)) {
|
|
||||||
nxt_unit_alert(NULL,
|
|
||||||
"Python failed to get '%s' from module 'asyncio'",
|
|
||||||
event_loop_func);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nxt_slow_path(PyCallable_Check(event_loop) == 0)) {
|
|
||||||
nxt_unit_alert(NULL,
|
|
||||||
"'asyncio.%s' is not a callable object",
|
|
||||||
event_loop_func);
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
loop = PyObject_CallObject(event_loop, NULL);
|
|
||||||
if (nxt_slow_path(loop == NULL)) {
|
|
||||||
nxt_unit_alert(NULL, "Python failed to call 'asyncio.%s'",
|
|
||||||
event_loop_func);
|
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user