diff --git a/event.c b/event.c index 432d0060..bb4c4c88 100644 --- a/event.c +++ b/event.c @@ -1920,6 +1920,17 @@ event_self_cbarg(void) return &event_self_cbarg_ptr_; } +struct event * +event_base_get_running_event(struct event_base *base) +{ + struct event *ev = NULL; + EVBASE_ACQUIRE_LOCK(base, th_base_lock); + if (EVBASE_IN_THREAD(base)) + ev = base->current_event; + EVBASE_RELEASE_LOCK(base, th_base_lock); + return ev; +} + struct event * event_new(struct event_base *base, evutil_socket_t fd, short events, void (*cb)(evutil_socket_t, short, void *), void *arg) { diff --git a/include/event2/event.h b/include/event2/event.h index d209c815..9685e0a2 100644 --- a/include/event2/event.h +++ b/include/event2/event.h @@ -1061,6 +1061,13 @@ void event_active(struct event *ev, int res, short ncalls); */ int event_pending(const struct event *ev, short events, struct timeval *tv); +/** + If called from within the callback for an event, returns that event. + + The behavior of this function is not defined when called from outside the + callback function for an event. + */ +struct event *event_base_get_running_event(struct event_base *base); /** Test if an event structure might be initialized. diff --git a/test/regress.c b/test/regress.c index fe6862fc..49c40efd 100644 --- a/test/regress.c +++ b/test/regress.c @@ -1250,6 +1250,7 @@ event_selfarg_cb(evutil_socket_t fd, short event, void *arg) struct event_base *base = event_get_base(ev); event_base_assert_ok_(base); event_base_loopexit(base, NULL); + tt_want(ev == event_base_get_running_event(base)); } static void