diff --git a/plugins/erlang/erlang.c b/plugins/erlang/erlang.c index 7404be46..135a88c9 100644 --- a/plugins/erlang/erlang.c +++ b/plugins/erlang/erlang.c @@ -95,7 +95,7 @@ void uwsgi_erlang_rpc(int fd, erlang_pid *from, ei_x_buff *x) { char buffer[0xffff]; char *argv[0xff] ; - int argc; + int argc = 0; uint16_t ret; ei_x_buff xr; @@ -103,19 +103,20 @@ void uwsgi_erlang_rpc(int fd, erlang_pid *from, ei_x_buff *x) { ei_get_type(x->buff, &x->index, &etype, &esize); +#ifdef UWSGI_DEBUG uwsgi_log("%d %c %c %c\n", etype, etype, ERL_SMALL_TUPLE_EXT, ERL_LARGE_TUPLE_EXT); +#endif if (etype != ERL_SMALL_TUPLE_EXT && etype != ERL_LARGE_TUPLE_EXT) return; - uwsgi_log("decode tuple\n"); ei_decode_tuple_header(x->buff, &x->index, &arity); +#ifdef UWSGI_DEBUG uwsgi_log("rpc arity %d\n", arity); +#endif if (arity != 3) return ; ei_get_type(x->buff, &x->index, &etype, &esize); - uwsgi_log("%d %c\n", etype, etype); - if (etype != ERL_ATOM_EXT && etype != ERL_STRING_EXT) return ; gen_call = uwsgi_malloc(esize); @@ -127,7 +128,9 @@ void uwsgi_erlang_rpc(int fd, erlang_pid *from, ei_x_buff *x) { ei_decode_string(x->buff, &x->index, gen_call); } +#ifdef UWSGI_DEBUG uwsgi_log("gen call = %s\n", gen_call); +#endif ei_get_type(x->buff, &x->index, &etype, &esize); @@ -138,13 +141,10 @@ void uwsgi_erlang_rpc(int fd, erlang_pid *from, ei_x_buff *x) { ei_get_type(x->buff, &x->index, &etype, &esize); ei_skip_term(x->buff, &x->index); - uwsgi_log("skip0 %d %c\n", etype, etype); ei_get_type(x->buff, &x->index, &etype, &esize); - uwsgi_log("skip1 %d %c\n", etype, etype); ei_decode_ref(x->buff, &x->index, &eref); ei_get_type(x->buff, &x->index, &etype, &esize); - uwsgi_log("%d %c\n", etype, etype); module = uwsgi_malloc(esize); @@ -157,17 +157,16 @@ void uwsgi_erlang_rpc(int fd, erlang_pid *from, ei_x_buff *x) { ei_get_type(x->buff, &x->index, &etype, &esize); - uwsgi_log("%d %c\n", etype, etype); - if (etype != ERL_SMALL_TUPLE_EXT) return ; ei_decode_tuple_header(x->buff, &x->index, &arity); +#ifdef UWSGI_DEBUG uwsgi_log("arity: %d\n", arity); +#endif if (arity != 5) return ; ei_get_type(x->buff, &x->index, &etype, &esize); - uwsgi_log("%d %c\n", etype, etype); char *method = uwsgi_malloc(esize); @@ -181,7 +180,6 @@ void uwsgi_erlang_rpc(int fd, erlang_pid *from, ei_x_buff *x) { if (strcmp(method, "call")) return; ei_get_type(x->buff, &x->index, &etype, &esize); - uwsgi_log("%d %c\n", etype, etype); if (etype != ERL_ATOM_EXT && etype != ERL_STRING_EXT) return ; @@ -207,7 +205,9 @@ void uwsgi_erlang_rpc(int fd, erlang_pid *from, ei_x_buff *x) { ei_decode_string(x->buff, &x->index, call); } +#ifdef UWSGI_DEBUG uwsgi_log("RPC %s %s\n", module, call); +#endif ei_get_type(x->buff, &x->index, &etype, &esize); @@ -224,7 +224,9 @@ void uwsgi_erlang_rpc(int fd, erlang_pid *from, ei_x_buff *x) { ret = uwsgi_rpc(call, argc, argv, buffer); +#ifdef UWSGI_DEBUG uwsgi_log("buffer: %.*s\n", ret, buffer); +#endif ei_x_new_with_version(&xr); @@ -247,7 +249,6 @@ void erlang_loop() { int fd; int eversion; - int i; ei_x_buff x, xr; @@ -286,7 +287,7 @@ void erlang_loop() { if (em.msgtype == ERL_TICK) continue; - uwsgi_log("[erlang] message From: '%s' To: '%s' RegName: %s\n", em.from.node, em.to.node, em.toname); + uwsgi_log("[erlang] message From: %s To (process): %s\n", em.from.node, em.toname); @@ -300,20 +301,18 @@ void erlang_loop() { uwsgi_erlang_rpc(fd, &em.from, &x); } else { - int uep = -1; - for(i=0;iname, em.toname)) { + if (uep->plugin) { + uep->plugin(uep->func, &x); + } break; } + uep = uep->next; } - if (uep > -1) { - if (uerl.uep[uep].plugin) { - uerl.uep[uep].plugin( uerl.uep[uep].func, &x ); - } - } - else { + if (!uep) { uwsgi_log("!!! unregistered erlang process requested, dumping it !!!\n"); dump_eterm(&x); } @@ -425,6 +424,7 @@ int erlang_init() { uwsgi_log("unable to register the erlang gateway\n"); exit(1); } + } return 0; diff --git a/plugins/erlang/erlang.h b/plugins/erlang/erlang.h index 25f6efbe..fc7fe783 100644 --- a/plugins/erlang/erlang.h +++ b/plugins/erlang/erlang.h @@ -1,7 +1,5 @@ #include -#define MAX_UWSGI_ERLANG_PROCESSES 64 - #define LONG_ARGS_ERLANG 17012 #define LONG_ARGS_ERLANG_COOKIE 17013 @@ -12,6 +10,8 @@ struct uwsgi_erlang_process { char name[0xff]; void (*plugin)(void *, ei_x_buff *); void *func; + + struct uwsgi_erlang_process *next; }; struct uwsgi_erlang { @@ -24,7 +24,6 @@ struct uwsgi_erlang { void *lock; - struct uwsgi_erlang_process uep[MAX_UWSGI_ERLANG_PROCESSES]; - int uep_cnt; + struct uwsgi_erlang_process *uep; }; diff --git a/plugins/pyerl/pyerl.c b/plugins/pyerl/pyerl.c index d6848ea2..a335f035 100644 --- a/plugins/pyerl/pyerl.c +++ b/plugins/pyerl/pyerl.c @@ -304,7 +304,7 @@ void pyerl_call_registered(void *func, ei_x_buff *x) { PyTuple_SetItem(pyargs, 0, erl_to_py(x)); - python_call((PyObject *) func, pyargs, 0, 0); + python_call((PyObject *) func, pyargs, 0, NULL); } PyObject *pyerl_register_process(PyObject * self, PyObject * args) { @@ -316,17 +316,30 @@ PyObject *pyerl_register_process(PyObject * self, PyObject * args) { return NULL; } - if (uerl.uep_cnt >= MAX_UWSGI_ERLANG_PROCESSES) - return PyErr_Format(PyExc_ValueError, "You can define max %d erlang registered processes", MAX_UWSGI_ERLANG_PROCESSES); - if (strlen(name) > 0xff-1) return PyErr_Format(PyExc_ValueError, "Invalid erlang process name"); - strcpy(uerl.uep[uerl.uep_cnt].name, name); - uerl.uep[uerl.uep_cnt].plugin = pyerl_call_registered; - uerl.uep[uerl.uep_cnt].func = callable; + struct uwsgi_erlang_process *uep = uerl.uep, *old_uep; + + if (!uep) { + uerl.uep = uwsgi_malloc(sizeof(struct uwsgi_erlang_process)); + uep = uerl.uep; + } + else { + while(uep) { + old_uep = uep; + uep = uep->next; + } + + uep = uwsgi_malloc(sizeof(struct uwsgi_erlang_process)); + old_uep->next = uep; + } + + strcpy(uep->name, name); + uep->plugin = pyerl_call_registered; + uep->func = callable; + uep->next = NULL; - uerl.uep_cnt++; Py_INCREF(Py_None); return Py_None; diff --git a/plugins/python/python_plugin.c b/plugins/python/python_plugin.c index d142cf3f..48c56996 100644 --- a/plugins/python/python_plugin.c +++ b/plugins/python/python_plugin.c @@ -1243,6 +1243,8 @@ clear: uint16_t uwsgi_python_rpc(void *func, uint8_t argc, char **argv, char *buffer) { + UWSGI_GET_GIL; + uint8_t i; PyObject *pyargs = PyTuple_New(argc); PyObject *ret; @@ -1265,6 +1267,7 @@ uint16_t uwsgi_python_rpc(void *func, uint8_t argc, char **argv, char *buffer) { if (rl <= 0xffff) { memcpy(buffer, rv, rl); Py_DECREF(ret); + UWSGI_RELEASE_GIL; return rl; } } @@ -1273,6 +1276,7 @@ uint16_t uwsgi_python_rpc(void *func, uint8_t argc, char **argv, char *buffer) { if (PyErr_Occurred()) PyErr_Print(); + UWSGI_RELEASE_GIL; return 0;