From: Yedidya Feldblum Date: Wed, 16 Sep 2015 21:15:19 +0000 (-0700) Subject: Compatibility: libevent: accessors for struct event X-Git-Tag: deprecate-dynamic-initializer~394 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=99eb3f45bba336163f28cefe5d549731ea4a886b;p=folly.git Compatibility: libevent: accessors for struct event Summary: [Folly] Compatibility: libevent: accessors for `struct event`. Some libevent fields in `struct event` moved between `v1.4` and `v2`. Add some accessors which are defined per-libevent-version. Reviewed By: @JoelMarcey Differential Revision: D2447537 --- diff --git a/folly/io/async/AsyncTimeout.cpp b/folly/io/async/AsyncTimeout.cpp index 31a1c0b5..7b6ab3db 100644 --- a/folly/io/async/AsyncTimeout.cpp +++ b/folly/io/async/AsyncTimeout.cpp @@ -144,7 +144,7 @@ void AsyncTimeout::libeventCallback(int fd, short events, void* arg) { assert(events == EV_TIMEOUT); // double check that ev_flags gets reset when the timeout is not running - assert((timeout->event_.ev_flags & ~EVLIST_INTERNAL) == EVLIST_INIT); + assert((event_ref_flags(&timeout->event_) & ~EVLIST_INTERNAL) == EVLIST_INIT); // this can't possibly fire if timeout->eventBase_ is nullptr (void) timeout->timeoutManager_->bumpHandlingTime(); diff --git a/folly/io/async/EventBase.cpp b/folly/io/async/EventBase.cpp index e73bdb3e..5adb8c15 100644 --- a/folly/io/async/EventBase.cpp +++ b/folly/io/async/EventBase.cpp @@ -797,7 +797,7 @@ void EventBase::attachTimeoutManager(AsyncTimeout* obj, event_base_set(getLibeventBase(), ev); if (internal == AsyncTimeout::InternalEnum::INTERNAL) { // Set the EVLIST_INTERNAL flag - ev->ev_flags |= EVLIST_INTERNAL; + event_ref_flags(ev) |= EVLIST_INTERNAL; } } diff --git a/folly/io/async/EventHandler.cpp b/folly/io/async/EventHandler.cpp index dcccfafb..ab5cad6b 100644 --- a/folly/io/async/EventHandler.cpp +++ b/folly/io/async/EventHandler.cpp @@ -49,8 +49,9 @@ bool EventHandler::registerImpl(uint16_t events, bool internal) { if (isHandlerRegistered()) { // If the new events are the same are the same as the already registered // flags, we don't have to do anything. Just return. + auto flags = event_ref_flags(&event_); if (events == event_.ev_events && - static_cast(event_.ev_flags & EVLIST_INTERNAL) == internal) { + static_cast(flags & EVLIST_INTERNAL) == internal) { return true; } @@ -67,7 +68,7 @@ bool EventHandler::registerImpl(uint16_t events, bool internal) { // Set EVLIST_INTERNAL if this is an internal event if (internal) { - event_.ev_flags |= EVLIST_INTERNAL; + event_ref_flags(&event_) |= EVLIST_INTERNAL; } // Add the event. @@ -168,7 +169,7 @@ void EventHandler::setEventBase(EventBase* eventBase) { } bool EventHandler::isPending() const { - if (event_.ev_flags & EVLIST_ACTIVE) { + if (event_ref_flags(&event_) & EVLIST_ACTIVE) { if (event_.ev_res & EV_READ) { return true; } diff --git a/folly/io/async/EventUtil.h b/folly/io/async/EventUtil.h index 116cf4c5..7b82aa0b 100644 --- a/folly/io/async/EventUtil.h +++ b/folly/io/async/EventUtil.h @@ -20,10 +20,30 @@ */ #pragma once +#include #include // libevent namespace folly { +# if LIBEVENT_VERSION_NUMBER <= 0x02010101 +# define FOLLY_LIBEVENT_COMPAT_PLUCK(name) ev_##name +# else +# define FOLLY_LIBEVENT_COMPAT_PLUCK(name) ev_evcallback.evcb_##name +# endif +# define FOLLY_LIBEVENT_DEF_ACCESSORS(name) \ + inline auto event_ref_##name(struct event* ev) -> \ + decltype(std::ref(ev->FOLLY_LIBEVENT_COMPAT_PLUCK(name))) \ + { return std::ref(ev->FOLLY_LIBEVENT_COMPAT_PLUCK(name)); } \ + inline auto event_ref_##name(struct event const* ev) -> \ + decltype(std::cref(ev->FOLLY_LIBEVENT_COMPAT_PLUCK(name))) \ + { return std::cref(ev->FOLLY_LIBEVENT_COMPAT_PLUCK(name)); } \ + // + +FOLLY_LIBEVENT_DEF_ACCESSORS(flags) + +# undef FOLLY_LIBEVENT_COMPAT_PLUCK +# undef FOLLY_LIBEVENT_DEF_ACCESSORS + /** * low-level libevent utility functions */ @@ -35,7 +55,7 @@ class EventUtil { EVLIST_REGISTERED = (EVLIST_INSERTED | EVLIST_ACTIVE | EVLIST_TIMEOUT | EVLIST_SIGNAL) }; - return (ev->ev_flags & EVLIST_REGISTERED); + return (event_ref_flags(ev) & EVLIST_REGISTERED); } };