diff options
author | Max Romanov <max.romanov@nginx.com> | 2017-07-12 20:32:16 +0300 |
---|---|---|
committer | Max Romanov <max.romanov@nginx.com> | 2017-07-12 20:32:16 +0300 |
commit | b0c1e740cf404f8fed5eed75fddb205ca74314e0 (patch) | |
tree | 08dcefc827c5dfb1570b682ea8d1e9abf17a31dc /src/nxt_python_wsgi.c | |
parent | c38bcb7d70729434893ae4d5f2f58a78a36d2bd5 (diff) | |
download | unit-b0c1e740cf404f8fed5eed75fddb205ca74314e0.tar.gz unit-b0c1e740cf404f8fed5eed75fddb205ca74314e0.tar.bz2 |
New process port exchange changed. READY message type introduced.
Application process start request DATA message from router to master.
Master notifies router via NEW_PORT message after worker process become ready.
Diffstat (limited to 'src/nxt_python_wsgi.c')
-rw-r--r-- | src/nxt_python_wsgi.c | 115 |
1 files changed, 44 insertions, 71 deletions
diff --git a/src/nxt_python_wsgi.c b/src/nxt_python_wsgi.c index cf3858a5..aabdc0a1 100644 --- a/src/nxt_python_wsgi.c +++ b/src/nxt_python_wsgi.c @@ -58,7 +58,7 @@ typedef struct { } nxt_py_error_t; -static nxt_int_t nxt_python_init(nxt_task_t *task); +static nxt_int_t nxt_python_init(nxt_task_t *task, nxt_common_app_conf_t *conf); static nxt_int_t nxt_python_prepare_msg(nxt_task_t *task, nxt_app_request_t *r, nxt_app_wmsg_t *msg); @@ -167,8 +167,6 @@ static PyTypeObject nxt_py_input_type = { }; -static char *nxt_py_module; - static PyObject *nxt_py_application; static PyObject *nxt_py_start_resp_obj; static PyObject *nxt_py_environ_ptyp; @@ -181,94 +179,67 @@ static nxt_python_run_ctx_t *nxt_python_run_ctx; nxt_int_t nxt_python_wsgi_init(nxt_thread_t *thr, nxt_runtime_t *rt) { - char **argv; - char *p; - - argv = nxt_process_argv; - - while (*argv != NULL) { - p = *argv++; - - if (nxt_strcmp(p, "--py-module") == 0) { - if (*argv == NULL) { - nxt_log_emerg(thr->log, - "no argument for option \"--py-module\""); - return NXT_ERROR; - } - - nxt_py_module = *argv++; - - nxt_log_error(NXT_LOG_INFO, thr->log, "python module: \"%s\"", - nxt_py_module); - - break; - } - } + nxt_app_modules[NXT_APP_PYTHON] = &nxt_python_module; - if (nxt_py_module == NULL) { - return NXT_OK; - } +#if PY_MAJOR_VERSION == 2 + nxt_app_modules[NXT_APP_PYTHON2] = &nxt_python_module; +#endif - nxt_app = &nxt_python_module; +#if PY_MAJOR_VERSION == 3 + nxt_app_modules[NXT_APP_PYTHON3] = &nxt_python_module; +#endif return NXT_OK; } static nxt_int_t -nxt_python_init(nxt_task_t *task) +nxt_python_init(nxt_task_t *task, nxt_common_app_conf_t *conf) { - char **argv; - char *p, *dir; - PyObject *obj, *pypath, *module; + char *nxt_py_module; + PyObject *obj, *pypath, *module; + nxt_python_app_conf_t *c; + c = &conf->u.python; + + if (c->module.length == 0) { + nxt_log_emerg(task->log, "python module is empty"); + return NXT_ERROR; + } Py_InitializeEx(0); obj = NULL; module = NULL; - argv = nxt_process_argv; - while (*argv != NULL) { - p = *argv++; + if (c->path.length > 0) { + obj = PyString_FromStringAndSize((char *) c->path.start, + c->path.length); - if (nxt_strcmp(p, "--py-path") == 0) { - if (*argv == NULL) { - nxt_log_emerg(task->log, "no argument for option \"--py-path\""); - goto fail; - } - - dir = *argv++; - - nxt_log_error(NXT_LOG_INFO, task->log, "python path \"%s\"", dir); - - obj = PyString_FromString((char *) dir); - - if (nxt_slow_path(obj == NULL)) { - nxt_log_alert(task->log, - "Python failed create string object \"%s\"", dir); - goto fail; - } - - pypath = PySys_GetObject((char *) "path"); - - if (nxt_slow_path(pypath == NULL)) { - nxt_log_alert(task->log, - "Python failed to get \"sys.path\" list"); - goto fail; - } + if (nxt_slow_path(obj == NULL)) { + nxt_log_alert(task->log, + "Python failed create string object \"%V\"", + &c->path); + goto fail; + } - if (nxt_slow_path(PyList_Insert(pypath, 0, obj) != 0)) { - nxt_log_alert(task->log, - "Python failed to insert \"%s\" into \"sys.path\"", dir); - goto fail; - } + pypath = PySys_GetObject((char *) "path"); - Py_DECREF(obj); - obj = NULL; + if (nxt_slow_path(pypath == NULL)) { + nxt_log_alert(task->log, + "Python failed to get \"sys.path\" list"); + goto fail; + } - continue; + if (nxt_slow_path(PyList_Insert(pypath, 0, obj) != 0)) { + nxt_log_alert(task->log, + "Python failed to insert \"%V\" into \"sys.path\"", + &c->path); + goto fail; } + + Py_DECREF(obj); + obj = NULL; } obj = PyCFunction_New(nxt_py_start_resp_method, NULL); @@ -303,7 +274,9 @@ nxt_python_init(nxt_task_t *task) Py_DECREF(obj); - // PyOS_AfterFork(); + nxt_py_module = nxt_alloca(c->module.length + 1); + nxt_memcpy(nxt_py_module, c->module.start, c->module.length); + nxt_py_module[c->module.length] = '\0'; module = PyImport_ImportModule(nxt_py_module); |