]> granicus.if.org Git - libevent/commitdiff
Add EVENT_BASE_FLAG_EPOLL_DISALLOW_TIMERFD flag (fixes: #958)
authorAzat Khuzhin <azat@libevent.org>
Sun, 1 Mar 2020 13:01:12 +0000 (16:01 +0300)
committerAzat Khuzhin <azat@libevent.org>
Sun, 1 Mar 2020 15:03:46 +0000 (18:03 +0300)
By default we are using CLOCK_MONOTONIC_COARSE, but if
EVENT_BASE_FLAG_PRECISE_TIMER isset, then CLOCK_MONOTONIC will be used,
however this will also enable timerfd, while this is not always what
someone wants, hence add a flag to control this (by default the old
behavior is preserved, set new flag to change it).

epoll.c
include/event2/event.h

diff --git a/epoll.c b/epoll.c
index a0df0d21bf8963957a639139617efdcf5e782be7..1d4393e6cafd722dd418b7ef2bc48993982d7d15 100644 (file)
--- a/epoll.c
+++ b/epoll.c
@@ -189,6 +189,7 @@ epoll_init(struct event_base *base)
          event_base, we can try to use timerfd to give them finer granularity.
        */
        if ((base->flags & EVENT_BASE_FLAG_PRECISE_TIMER) &&
+           !(base->flags & EVENT_BASE_FLAG_EPOLL_DISALLOW_TIMERFD) &&
            base->monotonic_timer.monotonic_clock == CLOCK_MONOTONIC) {
                int fd;
                fd = epollop->timerfd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK|TFD_CLOEXEC);
index 2dd5088a2bdf00ab65d917d61af10cb29ca465d8..85df418a8d1501241b3dc724e79d763fd06c9315 100644 (file)
@@ -570,7 +570,20 @@ enum event_base_config_flag {
            however, we use less efficient more precise timer, assuming one is
            present.
         */
-       EVENT_BASE_FLAG_PRECISE_TIMER = 0x20
+       EVENT_BASE_FLAG_PRECISE_TIMER = 0x20,
+
+       /** With EVENT_BASE_FLAG_PRECISE_TIMER,
+           epoll backend will use timerfd for more accurate timers, this will
+           allows to disable this.
+
+           That said that this is something in between lack of
+           (CLOCK_MONOTONIC_COARSE) and enabled EVENT_BASE_FLAG_PRECISE_TIMER
+           (CLOCK_MONOTONIC + timerfd).
+
+           This flag has no effect if you wind up using a backend other than
+           epoll and if you do not have EVENT_BASE_FLAG_PRECISE_TIMER enabled.
+        */
+       EVENT_BASE_FLAG_EPOLL_DISALLOW_TIMERFD = 0x40,
 };
 
 /**