diff --git a/awslambdaric/runtime_client.cpp b/awslambdaric/runtime_client.cpp index 4650b9a..66252bf 100644 --- a/awslambdaric/runtime_client.cpp +++ b/awslambdaric/runtime_client.cpp @@ -25,18 +25,25 @@ static PyObject *method_initialize_client(PyObject *self, PyObject *args) { } static PyObject *method_next(PyObject *self) { - if (CLIENT == nullptr) { - PyErr_SetString(PyExc_RuntimeError, "Client not yet initalized"); - return NULL; - } + aws::lambda_runtime::invocation_request response; + + // Release GIL and save thread state + // ref: https://docs.python.org/3/c-api/init.html#thread-state-and-the-global-interpreter-lock + PyThreadState *_save; + _save = PyEval_SaveThread(); auto outcome = CLIENT->get_next(); if (!outcome.is_success()) { + // Reacquire GIL before exiting + PyEval_RestoreThread(_save); PyErr_SetString(PyExc_RuntimeError, "Failed to get next"); return NULL; } - auto response = outcome.get_result(); + response = outcome.get_result(); + // Reacquire GIL before constructing return object + PyEval_RestoreThread(_save); + auto payload = response.payload; auto request_id = response.request_id.c_str(); auto trace_id = response.xray_trace_id.c_str(); diff --git a/setup.py b/setup.py index 8aa17a1..5151dcc 100644 --- a/setup.py +++ b/setup.py @@ -32,7 +32,7 @@ def get_curl_extra_linker_flags(): def get_runtime_client_extension(): if platform.system() != "Linux" and os.getenv("BUILD") != "true": print( - "The native runtime_client only builds in Linux. Skiping its compilation." + "The native runtime_client only builds on Linux. Skipping its compilation." ) return []