mirror of
https://github.com/clearlinux/uwsgi.git
synced 2026-09-05 13:11:33 +00:00
added generic functions for rpc
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
import uwsgi
|
||||
|
||||
|
||||
def hello():
|
||||
return "Hello World"
|
||||
|
||||
print uwsgi.register_rpc("hello", hello)
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user