From 26386909defca2f92ae67c362470a5dbd4bdbd1e Mon Sep 17 00:00:00 2001 From: Unbit Date: Mon, 11 Nov 2013 13:00:20 +0100 Subject: [PATCH] first attempt of moving rpc output from 16 to 64 bit --- buildconf/all.ini | 2 +- core/rpc.c | 15 ++++++++------- plugins/jvm/jvm_plugin.c | 7 ++++--- plugins/lua/lua_plugin.c | 5 +++-- plugins/php/php_plugin.c | 2 +- plugins/psgi/psgi_plugin.c | 8 +++++--- plugins/psgi/uwsgi_plmodule.c | 2 +- plugins/pypy/pypy_plugin.c | 4 ++-- plugins/pypy/pypy_setup.py | 11 +++++++---- plugins/python/python_plugin.c | 5 +++-- plugins/python/uwsgi_pymodule.c | 4 ++-- plugins/rack/rack_api.c | 2 +- plugins/rack/rack_plugin.c | 5 +++-- plugins/rpc/rpc_plugin.c | 18 +++++++++--------- plugins/symcall/symcall_plugin.c | 4 ++-- plugins/v8/plugin.c | 2 +- plugins/v8/v8_uwsgi.cc | 7 +++++-- uwsgi.h | 6 +++--- 18 files changed, 61 insertions(+), 48 deletions(-) diff --git a/buildconf/all.ini b/buildconf/all.ini index ad269d99..2bc1029c 100644 --- a/buildconf/all.ini +++ b/buildconf/all.ini @@ -1,3 +1,3 @@ [uwsgi] -main_plugin = python,gevent,psgi,lua,php,rack,jvm,jwsgi,ring,mono,transformation_toupper,coroae,v8,cgi,xslt,webdav,ssi,ldap,gccgo,rados +main_plugin = python,gevent,psgi,lua,php,rack,jvm,jwsgi,ring,mono,transformation_toupper,coroae,v8,cgi,xslt,webdav,ssi,ldap,gccgo,rados,pypy inherit = base diff --git a/core/rpc.c b/core/rpc.c index 7aaf2d4c..6802a819 100644 --- a/core/rpc.c +++ b/core/rpc.c @@ -59,11 +59,11 @@ already: return ret; } -uint16_t uwsgi_rpc(char *name, uint8_t argc, char *argv[], uint16_t argvs[], char *output) { +uint64_t uwsgi_rpc(char *name, uint8_t argc, char *argv[], uint16_t argvs[], char **output) { struct uwsgi_rpc *urpc = NULL; uint64_t i; - uint16_t ret = 0; + uint64_t ret = 0; int pos = (uwsgi.mywid * uwsgi.rpc_max); @@ -86,7 +86,7 @@ uint16_t uwsgi_rpc(char *name, uint8_t argc, char *argv[], uint16_t argvs[], cha } -char *uwsgi_do_rpc(char *node, char *func, uint8_t argc, char *argv[], uint16_t argvs[], uint16_t * len) { +char *uwsgi_do_rpc(char *node, char *func, uint8_t argc, char *argv[], uint16_t argvs[], uint64_t * len) { uint8_t i; uint16_t ulen; @@ -97,9 +97,10 @@ char *uwsgi_do_rpc(char *node, char *func, uint8_t argc, char *argv[], uint16_t if (node == NULL || !strcmp(node, "")) { // allocate the whole buffer - buffer = uwsgi_malloc(UMAX16); - *len = uwsgi_rpc(func, argc, argv, argvs, buffer); - return buffer; + *len = uwsgi_rpc(func, argc, argv, argvs, &buffer); + if (*buffer) + return buffer; + return NULL; } @@ -147,7 +148,7 @@ char *uwsgi_do_rpc(char *node, char *func, uint8_t argc, char *argv[], uint16_t bufptr += ulen; } - // ok the reuqest is ready, let's send it in non blocking way + // ok the request is ready, let's send it in non blocking way if (uwsgi_write_true_nb(fd, buffer, buffer_size+4, uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT])) { goto error; } diff --git a/plugins/jvm/jvm_plugin.c b/plugins/jvm/jvm_plugin.c index a6d57bd2..1ebcdc9f 100644 --- a/plugins/jvm/jvm_plugin.c +++ b/plugins/jvm/jvm_plugin.c @@ -127,7 +127,7 @@ JNIEXPORT jobject JNICALL uwsgi_jvm_api_rpc(JNIEnv *env, jclass c, jobject j_arg char *argv[256]; uint16_t argvs[256]; jobject argvj[256]; - uint16_t size = 0; + uint64_t size = 0; size_t args = uwsgi_jvm_array_len(j_args); if (args < 2) return NULL; @@ -1277,7 +1277,7 @@ void uwsgi_jvm_release_bytearray(jobject o, char *str) { (*ujvm_env)->ReleaseByteArrayElements(ujvm_env, o, (jbyte *)str, 0); } -static uint16_t uwsgi_jvm_rpc(void *func, uint8_t argc, char **argv, uint16_t argvs[], char *buffer) { +static uint64_t uwsgi_jvm_rpc(void *func, uint8_t argc, char **argv, uint16_t argvs[], char **buffer) { jvalue args[1]; jobject str_array = (*ujvm_env)->NewObjectArray(ujvm_env, argc, ujvm.str_class, NULL); if (!str_array) return 0; @@ -1294,7 +1294,8 @@ static uint16_t uwsgi_jvm_rpc(void *func, uint8_t argc, char **argv, uint16_t ar return 0; } size_t rlen = uwsgi_jvm_strlen(ret); - if (rlen <= 0xffff) { + if (rlen > 0) { + *buffer = uwsgi_malloc(rlen); char *b = uwsgi_jvm_str2c(ret); memcpy(buffer, b, rlen); uwsgi_jvm_release_chars(ret, b); diff --git a/plugins/lua/lua_plugin.c b/plugins/lua/lua_plugin.c index ff9256e1..e4c38aba 100644 --- a/plugins/lua/lua_plugin.c +++ b/plugins/lua/lua_plugin.c @@ -670,7 +670,7 @@ static int uwsgi_lua_signal_handler(uint8_t sig, void *handler) { } -static uint16_t uwsgi_lua_rpc(void * func, uint8_t argc, char **argv, uint16_t argvs[], char *buffer) { +static uint64_t uwsgi_lua_rpc(void * func, uint8_t argc, char **argv, uint16_t argvs[], char **buffer) { uint8_t i; const char *sv; @@ -702,7 +702,8 @@ static uint16_t uwsgi_lua_rpc(void * func, uint8_t argc, char **argv, uint16_t a #ifdef UWSGI_DEBUG uwsgi_log("sv = %s sl = %lu\n", sv, (unsigned long) sl); #endif - if (sl <= 0xffff) { + if (sl > 0) { + *buffer = uwsgi_malloc(sl); memcpy(buffer, sv, sl); lua_pop(L, 1); return sl; diff --git a/plugins/php/php_plugin.c b/plugins/php/php_plugin.c index d42261f6..16740b24 100644 --- a/plugins/php/php_plugin.c +++ b/plugins/php/php_plugin.c @@ -374,7 +374,7 @@ PHP_FUNCTION(uwsgi_rpc) { zval *z_current_obj; char *argv[256]; uint16_t argvs[256]; - uint16_t size = 0; + uint64_t size = 0; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "+", &varargs, &num_args) == FAILURE) { RETURN_NULL(); diff --git a/plugins/psgi/psgi_plugin.c b/plugins/psgi/psgi_plugin.c index 4cd729d6..612d8d14 100644 --- a/plugins/psgi/psgi_plugin.c +++ b/plugins/psgi/psgi_plugin.c @@ -798,10 +798,10 @@ realstuff: } } -static uint16_t uwsgi_perl_rpc(void *func, uint8_t argc, char **argv, uint16_t argvs[], char *buffer) { +static uint64_t uwsgi_perl_rpc(void *func, uint8_t argc, char **argv, uint16_t argvs[], char **buffer) { int i; - uint16_t ret = 0; + uint64_t ret = 0; dSP; ENTER; @@ -822,7 +822,9 @@ static uint16_t uwsgi_perl_rpc(void *func, uint8_t argc, char **argv, uint16_t a STRLEN rlen; SV *response = POPs; char *value = SvPV(response, rlen ); - ret = UMIN(UMAX16-1, rlen); + if (rlen > 0) { + *buffer = uwsgi_malloc(rlen); + } memcpy(buffer, value, ret); } diff --git a/plugins/psgi/uwsgi_plmodule.c b/plugins/psgi/uwsgi_plmodule.c index 1f6ceb2b..9fa28f39 100644 --- a/plugins/psgi/uwsgi_plmodule.c +++ b/plugins/psgi/uwsgi_plmodule.c @@ -324,7 +324,7 @@ XS(XS_call) { dXSARGS; char *func; - uint16_t size = 0; + uint64_t size = 0; int i; char *argv[256]; uint16_t argvs[256]; diff --git a/plugins/pypy/pypy_plugin.c b/plugins/pypy/pypy_plugin.c index 07b93720..1afd4ab1 100644 --- a/plugins/pypy/pypy_plugin.c +++ b/plugins/pypy/pypy_plugin.c @@ -274,10 +274,10 @@ static int uwsgi_pypy_signal_handler(uint8_t sig, void *handler) { return 0; } -static uint16_t uwsgi_pypy_rpc(void *func, uint8_t argc, char **argv, uint16_t argvs[], char *buffer) { +static uint64_t uwsgi_pypy_rpc(void *func, uint8_t argc, char **argv, uint16_t argvs[], char **buffer) { int iargvs[UMAX8]; int i; - int (*pypy_func)(int, char **, int*, char *) = (int (*)(int, char **, int*, char *)) func; + int (*pypy_func)(int, char **, int*, char **) = (int (*)(int, char **, int*, char **)) func; // we convert 16bit to int for(i=0;i 0 and len(response) <= 65535: - dst = ffi.buffer(buf, 65536) + if len(response) > 0: + buf[0] = lib.uwsgi_malloc(len(reponse)) + dst = ffi.buffer(buf[0], len(reponse)) dst[:len(response)] = response return len(response) @@ -508,7 +511,7 @@ def uwsgi_pypy_rpc(node, func, *args): argc = 0 argv = ffi.new('char*[256]') argvs = ffi.new('uint16_t[256]') - rsize = ffi.new('uint16_t*') + rsize = ffi.new('uint64_t*') for arg in args: if argc >= 255: diff --git a/plugins/python/python_plugin.c b/plugins/python/python_plugin.c index 788a52dd..2dc1962e 100644 --- a/plugins/python/python_plugin.c +++ b/plugins/python/python_plugin.c @@ -1522,7 +1522,7 @@ clear: return -1; } -uint16_t uwsgi_python_rpc(void *func, uint8_t argc, char **argv, uint16_t argvs[], char *buffer) { +uint64_t uwsgi_python_rpc(void *func, uint8_t argc, char **argv, uint16_t argvs[], char **buffer) { UWSGI_GET_GIL; @@ -1546,7 +1546,8 @@ uint16_t uwsgi_python_rpc(void *func, uint8_t argc, char **argv, uint16_t argvs[ if (PyString_Check(ret)) { rv = PyString_AsString(ret); rl = PyString_Size(ret); - if (rl <= 65536) { + if (rl > 0) { + *buffer = uwsgi_malloc(rl); memcpy(buffer, rv, rl); Py_DECREF(ret); UWSGI_RELEASE_GIL; diff --git a/plugins/python/uwsgi_pymodule.c b/plugins/python/uwsgi_pymodule.c index 3cb43696..c336b4e8 100644 --- a/plugins/python/uwsgi_pymodule.c +++ b/plugins/python/uwsgi_pymodule.c @@ -265,7 +265,7 @@ PyObject *py_uwsgi_add_file_monitor(PyObject * self, PyObject * args) { PyObject *py_uwsgi_call(PyObject * self, PyObject * args) { char *func; - uint16_t size = 0; + uint64_t size = 0; PyObject *py_func; int argc = PyTuple_Size(args); int i; @@ -331,7 +331,7 @@ PyObject *py_uwsgi_rpc_list(PyObject * self, PyObject * args) { PyObject *py_uwsgi_rpc(PyObject * self, PyObject * args) { char *node = NULL, *func; - uint16_t size = 0; + uint64_t size = 0; PyObject *py_node, *py_func; int argc = PyTuple_Size(args); diff --git a/plugins/rack/rack_api.c b/plugins/rack/rack_api.c index e8fcf69e..3fb8a847 100644 --- a/plugins/rack/rack_api.c +++ b/plugins/rack/rack_api.c @@ -805,7 +805,7 @@ static VALUE uwsgi_ruby_signal_registered(VALUE *class, VALUE signum) { static VALUE uwsgi_ruby_do_rpc(int argc, VALUE *rpc_argv, VALUE *class) { char *node = NULL, *func; - uint16_t size = 0; + uint64_t size = 0; char *argv[256]; uint16_t argvs[256]; diff --git a/plugins/rack/rack_plugin.c b/plugins/rack/rack_plugin.c index fab17948..7cba417e 100644 --- a/plugins/rack/rack_plugin.c +++ b/plugins/rack/rack_plugin.c @@ -315,7 +315,7 @@ VALUE rack_call_rpc_handler(VALUE args) { } -uint16_t uwsgi_ruby_rpc(void *func, uint8_t argc, char **argv, uint16_t argvs[], char *buffer) { +uint64_t uwsgi_ruby_rpc(void *func, uint8_t argc, char **argv, uint16_t argvs[], char **buffer) { uint8_t i; VALUE rb_args = rb_ary_new2(2); @@ -343,7 +343,8 @@ uint16_t uwsgi_ruby_rpc(void *func, uint8_t argc, char **argv, uint16_t argvs[], if (TYPE(ret) == T_STRING) { rv = RSTRING_PTR(ret); rl = RSTRING_LEN(ret); - if (rl <= 0xffff) { + if (rl > 0) { + *buffer = uwsgi_malloc(rl); memcpy(buffer, rv, rl); return rl; } diff --git a/plugins/rpc/rpc_plugin.c b/plugins/rpc/rpc_plugin.c index 35f8a8da..376f493a 100644 --- a/plugins/rpc/rpc_plugin.c +++ b/plugins/rpc/rpc_plugin.c @@ -91,7 +91,7 @@ static int uwsgi_rpc_xmlrpc(struct wsgi_request *wsgi_req, xmlDoc *doc, char **a } if (!method) return -1; - wsgi_req->uh->pktsize = uwsgi_rpc(method, *argc, argv+1, argvs+1, response_buf); + wsgi_req->uh->pktsize = uwsgi_rpc(method, *argc, argv+1, argvs+1, &response_buf); if (!wsgi_req->uh->pktsize) return -1; if (wsgi_req->uh->pktsize == UMAX16-1) return -1; @@ -130,7 +130,7 @@ static int uwsgi_rpc_request(struct wsgi_request *wsgi_req) { // maximum number of supported arguments uint8_t argc = 0xff; // response output - char response_buf[UMAX16]; + char *response_buf = NULL; /* Standard RPC request */ if (!wsgi_req->uh->pktsize) { @@ -173,7 +173,7 @@ static int uwsgi_rpc_request(struct wsgi_request *wsgi_req) { p = strtok_r(NULL, "/", &ctx); } - wsgi_req->uh->pktsize = uwsgi_rpc(argv[0], argc, argv+1, argvs+1, response_buf); + wsgi_req->uh->pktsize = uwsgi_rpc(argv[0], argc, argv+1, argvs+1, &response_buf); free(args); if (!wsgi_req->uh->pktsize) { @@ -221,7 +221,7 @@ static int uwsgi_rpc_request(struct wsgi_request *wsgi_req) { } // call the function (output will be in wsgi_req->buffer) - wsgi_req->uh->pktsize = uwsgi_rpc(argv[0], argc-1, argv+1, argvs+1, response_buf); + wsgi_req->uh->pktsize = uwsgi_rpc(argv[0], argc-1, argv+1, argvs+1, &response_buf); // using modifier2 we may want a raw output if (wsgi_req->uh->modifier2 == 0) { @@ -270,7 +270,7 @@ static int uwsgi_routing_func_rpc(struct wsgi_request *wsgi_req, struct uwsgi_ro *at = 0; remote = at+1; } - uint16_t size; + uint64_t size; char *response = uwsgi_do_rpc(remote, func, ur->custom, argv, argvs, &size); free(func); if (!response) goto end; @@ -322,7 +322,7 @@ static int uwsgi_routing_func_rpc_blob(struct wsgi_request *wsgi_req, struct uws *at = 0; remote = at+1; } - uint16_t size; + uint64_t size; char *response = uwsgi_do_rpc(remote, func, ur->custom, argv, argvs, &size); free(func); if (!response) goto end; @@ -377,7 +377,7 @@ static int uwsgi_routing_func_rpc_raw(struct wsgi_request *wsgi_req, struct uwsg *at = 0; remote = at+1; } - uint16_t size; + uint64_t size; char *response = uwsgi_do_rpc(remote, func, ur->custom, argv, argvs, &size); free(func); if (!response) goto end; @@ -431,7 +431,7 @@ static int uwsgi_routing_func_rpc_var(struct wsgi_request *wsgi_req, struct uwsg *at = 0; remote = at+1; } - uint16_t size; + uint64_t size; char *response = uwsgi_do_rpc(remote, func, ur->custom, argv, argvs, &size); free(func); if (!response) goto end; @@ -488,7 +488,7 @@ static int uwsgi_routing_func_rpc_ret(struct wsgi_request *wsgi_req, struct uwsg *at = 0; remote = at+1; } - uint16_t size; + uint64_t size; char *response = uwsgi_do_rpc(remote, func, ur->custom, argv, argvs, &size); free(func); if (!response) goto end; diff --git a/plugins/symcall/symcall_plugin.c b/plugins/symcall/symcall_plugin.c index 1e020a95..7bb57886 100644 --- a/plugins/symcall/symcall_plugin.c +++ b/plugins/symcall/symcall_plugin.c @@ -63,8 +63,8 @@ static void uwsgi_symcall_after_request(struct wsgi_request *wsgi_req) { log_request(wsgi_req); } -static uint16_t uwsgi_symcall_rpc(void *func, uint8_t argc, char **argv, uint16_t argvs[], char *buffer) { - uint16_t (*casted_func)(uint8_t, char **, uint16_t *, char *) = (uint16_t (*)(uint8_t, char **, uint16_t *, char *)) func; +static uint64_t uwsgi_symcall_rpc(void *func, uint8_t argc, char **argv, uint16_t argvs[], char **buffer) { + uint64_t (*casted_func)(uint8_t, char **, uint16_t *, char **) = (uint64_t (*)(uint8_t, char **, uint16_t *, char **)) func; return casted_func(argc, argv, argvs, buffer); } diff --git a/plugins/v8/plugin.c b/plugins/v8/plugin.c index e19cf36e..5863effb 100644 --- a/plugins/v8/plugin.c +++ b/plugins/v8/plugin.c @@ -3,7 +3,7 @@ int uwsgi_v8_init(void); void uwsgi_v8_apps(void); void uwsgi_v8_configurator(char *, char **); -uint16_t uwsgi_v8_rpc(void *, uint8_t, char **, uint16_t *, char *); +uint64_t uwsgi_v8_rpc(void *, uint8_t, char **, uint16_t *, char **); int uwsgi_v8_signal_handler(uint8_t, void *); void uwsgi_v8_init_thread(int); void uwsgi_v8_enable_threads(); diff --git a/plugins/v8/v8_uwsgi.cc b/plugins/v8/v8_uwsgi.cc index 2767d782..0930e595 100644 --- a/plugins/v8/v8_uwsgi.cc +++ b/plugins/v8/v8_uwsgi.cc @@ -256,7 +256,7 @@ extern "C" void uwsgi_v8_configurator(char *filename, char *magic_table[]) { } -extern "C" uint16_t uwsgi_v8_rpc(void * func, uint8_t argc, char **argv, uint16_t argvs[], char *buffer) { +extern "C" uint64_t uwsgi_v8_rpc(void * func, uint8_t argc, char **argv, uint16_t argvs[], char **buffer) { int core_id = (long) pthread_getspecific(uv8.current_core); @@ -286,7 +286,10 @@ extern "C" uint16_t uwsgi_v8_rpc(void * func, uint8_t argc, char **argv, uint16_ return 0; } uint16_t rlen = robj->Length(); - memcpy(buffer, *r_value, rlen); + if (rlen > 0) { + *buffer = (char *)uwsgi_malloc(rlen); + memcpy(buffer, *r_value, rlen); + } // call GC every time, could be overkill, we should allow to tune that choice while(!v8::V8::IdleNotification()) {}; return rlen; diff --git a/uwsgi.h b/uwsgi.h index 55e93993..dca0494a 100644 --- a/uwsgi.h +++ b/uwsgi.h @@ -1005,7 +1005,7 @@ struct uwsgi_plugin { int (*spooler) (char *, char *, uint16_t, char *, size_t); - uint16_t(*rpc) (void *, uint8_t, char **, uint16_t *, char *); + uint64_t(*rpc) (void *, uint8_t, char **, uint16_t *, char **); void (*jail) (int (*)(void *), char **); void (*post_jail) (void); @@ -3077,8 +3077,8 @@ void uwsgi_route_signal(uint8_t); int uwsgi_start(void *); int uwsgi_register_rpc(char *, struct uwsgi_plugin *, uint8_t, void *); -uint16_t uwsgi_rpc(char *, uint8_t, char **, uint16_t *, char *); -char *uwsgi_do_rpc(char *, char *, uint8_t, char **, uint16_t *, uint16_t *); +uint64_t uwsgi_rpc(char *, uint8_t, char **, uint16_t *, char **); +char *uwsgi_do_rpc(char *, char *, uint8_t, char **, uint16_t *, uint64_t *); void uwsgi_rpc_init(void); char *uwsgi_cheap_string(char *, int);