mirror of
https://github.com/clearlinux/uwsgi.git
synced 2026-08-23 06:27:47 +00:00
140 lines
3.8 KiB
C
140 lines
3.8 KiB
C
#include "gevent.h"
|
|
|
|
extern struct uwsgi_server uwsgi;
|
|
extern struct uwsgi_gevent ugevent;
|
|
|
|
|
|
int uwsgi_gevent_wait_write_hook(int fd, int timeout) {
|
|
|
|
PyObject *ret = NULL;
|
|
|
|
/// create a watcher for writes
|
|
PyObject *watcher = PyObject_CallMethod(ugevent.hub_loop, "io", "ii", fd, 2);
|
|
if (!watcher) return -1;
|
|
|
|
PyObject *timer = PyObject_CallMethod(ugevent.hub_loop, "timer", "i", timeout);
|
|
if (!timer) {
|
|
Py_DECREF(watcher);
|
|
return -1;
|
|
}
|
|
|
|
PyObject *current_greenlet = GET_CURRENT_GREENLET;
|
|
PyObject *current = PyObject_GetAttrString(current_greenlet, "switch");
|
|
|
|
ret = PyObject_CallMethod(watcher, "start", "OO", current, watcher);
|
|
if (!ret) {
|
|
stop_the_watchers_and_clear
|
|
return -1;
|
|
}
|
|
Py_DECREF(ret);
|
|
|
|
ret = PyObject_CallMethod(timer, "start", "OO", current, timer);
|
|
if (!ret) {
|
|
stop_the_watchers_and_clear
|
|
return -1;
|
|
}
|
|
Py_DECREF(ret);
|
|
|
|
ret = PyObject_CallMethod(ugevent.hub, "switch", NULL);
|
|
if (!ret) {
|
|
stop_the_watchers_and_clear
|
|
return -1;
|
|
}
|
|
Py_DECREF(ret);
|
|
|
|
if (ret == timer) {
|
|
stop_the_watchers_and_clear;
|
|
return 0;
|
|
}
|
|
|
|
stop_the_watchers_and_clear;
|
|
return 1;
|
|
}
|
|
|
|
int uwsgi_gevent_wait_read_hook(int fd, int timeout) {
|
|
|
|
PyObject *ret = NULL;
|
|
|
|
/// create a watcher for writes
|
|
PyObject *watcher = PyObject_CallMethod(ugevent.hub_loop, "io", "ii", fd, 1);
|
|
if (!watcher) return -1;
|
|
|
|
PyObject *timer = PyObject_CallMethod(ugevent.hub_loop, "timer", "i", timeout);
|
|
if (!timer) {
|
|
Py_DECREF(watcher);
|
|
return -1;
|
|
}
|
|
|
|
PyObject *current_greenlet = GET_CURRENT_GREENLET;
|
|
PyObject *current = PyObject_GetAttrString(current_greenlet, "switch");
|
|
|
|
ret = PyObject_CallMethod(watcher, "start", "OO", current, watcher);
|
|
if (!ret) {
|
|
stop_the_watchers_and_clear
|
|
return -1;
|
|
}
|
|
Py_DECREF(ret);
|
|
|
|
ret = PyObject_CallMethod(timer, "start", "OO", current, timer);
|
|
if (!ret) {
|
|
stop_the_watchers_and_clear
|
|
return -1;
|
|
}
|
|
Py_DECREF(ret);
|
|
|
|
ret = PyObject_CallMethod(ugevent.hub, "switch", NULL);
|
|
if (!ret) {
|
|
stop_the_watchers_and_clear
|
|
return -1;
|
|
}
|
|
Py_DECREF(ret);
|
|
|
|
if (ret == timer) {
|
|
stop_the_watchers_and_clear;
|
|
return 0;
|
|
}
|
|
|
|
stop_the_watchers_and_clear;
|
|
return 1;
|
|
}
|
|
|
|
int uwsgi_gevent_wait_milliseconds_hook(int timeout) {
|
|
|
|
PyObject *ret = NULL;
|
|
|
|
PyObject *timer = PyObject_CallMethod(ugevent.hub_loop, "timer", "f", ((double) timeout)/1000.0);
|
|
if (!timer) return -1;
|
|
|
|
PyObject *current_greenlet = GET_CURRENT_GREENLET;
|
|
PyObject *current = PyObject_GetAttrString(current_greenlet, "switch");
|
|
|
|
ret = PyObject_CallMethod(timer, "start", "OO", current, timer);
|
|
if (!ret) {
|
|
Py_DECREF(current); Py_DECREF(current_greenlet);
|
|
Py_DECREF(timer);
|
|
return -1;
|
|
}
|
|
Py_DECREF(ret);
|
|
|
|
ret = PyObject_CallMethod(ugevent.hub, "switch", NULL);
|
|
if (!ret) {
|
|
ret = PyObject_CallMethod(timer, "stop", NULL);
|
|
if (ret) { Py_DECREF(ret); }
|
|
Py_DECREF(current); Py_DECREF(current_greenlet);
|
|
Py_DECREF(timer);
|
|
return -1;
|
|
}
|
|
Py_DECREF(ret);
|
|
|
|
if (ret == timer) {
|
|
ret = PyObject_CallMethod(timer, "stop", NULL);
|
|
if (ret) { Py_DECREF(ret); }
|
|
Py_DECREF(current); Py_DECREF(current_greenlet);
|
|
Py_DECREF(timer);
|
|
return 0;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|