diff --git a/buildconf/pyuwsgi.ini b/buildconf/pyuwsgi.ini new file mode 100644 index 00000000..8ebf335d --- /dev/null +++ b/buildconf/pyuwsgi.ini @@ -0,0 +1,5 @@ +[uwsgi] +inherit = default +bin_name = pyuwsgi.so +embedded_plugins = +,pyuwsgi +as_shared_library = true diff --git a/master.c b/master.c index 97ed4dbc..52779aad 100644 --- a/master.c +++ b/master.c @@ -238,7 +238,7 @@ void manage_cluster_announce(char *key, uint16_t keylen, char *val, uint16_t val } } -void master_loop(char **argv, char **environ) { +int master_loop(char **argv, char **environ) { uint64_t tmp_counter; @@ -528,7 +528,7 @@ void master_loop(char **argv, char **environ) { else if (uwsgi.to_heaven) { ready_to_reload++;} else if (uwsgi.to_outworld) { uwsgi.lazy_respawned++; - if (uwsgi_respawn_worker(i)) return; + if (uwsgi_respawn_worker(i)) return 0; } } else { @@ -541,7 +541,7 @@ void master_loop(char **argv, char **environ) { } if (uwsgi.respawn_workers) { for(i=1;i<=uwsgi.numproc;i++) { - if (uwsgi_respawn_worker(i)) return; + if (uwsgi_respawn_worker(i)) return 0; } uwsgi.respawn_workers = 0; @@ -625,6 +625,9 @@ void master_loop(char **argv, char **environ) { } } +#ifdef UWSGI_AS_SHARED_LIBRARY + return -1; +#else uwsgi_log( "running %s\n", uwsgi.binary_path); argv[0] = uwsgi.binary_path; //strcpy (argv[0], uwsgi.binary_path); @@ -632,6 +635,7 @@ void master_loop(char **argv, char **environ) { uwsgi_error("execvp()"); // never here exit(1); +#endif } if (!uwsgi.cheap) { @@ -855,7 +859,7 @@ void master_loop(char **argv, char **environ) { uwsgi.cheap = 0; uwsgi_del_sockets_from_queue(uwsgi.master_queue); for(i=1;i<=uwsgi.numproc;i++) { - if (uwsgi_respawn_worker(i)) return; + if (uwsgi_respawn_worker(i)) return 0; } break; } @@ -1373,7 +1377,7 @@ void master_loop(char **argv, char **environ) { continue; } */ - if (uwsgi_respawn_worker(uwsgi.mywid)) return; + if (uwsgi_respawn_worker(uwsgi.mywid)) return 0; } } diff --git a/plugins/pyuwsgi/pyuwsgi.c b/plugins/pyuwsgi/pyuwsgi.c new file mode 100644 index 00000000..02a03329 --- /dev/null +++ b/plugins/pyuwsgi/pyuwsgi.c @@ -0,0 +1,75 @@ +#include "../python/uwsgi_python.h" + +extern struct uwsgi_server uwsgi; +extern struct uwsgi_python up; + +extern char **environ; + +PyObject *u_run(PyObject *self, PyObject *args) { + + char **argv; + size_t size = 2; + int i; + + if (PyTuple_Size(args) < 1) { + return PyErr_Format(PyExc_ValueError, "you have to specify at least one uWSGI option to run() it"); + } + + PyObject *the_arg = PyTuple_GetItem(args, 0); + + if (PyList_Check(the_arg)) { + size = PyList_Size(the_arg) + 2; + } + else if (PyTuple_Check(the_arg)) { + size = PyTuple_Size(the_arg) + 2; + } + else if (PyString_Check(the_arg)) { + size = 3; + } + + argv = uwsgi_malloc(sizeof(char *) * size); + memset(argv, 0, sizeof(char *) * size); + + // will be overwritten + argv[0] = "uwsgi"; + + if (PyList_Check(the_arg)) { + for(i=0;i +char **environ; +#else extern char **environ; +#endif static char *short_options = NULL; @@ -803,6 +808,12 @@ void signal_pidfile(int sig, char *filename) { #ifdef UWSGI_AS_SHARED_LIBRARY int uwsgi_init(int argc, char *argv[], char *envp[]) { + +#ifdef __APPLE__ + char*** envPtr = _NSGetEnviron(); + environ = *envPtr; +#endif + #else int main(int argc, char *argv[], char *envp[]) { #endif @@ -2265,7 +2276,14 @@ skipzero: if (getpid() == masterpid && uwsgi.master_process == 1) { - master_loop(argv, environ); +#ifdef UWSGI_AS_SHARED_LIBRARY + int ml_ret = master_loop(argv, environ); + if (ml_ret == -1) { + return 0; + } +#else + (void) master_loop(argv, environ); +#endif //from now on the process is a real worker } diff --git a/uwsgi.h b/uwsgi.h index ee3ef321..522103af 100644 --- a/uwsgi.h +++ b/uwsgi.h @@ -1712,7 +1712,7 @@ char *uwsgi_concat4n(char *, int, char *, int, char *, int, char *, int); int uwsgi_get_app_id(char *, int, int); char *uwsgi_strncopy(char *, int); -void master_loop(char **, char **); +int master_loop(char **, char **); int find_worker_id(pid_t);