refactored signal framework

This commit is contained in:
roberto@mrspurr
2010-12-26 10:33:50 +01:00
parent 4269f0483f
commit 5186936c3a
9 changed files with 288 additions and 105 deletions
+21
View File
@@ -827,6 +827,25 @@ void uwsgi_python_suspend(struct wsgi_request *wsgi_req) {
}
int uwsgi_python_signal_handler(uint8_t sig, void *handler, char *payload, uint8_t payload_size) {
PyObject *args = PyTuple_New(2);
PyObject *ret;
if (!args) return -1;
PyTuple_SetItem(args, 0, PyInt_FromLong(sig));
PyTuple_SetItem(args, 1, PyString_FromStringAndSize(payload, payload_size));
ret = python_call(handler, args, 0);
if (ret) {
return 0;
}
return -1;
}
void uwsgi_python_resume(struct wsgi_request *wsgi_req) {
PyThreadState* tstate = PyThreadState_GET();
@@ -857,6 +876,8 @@ void uwsgi_python_resume(struct wsgi_request *wsgi_req) {
.suspend = uwsgi_python_suspend,
.resume = uwsgi_python_resume,
.signal_handler = uwsgi_python_signal_handler,
//.spooler = uwsgi_python_spooler,
/*
.help = uwsgi_python_help,
+49 -25
View File
@@ -155,43 +155,64 @@ PyObject *py_uwsgi_close(PyObject * self, PyObject * args) {
}
PyObject *py_uwsgi_signal(PyObject * self, PyObject * args) {
PyObject *py_uwsgi_register_file_monitor(PyObject * self, PyObject * args) {
char uwsgi_signal;
ssize_t rlen;
char *payload = NULL;
struct uwsgi_header uh;
uint8_t uwsgi_signal;
uint8_t signal_kind;
PyObject *handler;
char *filename;
if (!PyArg_ParseTuple(args, "B|s:signal", &uwsgi_signal, &payload)) {
if (!PyArg_ParseTuple(args, "BsBO:register_file_monitor", &uwsgi_signal, &filename, &signal_kind, &handler)) {
return NULL;
}
// am i the master ?
if (uwsgi.mywid == 0) {
register_signal(uwsgi_signal, payload);
goto done;
}
uwsgi_log("signal_kind %d\n", signal_kind);
uwsgi_log("sending %d to master\n", uwsgi_signal);
uh.modifier1 = 110;
if (payload) {
uh.pktsize = strlen(payload);
uwsgi_register_file_monitor(uwsgi_signal, filename, signal_kind, handler, 0);
Py_INCREF(Py_None);
return Py_None;
}
PyObject *py_uwsgi_register_signal(PyObject * self, PyObject * args) {
uint8_t uwsgi_signal;
uint8_t signal_kind;
PyObject *handler;
char *payload = NULL;
if (!PyArg_ParseTuple(args, "BBO|s:register_signal", &uwsgi_signal, &signal_kind, &handler, &payload)) {
return NULL;
}
uwsgi_log("REGISTER SIGNAL %d\n", uwsgi_signal);
if (payload == NULL) {
uwsgi_register_signal(uwsgi_signal, signal_kind, handler, 0, NULL, 0);
}
else {
uh.pktsize = 0;
uwsgi_register_signal(uwsgi_signal, signal_kind, handler, 0, payload, strlen(payload));
}
uh.modifier2 = uwsgi_signal;
Py_INCREF(Py_None);
return Py_None;
}
PyObject *py_uwsgi_signal(PyObject * self, PyObject * args) {
uint8_t uwsgi_signal;
ssize_t rlen;
if (!PyArg_ParseTuple(args, "B:signal", &uwsgi_signal)) {
return NULL;
}
uwsgi_log("sending %d to master\n", uwsgi_signal);
rlen = write(uwsgi.workers[uwsgi.mywid].pipe[1], &uh, 4);
if (rlen == 4) {
if (uh.pktsize) {
if (write(uwsgi.workers[uwsgi.mywid].pipe[1], payload, uh.pktsize) < 0) {
uwsgi_error("write()");
}
}
rlen = write(uwsgi.shared->worker_signal_pipe[1], &uwsgi_signal, 1);
if (rlen != 1) {
uwsgi_error("write()");
}
done:
Py_INCREF(Py_None);
return Py_None;
@@ -1869,7 +1890,10 @@ static PyMethodDef uwsgi_advanced_methods[] = {
{"send", py_uwsgi_send, METH_VARARGS, ""},
{"cl", py_uwsgi_cl, METH_VARARGS, ""},
{"register_signal", py_uwsgi_register_signal, METH_VARARGS, ""},
{"signal", py_uwsgi_signal, METH_VARARGS, ""},
{"register_file_monitor", py_uwsgi_register_file_monitor, METH_VARARGS, ""},
//{"register_timer", py_uwsgi_register_timer, METH_VARARGS, ""},
#ifdef UWSGI_SENDFILE
{"sendfile", py_uwsgi_advanced_sendfile, METH_VARARGS, ""},
#endif