aboutsummaryrefslogtreecommitdiffstats
path: root/python/gevent/libev/_corecffi_source.c
diff options
context:
space:
mode:
Diffstat (limited to 'python/gevent/libev/_corecffi_source.c')
-rw-r--r--python/gevent/libev/_corecffi_source.c36
1 files changed, 30 insertions, 6 deletions
diff --git a/python/gevent/libev/_corecffi_source.c b/python/gevent/libev/_corecffi_source.c
index d179ce6..63b216e 100644
--- a/python/gevent/libev/_corecffi_source.c
+++ b/python/gevent/libev/_corecffi_source.c
@@ -13,9 +13,10 @@ static void
_gevent_noop(struct ev_loop *_loop, struct ev_timer *w, int revents) { }
void (*gevent_noop)(struct ev_loop *, struct ev_timer *, int) = &_gevent_noop;
-static int (*python_callback)(void* handle, int revents);
-static void (*python_handle_error)(void* handle, int revents);
-static void (*python_stop)(void* handle);
+
+static int python_callback(void* handle, int revents);
+static void python_handle_error(void* handle, int revents);
+static void python_stop(void* handle);
static void _gevent_generic_callback(struct ev_loop* loop,
struct ev_watcher* watcher,
@@ -30,7 +31,7 @@ static void _gevent_generic_callback(struct ev_loop* loop,
// and allowing memory to be freed
python_handle_error(handle, revents);
break;
- case 0:
+ case 1:
// Code to stop the event. Note that if python_callback
// has disposed of the last reference to the handle,
// `watcher` could now be invalid/disposed memory!
@@ -38,8 +39,31 @@ static void _gevent_generic_callback(struct ev_loop* loop,
python_stop(handle);
}
break;
- default:
- assert(cb_result == 1);
+ case 2:
// watcher is already stopped and dead, nothing to do.
+ break;
+ default:
+ fprintf(stderr,
+ "WARNING: gevent: Unexpected return value %d from Python callback "
+ "for watcher %p and handle %d\n",
+ cb_result,
+ watcher, handle);
+ // XXX: Possible leaking of resources here? Should we be
+ // closing the watcher?
}
}
+
+static void gevent_zero_timer(struct ev_timer* handle)
+{
+ memset(handle, 0, sizeof(struct ev_timer));
+}
+
+static void gevent_zero_check(struct ev_check* handle)
+{
+ memset(handle, 0, sizeof(struct ev_check));
+}
+
+static void gevent_zero_prepare(struct ev_prepare* handle)
+{
+ memset(handle, 0, sizeof(struct ev_prepare));
+}