Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F145247838
D23801.id68691.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
16 KB
Referenced Files
None
Subscribers
None
D23801.id68691.diff
View Options
Index: devel/libepoll-shim/Makefile
===================================================================
--- devel/libepoll-shim/Makefile
+++ devel/libepoll-shim/Makefile
@@ -2,7 +2,7 @@
# $FreeBSD$
PORTNAME= libepoll-shim
-PORTVERSION= 0.0.20200212
+PORTVERSION= 0.0.20200222
CATEGORIES= devel
MAINTAINER= x11@FreeBSD.org
@@ -14,9 +14,9 @@
USES= cmake compiler:c11
USE_LDCONFIG= yes
USE_GITHUB= yes
-GH_ACCOUNT= FreeBSDDesktop
+GH_ACCOUNT= jiixyj
GH_PROJECT= epoll-shim
-GH_TAGNAME= 07e2a80
+GH_TAGNAME= 0d8f69f
do-test:
# Exclude certain tests in resource restricted environments
Index: devel/libepoll-shim/distinfo
===================================================================
--- devel/libepoll-shim/distinfo
+++ devel/libepoll-shim/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1581547152
-SHA256 (FreeBSDDesktop-epoll-shim-0.0.20200212-07e2a80_GH0.tar.gz) = 80444f72efd2756cf91b323cd8a0a7a9a02ecf81b4b107499ec047cdac651929
-SIZE (FreeBSDDesktop-epoll-shim-0.0.20200212-07e2a80_GH0.tar.gz) = 39959
+TIMESTAMP = 1582402151
+SHA256 (jiixyj-epoll-shim-0.0.20200222-0d8f69f_GH0.tar.gz) = 08d086ce1338d0c776958a9018e06569aaddab8d9375a72c30784a851ab202e1
+SIZE (jiixyj-epoll-shim-0.0.20200222-0d8f69f_GH0.tar.gz) = 42118
Index: graphics/wayland/Makefile
===================================================================
--- graphics/wayland/Makefile
+++ graphics/wayland/Makefile
@@ -22,6 +22,7 @@
LIB_DEPENDS= libexpat.so:textproc/expat2 \
libffi.so:devel/libffi \
libepoll-shim.so:devel/libepoll-shim
+RUN_DEPENDS= libepoll-shim>=0.0.20200222:devel/libepoll-shim
CFLAGS+= "-I${LOCALBASE}/include/libepoll-shim"
Index: graphics/wayland/files/patch-src_event-loop.c
===================================================================
--- graphics/wayland/files/patch-src_event-loop.c
+++ /dev/null
@@ -1,562 +0,0 @@
-Temporarily revert https://gitlab.freedesktop.org/wayland/wayland/commit/60a8d29ad852
-until https://github.com/jiixyj/epoll-shim/issues/15 is fixed
-
---- src/event-loop.c.orig 2020-02-11 23:46:03 UTC
-+++ src/event-loop.c
-@@ -23,7 +23,6 @@
- * SOFTWARE.
- */
-
--#include <assert.h>
- #include <stddef.h>
- #include <stdio.h>
- #include <errno.h>
-@@ -46,27 +45,6 @@
-
- /** \cond INTERNAL */
-
--#define TIMER_REMOVED -2
--
--struct wl_event_loop;
--struct wl_event_source_interface;
--struct wl_event_source_timer;
--
--struct wl_event_source {
-- struct wl_event_source_interface *interface;
-- struct wl_event_loop *loop;
-- struct wl_list link;
-- void *data;
-- int fd;
--};
--
--struct wl_timer_heap {
-- struct wl_event_source base;
-- /* pointers to the user-visible event sources */
-- struct wl_event_source_timer **data;
-- int space, active, count;
--};
--
- struct wl_event_loop {
- int epoll_fd;
- struct wl_list check_list;
-@@ -74,8 +52,6 @@ struct wl_event_loop {
- struct wl_list destroy_list;
-
- struct wl_signal destroy_signal;
--
-- struct wl_timer_heap timers;
- };
-
- struct wl_event_source_interface {
-@@ -83,6 +59,13 @@ struct wl_event_source_interface {
- struct epoll_event *ep);
- };
-
-+struct wl_event_source {
-+ struct wl_event_source_interface *interface;
-+ struct wl_event_loop *loop;
-+ struct wl_list link;
-+ void *data;
-+ int fd;
-+};
-
- struct wl_event_source_fd {
- struct wl_event_source base;
-@@ -232,319 +215,31 @@ wl_event_source_fd_update(struct wl_event_source *sour
- struct wl_event_source_timer {
- struct wl_event_source base;
- wl_event_loop_timer_func_t func;
-- struct wl_event_source_timer *next_due;
-- struct timespec deadline;
-- int heap_idx;
- };
-
--static int
--noop_dispatch(struct wl_event_source *source,
-- struct epoll_event *ep) {
-- return 0;
--}
-+/** \endcond */
-
--struct wl_event_source_interface timer_heap_source_interface = {
-- noop_dispatch,
--};
--
--static bool
--time_lt(struct timespec ta, struct timespec tb)
--{
-- if (ta.tv_sec != tb.tv_sec) {
-- return ta.tv_sec < tb.tv_sec;
-- }
-- return ta.tv_nsec < tb.tv_nsec;
--}
--
- static int
--set_timer(int timerfd, struct timespec deadline) {
-- struct itimerspec its;
--
-- its.it_interval.tv_sec = 0;
-- its.it_interval.tv_nsec = 0;
-- its.it_value = deadline;
-- return timerfd_settime(timerfd, TFD_TIMER_ABSTIME, &its, NULL);
--}
--
--static int
--clear_timer(int timerfd)
--{
-- struct itimerspec its;
--
-- its.it_interval.tv_sec = 0;
-- its.it_interval.tv_nsec = 0;
-- its.it_value.tv_sec = 0;
-- its.it_value.tv_nsec = 0;
-- return timerfd_settime(timerfd, 0, &its, NULL);
--}
--
--static void
--wl_timer_heap_init(struct wl_timer_heap *timers, struct wl_event_loop *loop)
--{
-- timers->base.fd = -1;
-- timers->base.data = NULL;
-- wl_list_init(&timers->base.link);
-- timers->base.interface = &timer_heap_source_interface;
-- timers->base.loop = loop;
--
-- loop->timers.data = NULL;
-- loop->timers.active = 0;
-- loop->timers.space = 0;
-- loop->timers.count = 0;
--}
--
--static void
--wl_timer_heap_release(struct wl_timer_heap *timers)
--{
-- if (timers->base.fd != -1) {
-- close(timers->base.fd);
-- }
-- free(timers->data);
--}
--
--static int
--wl_timer_heap_ensure_timerfd(struct wl_timer_heap *timers)
--{
-- struct epoll_event ep;
-- int timer_fd;
--
-- if (timers->base.fd != -1)
-- return 0;
--
-- memset(&ep, 0, sizeof ep);
-- ep.events = EPOLLIN;
-- ep.data.ptr = timers;
--
-- timer_fd = timerfd_create(CLOCK_MONOTONIC,
-- TFD_CLOEXEC | TFD_NONBLOCK);
-- if (timer_fd < 0)
-- return -1;
--
-- if (epoll_ctl(timers->base.loop->epoll_fd,
-- EPOLL_CTL_ADD, timer_fd, &ep) < 0) {
-- close(timer_fd);
-- return -1;
-- }
--
-- timers->base.fd = timer_fd;
-- return 0;
--}
--
--static int
--wl_timer_heap_reserve(struct wl_timer_heap *timers)
--{
-- struct wl_event_source_timer **n;
-- int new_space;
--
-- if (timers->count + 1 > timers->space) {
-- new_space = timers->space >= 8 ? timers->space * 2 : 8;
-- n = realloc(timers->data, (size_t)new_space * sizeof(*n));
-- if (!n) {
-- wl_log("Allocation failure when expanding timer list");
-- return -1;
-- }
-- timers->data = n;
-- timers->space = new_space;
-- }
--
-- timers->count++;
-- return 0;
--}
--
--static void
--wl_timer_heap_unreserve(struct wl_timer_heap *timers)
--{
-- struct wl_event_source_timer **n;
--
-- timers->count--;
--
-- if (timers->space >= 16 && timers->space >= 4 * timers->count) {
-- n = realloc(timers->data, (size_t)timers->space / 2 * sizeof(*n));
-- if (!n) {
-- wl_log("Reallocation failure when shrinking timer list");
-- return;
-- }
-- timers->data = n;
-- timers->space = timers->space / 2;
-- }
--}
--
--static int
--heap_set(struct wl_event_source_timer **data,
-- struct wl_event_source_timer *a,
-- int idx)
--{
-- int tmp;
--
-- tmp = a->heap_idx;
-- a->heap_idx = idx;
-- data[a->heap_idx] = a;
--
-- return tmp;
--}
--
--static void
--heap_sift_down(struct wl_event_source_timer **data,
-- int num_active,
-- struct wl_event_source_timer *source)
--{
-- struct wl_event_source_timer *child, *other_child;
-- int cursor_idx;
-- struct timespec key;
--
-- cursor_idx = source->heap_idx;
-- key = source->deadline;
-- while (1) {
-- int lchild_idx = cursor_idx * 2 + 1;
--
-- if (lchild_idx >= num_active) {
-- break;
-- }
--
-- child = data[lchild_idx];
-- if (lchild_idx + 1 < num_active) {
-- other_child = data[lchild_idx + 1];
-- if (time_lt(other_child->deadline, child->deadline))
-- child = other_child;
-- }
--
-- if (time_lt(child->deadline, key))
-- cursor_idx = heap_set(data, child, cursor_idx);
-- else
-- break;
-- }
--
-- heap_set(data, source, cursor_idx);
--}
--
--static void
--heap_sift_up(struct wl_event_source_timer **data,
-- struct wl_event_source_timer *source)
--{
-- int cursor_idx;
-- struct timespec key;
--
-- cursor_idx = source->heap_idx;
-- key = source->deadline;
-- while (cursor_idx > 0) {
-- struct wl_event_source_timer *parent =
-- data[(cursor_idx - 1) / 2];
--
-- if (time_lt(key, parent->deadline))
-- cursor_idx = heap_set(data, parent, cursor_idx);
-- else
-- break;
-- }
-- heap_set(data, source, cursor_idx);
--}
--
--/* requires timer be armed */
--static void
--wl_timer_heap_disarm(struct wl_timer_heap *timers,
-- struct wl_event_source_timer *source)
--{
-- struct wl_event_source_timer *last_end_evt;
-- int old_source_idx;
--
-- assert(source->heap_idx >= 0);
--
-- old_source_idx = source->heap_idx;
-- source->heap_idx = -1;
-- source->deadline.tv_sec = 0;
-- source->deadline.tv_nsec = 0;
--
-- last_end_evt = timers->data[timers->active - 1];
-- timers->data[timers->active - 1] = NULL;
-- timers->active--;
--
-- if (old_source_idx == timers->active)
-- return;
--
-- timers->data[old_source_idx] = last_end_evt;
-- last_end_evt->heap_idx = old_source_idx;
--
-- /* Move the displaced (active) element to its proper place.
-- * Only one of sift-down and sift-up will have any effect */
-- heap_sift_down(timers->data, timers->active, last_end_evt);
-- heap_sift_up(timers->data, last_end_evt);
--}
--
--/* requires timer be disarmed */
--static void
--wl_timer_heap_arm(struct wl_timer_heap *timers,
-- struct wl_event_source_timer *source,
-- struct timespec deadline)
--{
-- assert(source->heap_idx == -1);
--
-- source->deadline = deadline;
-- timers->data[timers->active] = source;
-- source->heap_idx = timers->active;
-- timers->active++;
-- heap_sift_up(timers->data, source);
--}
--
--
--static int
--wl_timer_heap_dispatch(struct wl_timer_heap *timers)
--{
-- struct timespec now;
-- struct wl_event_source_timer *root;
-- struct wl_event_source_timer *list_cursor = NULL, *list_tail = NULL;
--
-- clock_gettime(CLOCK_MONOTONIC, &now);
--
-- while (timers->active > 0) {
-- root = timers->data[0];
-- if (time_lt(now, root->deadline))
-- break;
--
-- wl_timer_heap_disarm(timers, root);
--
-- if (list_cursor == NULL)
-- list_cursor = root;
-- else
-- list_tail->next_due = root;
-- list_tail = root;
-- }
-- if (list_tail)
-- list_tail->next_due = NULL;
--
-- if (timers->active > 0) {
-- if (set_timer(timers->base.fd, timers->data[0]->deadline) < 0)
-- return -1;
-- } else {
-- if (clear_timer(timers->base.fd) < 0)
-- return -1;
-- }
--
-- /* Execute precisely the functions for events before `now`, in order.
-- * Because wl_event_loop_dispatch ignores return codes, do the same
-- * here as well */
-- for (; list_cursor; list_cursor = list_cursor->next_due) {
-- if (list_cursor->base.fd != TIMER_REMOVED)
-- list_cursor->func(list_cursor->base.data);
-- }
--
-- return 0;
--}
--
--static int
- wl_event_source_timer_dispatch(struct wl_event_source *source,
- struct epoll_event *ep)
- {
-- struct wl_event_source_timer *timer;
-+ struct wl_event_source_timer *timer_source =
-+ (struct wl_event_source_timer *) source;
-+ uint64_t expires;
-+ int len;
-
-- timer = wl_container_of(source, timer, base);
-- return timer->func(timer->base.data);
-+ len = read(source->fd, &expires, sizeof expires);
-+ if (!(len == -1 && errno == EAGAIN) && len != sizeof expires)
-+ /* Is there anything we can do here? Will this ever happen? */
-+ wl_log("timerfd read error: %s\n", strerror(errno));
-+
-+ return timer_source->func(timer_source->base.data);
- }
-
- struct wl_event_source_interface timer_source_interface = {
- wl_event_source_timer_dispatch,
- };
-
--/** \endcond */
--
- /** Create a timer event source
- *
- * \param loop The event loop that will process the new source.
-@@ -565,30 +260,16 @@ wl_event_loop_add_timer(struct wl_event_loop *loop,
- {
- struct wl_event_source_timer *source;
-
-- if (wl_timer_heap_ensure_timerfd(&loop->timers) < 0)
-- return NULL;
--
- source = malloc(sizeof *source);
- if (source == NULL)
- return NULL;
-
- source->base.interface = &timer_source_interface;
-- source->base.fd = -1;
-+ source->base.fd = timerfd_create(CLOCK_MONOTONIC,
-+ TFD_CLOEXEC | TFD_NONBLOCK);
- source->func = func;
-- source->base.loop = loop;
-- source->base.data = data;
-- wl_list_init(&source->base.link);
-- source->next_due = NULL;
-- source->deadline.tv_sec = 0;
-- source->deadline.tv_nsec = 0;
-- source->heap_idx = -1;
-
-- if (wl_timer_heap_reserve(&loop->timers) < 0) {
-- free(source);
-- return NULL;
-- }
--
-- return &source->base;
-+ return add_source(loop, &source->base, WL_EVENT_READABLE, data);
- }
-
- /** Arm or disarm a timer
-@@ -610,51 +291,15 @@ wl_event_loop_add_timer(struct wl_event_loop *loop,
- WL_EXPORT int
- wl_event_source_timer_update(struct wl_event_source *source, int ms_delay)
- {
-- struct wl_event_source_timer *tsource =
-- wl_container_of(source, tsource, base);
-- struct wl_timer_heap *timers = &tsource->base.loop->timers;
-+ struct itimerspec its;
-
-- if (ms_delay > 0) {
-- struct timespec deadline;
-+ its.it_interval.tv_sec = 0;
-+ its.it_interval.tv_nsec = 0;
-+ its.it_value.tv_sec = ms_delay / 1000;
-+ its.it_value.tv_nsec = (ms_delay % 1000) * 1000 * 1000;
-+ if (timerfd_settime(source->fd, 0, &its, NULL) < 0)
-+ return -1;
-
-- clock_gettime(CLOCK_MONOTONIC, &deadline);
--
-- deadline.tv_nsec += (ms_delay % 1000) * 1000000L;
-- deadline.tv_sec += ms_delay / 1000;
-- if (deadline.tv_nsec >= 1000000000L) {
-- deadline.tv_nsec -= 1000000000L;
-- deadline.tv_sec += 1;
-- }
--
-- if (tsource->heap_idx == -1) {
-- wl_timer_heap_arm(timers, tsource, deadline);
-- } else if (time_lt(deadline, tsource->deadline)) {
-- tsource->deadline = deadline;
-- heap_sift_up(timers->data, tsource);
-- } else {
-- tsource->deadline = deadline;
-- heap_sift_down(timers->data, timers->active, tsource);
-- }
--
-- if (tsource->heap_idx == 0) {
-- /* Only update the timerfd if the new deadline is
-- * the earliest */
-- if (set_timer(timers->base.fd, deadline) < 0)
-- return -1;
-- }
-- } else {
-- if (tsource->heap_idx == -1)
-- return 0;
-- wl_timer_heap_disarm(timers, tsource);
--
-- if (timers->active == 0) {
-- /* Only update the timerfd if this was the last
-- * active timer */
-- if (clear_timer(timers->base.fd) < 0)
-- return -1;
-- }
-- }
--
- return 0;
- }
-
-@@ -838,17 +483,6 @@ wl_event_source_remove(struct wl_event_source *source)
- source->fd = -1;
- }
-
-- if (source->interface == &timer_source_interface &&
-- source->fd != TIMER_REMOVED) {
-- /* Disarm the timer (and the loop's timerfd, if necessary),
-- * before removing its space in the loop timer heap */
-- wl_event_source_timer_update(source, 0);
-- wl_timer_heap_unreserve(&loop->timers);
-- /* Set the fd field to to indicate that the timer should NOT
-- * be dispatched in `wl_event_loop_dispatch` */
-- source->fd = TIMER_REMOVED;
-- }
--
- wl_list_remove(&source->link);
- wl_list_insert(&loop->destroy_list, &source->link);
-
-@@ -900,8 +534,6 @@ wl_event_loop_create(void)
-
- wl_signal_init(&loop->destroy_signal);
-
-- wl_timer_heap_init(&loop->timers, loop);
--
- return loop;
- }
-
-@@ -924,7 +556,6 @@ wl_event_loop_destroy(struct wl_event_loop *loop)
- wl_signal_emit(&loop->destroy_signal, loop);
-
- wl_event_loop_process_destroy_list(loop);
-- wl_timer_heap_release(&loop->timers);
- close(loop->epoll_fd);
- free(loop);
- }
-@@ -975,7 +606,7 @@ wl_event_loop_dispatch_idle(struct wl_event_loop *loop
- *
- * \param loop The event loop whose sources to wait for.
- * \param timeout The polling timeout in milliseconds.
-- * \return 0 for success, -1 for polling (or timer update) error.
-+ * \return 0 for success, -1 for polling error.
- *
- * All the associated event sources are polled. This function blocks until
- * any event source delivers an event (idle sources excluded), or the timeout
-@@ -997,29 +628,12 @@ wl_event_loop_dispatch(struct wl_event_loop *loop, int
- struct epoll_event ep[32];
- struct wl_event_source *source;
- int i, count;
-- bool has_timers = false;
-
- wl_event_loop_dispatch_idle(loop);
-
- count = epoll_wait(loop->epoll_fd, ep, ARRAY_LENGTH(ep), timeout);
- if (count < 0)
- return -1;
--
-- for (i = 0; i < count; i++) {
-- source = ep[i].data.ptr;
-- if (source == &loop->timers.base)
-- has_timers = true;
-- }
--
-- if (has_timers) {
-- /* Dispatch timer sources before non-timer sources, so that
-- * the non-timer sources can not cancel (by calling
-- * `wl_event_source_timer_update`) the dispatching of the timers
-- * (Note that timer sources also can't cancel pending non-timer
-- * sources, since epoll_wait has already been called) */
-- if (wl_timer_heap_dispatch(&loop->timers) < 0)
-- return -1;
-- }
-
- for (i = 0; i < count; i++) {
- source = ep[i].data.ptr;
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Feb 18, 2:12 PM (16 h, 37 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28847681
Default Alt Text
D23801.id68691.diff (16 KB)
Attached To
Mode
D23801: devel/libepoll-shim: update to 0.0.20200223
Attached
Detach File
Event Timeline
Log In to Comment