Skip to content

Commit

Permalink
ready for next (last?) -rc
Browse files Browse the repository at this point in the history
  • Loading branch information
roberto@oneiric64 committed Dec 4, 2011
1 parent b941e4f commit c7bde15
Show file tree
Hide file tree
Showing 12 changed files with 217 additions and 122 deletions.
5 changes: 3 additions & 2 deletions plugins/cache/cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ int uwsgi_cache_request(struct wsgi_request *wsgi_req) {
uint64_t vallen = 0;
char *value;
char *argv[3];
uint16_t argvs[3];
uint8_t argc = 0;

switch(wsgi_req->uh.modifier2) {
Expand All @@ -52,9 +53,9 @@ int uwsgi_cache_request(struct wsgi_request *wsgi_req) {
// set
if (wsgi_req->uh.pktsize > 0) {
argc = 3;
if (!uwsgi_parse_array(wsgi_req->buffer, wsgi_req->uh.pktsize, argv, &argc)) {
if (!uwsgi_parse_array(wsgi_req->buffer, wsgi_req->uh.pktsize, argv, argvs, &argc)) {
if (argc > 1) {
uwsgi_cache_set(argv[0], strlen(argv[0]), argv[1], strlen(argv[1]), 0, 0);
uwsgi_cache_set(argv[0], argvs[0], argv[1], argvs[1], 0, 0);
}
}
}
Expand Down
7 changes: 5 additions & 2 deletions plugins/erlang/erlang.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,8 @@ void uwsgi_erlang_rpc(int fd, erlang_pid *from, ei_x_buff *x) {
char *call;
char buffer[0xffff];

char *argv[0xff] ;
char *argv[256] ;
uint16_t argvs[256] ;
int argc = 0;
uint16_t ret;
ei_x_buff xr;
Expand Down Expand Up @@ -215,14 +216,16 @@ void uwsgi_erlang_rpc(int fd, erlang_pid *from, ei_x_buff *x) {
argc = 1;
argv[0] = uwsgi_malloc(esize+1);
ei_decode_atom(x->buff, &x->index, argv[0]);
argvs[1] = esize;
}
else if (etype == ERL_STRING_EXT) {
argc = 1;
argv[0] = uwsgi_malloc(esize+1);
ei_decode_string(x->buff, &x->index, argv[0]);
argvs[1] = esize;
}

ret = uwsgi_rpc(call, argc, argv, buffer);
ret = uwsgi_rpc(call, argc, argv, argvs, buffer);

#ifdef UWSGI_DEBUG
uwsgi_log("buffer: %.*s\n", ret, buffer);
Expand Down
4 changes: 2 additions & 2 deletions plugins/lua/lua_plugin.c
Original file line number Diff line number Diff line change
Expand Up @@ -682,7 +682,7 @@ int uwsgi_lua_signal_handler(uint8_t sig, void *handler) {

}

uint16_t uwsgi_lua_rpc(void * func, uint8_t argc, char **argv, char *buffer) {
uint16_t uwsgi_lua_rpc(void * func, uint8_t argc, char **argv, uint16_t argvs[], char *buffer) {

uint8_t i;
const char *sv;
Expand All @@ -698,7 +698,7 @@ uint16_t uwsgi_lua_rpc(void * func, uint8_t argc, char **argv, char *buffer) {
lua_rawgeti(L, LUA_REGISTRYINDEX, ifunc);

for(i=0;i<argc;i++) {
lua_pushstring(L, argv[i]);
lua_pushlstring(L, argv[i], argvs[i]);
}

if (lua_pcall(L, argc, 1, 0) != 0) {
Expand Down
14 changes: 8 additions & 6 deletions plugins/psgi/uwsgi_plmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -155,26 +155,28 @@ XS(XS_call) {

dXSARGS;

char buffer[0xffff];
char *func;
uint16_t size = 0;
int i;
char *argv[0xff];
char *argv[256];
uint16_t argvs[256];
STRLEN arg_len;

psgi_check_args(1);

func = SvPV_nolen(ST(0));

for(i=0;i<(items-1);i++) {
argv[i] = SvPV_nolen(ST(i+1));
argv[i] = SvPV(ST(i+1), arg_len);
argvs[i] = arg_len;
}

size = uwsgi_rpc(func, items-1, argv, buffer);
char *response = uwsgi_do_rpc(NULL, func, items-1, argv, argvs, &size);

if (size > 0) {
ST(0) = newSVpv(buffer, size);
ST(0) = newSVpv(response, size);
sv_2mortal(ST(0));

free(response);
XSRETURN(1);
}

Expand Down
14 changes: 8 additions & 6 deletions plugins/python/python_plugin.c
Original file line number Diff line number Diff line change
Expand Up @@ -1291,36 +1291,38 @@ int uwsgi_python_signal_handler(uint8_t sig, void *handler) {
return -1;
}

uint16_t uwsgi_python_rpc(void *func, uint8_t argc, char **argv, char *buffer) {
uint16_t uwsgi_python_rpc(void *func, uint8_t argc, char **argv, uint16_t argvs[], char *buffer) {

UWSGI_GET_GIL;

uint8_t i;
PyObject *pyargs = PyTuple_New(argc);
PyObject *ret;
char *rv;
size_t rl;

PyObject *pyargs = PyTuple_New(argc);
PyObject *ret;

if (!pyargs)
return 0;

for (i = 0; i < argc; i++) {
PyTuple_SetItem(pyargs, i, PyString_FromString(argv[i]));
PyTuple_SetItem(pyargs, i, PyString_FromStringAndSize(argv[i], argvs[i]));
}

ret = python_call((PyObject *) func, pyargs, 0, NULL);

Py_DECREF(pyargs);
if (ret) {
if (PyString_Check(ret)) {
rv = PyString_AsString(ret);
rl = PyString_Size(ret);
if (rl <= 0xffff) {
if (rl <= 65536) {
memcpy(buffer, rv, rl);
Py_DECREF(ret);
UWSGI_RELEASE_GIL;
return rl;
}
}
Py_DECREF(ret);
}

if (PyErr_Occurred())
Expand Down
130 changes: 37 additions & 93 deletions plugins/python/uwsgi_pymodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -294,13 +294,13 @@ PyObject *py_uwsgi_add_file_monitor(PyObject * self, PyObject * args) {

PyObject *py_uwsgi_call(PyObject * self, PyObject * args) {

char buffer[0xffff];
char *func;
uint16_t size = 0;
PyObject *py_func;
int argc = PyTuple_Size(args);
int i;
char *argv[0xff];
char *argv[256];
uint16_t argvs[256];

// TODO better error reporting
if (argc < 1)
Expand All @@ -314,19 +314,29 @@ PyObject *py_uwsgi_call(PyObject * self, PyObject * args) {
func = PyString_AsString(py_func);

for (i = 0; i < (argc - 1); i++) {
argv[i] = PyString_AsString(PyTuple_GetItem(args, i + 1));
PyObject *py_str = PyTuple_GetItem(args, i + 1);
if (!PyString_Check(py_str)) {
goto clear;
}
argv[i] = PyString_AsString(py_str);
argvs[i] = PyString_Size(py_str);
}

size = uwsgi_rpc(func, argc - 1, argv, buffer);
char *response = uwsgi_do_rpc(NULL, func, argc - 1, argv, argvs, &size);

if (size > 0) {
return PyString_FromStringAndSize(buffer, size);
PyObject *ret = PyString_FromStringAndSize(response, size);
free(response);
return ret;
}

clear:

Py_INCREF(Py_None);
return Py_None;

clear:

return PyErr_Format(PyExc_ValueError, "unable to call rpc function");

}

PyObject *py_uwsgi_rpc_list(PyObject * self, PyObject * args) {
Expand All @@ -346,19 +356,15 @@ PyObject *py_uwsgi_rpc_list(PyObject * self, PyObject * args) {

PyObject *py_uwsgi_rpc(PyObject * self, PyObject * args) {

char buffer[0xffff];
char *node, *func;
char *node = NULL, *func;
uint16_t size = 0;
PyObject *py_node, *py_func;
struct wsgi_request rpc_req;

int argc = PyTuple_Size(args);
char *argv[0xff];
int i, fd;
uint16_t pktsize = 0, ulen;
char *bufptr;
int rlen;
int rpc_args = 0;
char *argv[256];
uint16_t argvs[256];

int i;

// TODO better error reporting
if (argc < 2)
Expand All @@ -369,9 +375,6 @@ PyObject *py_uwsgi_rpc(PyObject * self, PyObject * args) {
if (PyString_Check(py_node)) {
node = PyString_AsString(py_node);
}
else {
node = "";
}

py_func = PyTuple_GetItem(args, 1);

Expand All @@ -381,87 +384,28 @@ PyObject *py_uwsgi_rpc(PyObject * self, PyObject * args) {
func = PyString_AsString(py_func);

for (i = 0; i < (argc - 2); i++) {
argv[i] = PyString_AsString(PyTuple_GetItem(args, i + 2));
rpc_args++;
}

if (!strcmp(node, "")) {
if (!rpc_args) {
size = uwsgi_rpc(func, 0, NULL, buffer);
}
else {
size = uwsgi_rpc(func, rpc_args, argv, buffer);
}
}
else {


// connect to node
fd = uwsgi_connect(node, uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT], 0);

if (fd < 0)
PyObject *py_str = PyTuple_GetItem(args, i + 2);
if (!PyString_Check(py_str))
goto clear;
// prepare a uwsgi array

pktsize = 2 + strlen(func);
for (i = 0; i < argc - 2; i++) {
pktsize += 2 + strlen(argv[i]);
}

memset(&rpc_req, 0, sizeof(struct wsgi_request));

rpc_req.uh.modifier1 = 173;
rpc_req.uh.pktsize = pktsize;
rpc_req.uh.modifier2 = 0;

bufptr = buffer;

ulen = strlen(func);
*bufptr++ = (uint8_t) (ulen & 0xff);
*bufptr++ = (uint8_t) ((ulen >> 8) & 0xff);
memcpy(bufptr, func, ulen);
bufptr += ulen;

for (i = 0; i < argc - 2; i++) {
ulen = strlen(argv[i]);
*bufptr++ = (uint8_t) (ulen & 0xff);
*bufptr++ = (uint8_t) ((ulen >> 8) & 0xff);
memcpy(bufptr, argv[i], ulen);
bufptr += ulen;
}

if (write(fd, &rpc_req.uh, 4) != 4) {
uwsgi_error("write()");
close(fd);
goto clear;
}

if (write(fd, buffer, pktsize) != pktsize) {
uwsgi_error("write()");
close(fd);
goto clear;
}

rlen = uwsgi_waitfd(fd, uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT]);
if (rlen > 0) {
rpc_req.poll.fd = fd;
rpc_req.poll.events = POLLIN;
rpc_req.buffer = buffer;
if (uwsgi_parse_packet(&rpc_req, uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT])) {
size = rpc_req.uh.pktsize;
}
}

argv[i] = PyString_AsString(py_str);
argvs[i] = PyString_Size(py_str);
}

char *response = uwsgi_do_rpc(node, func, argc - 2, argv, argvs, &size);

if (size > 0) {
return PyString_FromStringAndSize(buffer, size);
}
PyObject *ret = PyString_FromStringAndSize(response, size);
free(response);
return ret;
}

Py_INCREF(Py_None);
return Py_None;

clear:

Py_INCREF(Py_None);
return Py_None;
return PyErr_Format(PyExc_ValueError, "unable to call rpc function");

}

PyObject *py_uwsgi_register_rpc(PyObject * self, PyObject * args) {
Expand Down
Loading

0 comments on commit c7bde15

Please sign in to comment.