added generic functions for rpc

This commit is contained in:
roberto@sirius
2011-01-03 20:52:23 +01:00
parent d3ced01b43
commit ec4fbdff32
6 changed files with 97 additions and 3 deletions
+22
View File
@@ -190,6 +190,26 @@ PyObject *py_uwsgi_register_file_monitor(PyObject * self, PyObject * args) {
return Py_None;
}
PyObject *py_uwsgi_register_rpc(PyObject * self, PyObject * args) {
uint8_t argc = 0;
char *name;
PyObject *func;
if (!PyArg_ParseTuple(args, "sO|B:register_signal", &name, &func, &argc)) {
return NULL;
}
if (uwsgi_register_rpc(name, 0, argc, func)) {
Py_INCREF(Py_None);
return Py_None;
}
Py_INCREF(Py_True);
return Py_True;
}
PyObject *py_uwsgi_register_signal(PyObject * self, PyObject * args) {
uint8_t uwsgi_signal;
@@ -1947,6 +1967,8 @@ static PyMethodDef uwsgi_advanced_methods[] = {
{"signal", py_uwsgi_signal, METH_VARARGS, ""},
{"register_file_monitor", py_uwsgi_register_file_monitor, METH_VARARGS, ""},
{"register_timer", py_uwsgi_register_timer, METH_VARARGS, ""},
{"register_rpc", py_uwsgi_register_rpc, METH_VARARGS, ""},
#ifdef UWSGI_SENDFILE
{"sendfile", py_uwsgi_advanced_sendfile, METH_VARARGS, ""},
#endif
+52
View File
@@ -0,0 +1,52 @@
#include "uwsgi.h"
extern struct uwsgi_server uwsgi;
int uwsgi_register_rpc(char *name, uint8_t modifier1, uint8_t args, void *func) {
struct uwsgi_rpc *urpc;
int ret = -1;
uwsgi_lock(uwsgi.rpc_table_lock);
if (uwsgi.shared->rpc_count < MAX_RPC) {
urpc = &uwsgi.shared->rpc_table[uwsgi.shared->rpc_count];
memcpy(urpc->name, name, strlen(name));
urpc->modifier1 = modifier1;
urpc->args = args;
urpc->func = func;
uwsgi.shared->rpc_count++;
ret = 0;
}
uwsgi_unlock(uwsgi.rpc_table_lock);
return ret;
}
uint16_t uwsgi_rpc(char *name, uint8_t argc, char *argv[], char *output) {
struct uwsgi_rpc *urpc = NULL;
int i;
uint16_t ret = 0;
for(i=0;i<uwsgi.shared->rpc_count;i++) {
if (uwsgi.shared->rpc_table[i].name[0] != 0) {
if (!strcmp(uwsgi.shared->rpc_table[i].name, name)) {
urpc = &uwsgi.shared->rpc_table[i];
break;
}
}
}
if (urpc) {
if (uwsgi.p[urpc->modifier1]->rpc) {
ret = uwsgi.p[urpc->modifier1]->rpc(urpc->func, argc, argv, output);
}
}
return ret;
}
+7
View File
@@ -0,0 +1,7 @@
import uwsgi
def hello():
return "Hello World"
print uwsgi.register_rpc("hello", hello)
+3
View File
@@ -946,6 +946,9 @@ int uwsgi_start(void *v_argv) {
uwsgi_lock_init(uwsgi.timer_table_lock);
}
uwsgi.rpc_table_lock = uwsgi_mmap_shared_lock();
uwsgi_lock_init(uwsgi.rpc_table_lock);
if (uwsgi.sharedareasize > 0) {
uwsgi.sharedareamutex = uwsgi_mmap_shared_lock();
+12 -2
View File
@@ -15,6 +15,7 @@
#define MAX_APPS 64
#define MAX_GENERIC_PLUGINS 64
#define MAX_RPC 64
#ifndef UWSGI_LOAD_EMBEDDED_PLUGINS
#define UWSGI_LOAD_EMBEDDED_PLUGINS
@@ -399,6 +400,8 @@ struct uwsgi_plugin {
char* (*decode_string)(void *);
int (*signal_handler)(uint8_t, void *, char *, uint8_t);
uint16_t (*rpc)(void *, uint8_t argc, char **, char *);
};
@@ -872,6 +875,7 @@ struct uwsgi_server {
void *signal_table_lock;
void *fmon_table_lock;
void *timer_table_lock;
void *rpc_table_lock;
};
@@ -879,8 +883,8 @@ struct uwsgi_rpc {
char name[0xff];
void *func;
uint8_t args;
uint8_t modifier;
}
uint8_t modifier1;
};
struct uwsgi_lb_group {
char name[101];
@@ -992,6 +996,9 @@ struct uwsgi_shared {
struct uwsgi_timer timers[64];
int timers_cnt;
struct uwsgi_rpc rpc_table[MAX_RPC];
int rpc_count;
};
struct uwsgi_core {
@@ -1343,3 +1350,6 @@ int uwsgi_signal_handler(uint8_t);
void uwsgi_route_signal(uint8_t);
int uwsgi_start(void *);
int uwsgi_register_rpc(char *, uint8_t, uint8_t, void *);
uint16_t uwsgi_rpc(char *, uint8_t, char **, char *);
+1 -1
View File
@@ -139,7 +139,7 @@ class uConf(object):
self.config = ConfigParser.ConfigParser()
print("using profile: %s" % filename)
self.config.read(filename)
self.gcc_list = ['utils', 'protocol', 'socket', 'logging', 'master', 'plugins', 'lock', 'cache', 'event', 'signal', 'loop', 'uwsgi']
self.gcc_list = ['utils', 'protocol', 'socket', 'logging', 'master', 'plugins', 'lock', 'cache', 'event', 'signal', 'rpc', 'loop', 'uwsgi']
self.cflags = ['-O2', '-Wall', '-Werror', '-D_LARGEFILE_SOURCE', '-D_FILE_OFFSET_BITS=64'] + os.environ.get("CFLAGS", "").split()
try:
gcc_version = str(spcall2("%s -v" % GCC)).split('\n')[-1].split()[2]