Hi all, To fix the regression reported at http://trac.enlightenment.org/e/ticket/1993, I cooked the version 2 of this patch. Please checkout it out.
From e4ff96104075c972b24752e6799ac88acceccd48 Mon Sep 17 00:00:00 2001 From: Alex Wu <zhiwen...@linux.intel.com> Date: Mon, 17 Dec 2012 11:05:11 +0800 Subject: [PATCH] ecore-wayland: (version 2)Fix monitoring ECORE_FD_WRITE defaultly on wayland display fd lead to 100% cpu usage
In ecore_wl_init(), adding wayland display fd with ECORE_FD_WRITE flag make CPU usage 100%. The proper way to monitor the ECORE_FD_WRITE is when the wl_display_flush() return value < 0 and errno == EAGAIN. And if wl_display_flush() return, we remove ECORE_FD_WRITE flag from the display fd. Change from v1: Add idle enterer destroy code into _ecore_wl_shutdown() to avoid using freed wl_display. --- trunk/efl/src/lib/ecore_wayland/Ecore_Wayland.h | 1 + trunk/efl/src/lib/ecore_wayland/ecore_wl.c | 40 +++++++++++++++++++++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/trunk/efl/src/lib/ecore_wayland/Ecore_Wayland.h b/trunk/efl/src/lib/ecore_wayland/Ecore_Wayland.h index 5281c6f..eadfc14 100644 --- a/trunk/efl/src/lib/ecore_wayland/Ecore_Wayland.h +++ b/trunk/efl/src/lib/ecore_wayland/Ecore_Wayland.h @@ -87,6 +87,7 @@ struct _Ecore_Wl_Display unsigned int mask; unsigned int serial; Ecore_Fd_Handler *fd_hdl; + Ecore_Idle_Enterer *idle_enterer; struct wl_list inputs; struct wl_list outputs; diff --git a/trunk/efl/src/lib/ecore_wayland/ecore_wl.c b/trunk/efl/src/lib/ecore_wayland/ecore_wl.c index 7f06a1d..3e5bc8f 100644 --- a/trunk/efl/src/lib/ecore_wayland/ecore_wl.c +++ b/trunk/efl/src/lib/ecore_wayland/ecore_wl.c @@ -7,6 +7,7 @@ /* local function prototypes */ static Eina_Bool _ecore_wl_shutdown(Eina_Bool close); +static Eina_Bool _ecore_wl_cb_idle_enterer(void *data); static Eina_Bool _ecore_wl_cb_handle_data(void *data, Ecore_Fd_Handler *hdl); static void _ecore_wl_cb_handle_global(void *data, struct wl_registry *registry, unsigned int id, const char *interface, unsigned int version EINA_UNUSED); static Eina_Bool _ecore_wl_xkb_init(Ecore_Wl_Display *ewd); @@ -138,10 +139,13 @@ ecore_wl_init(const char *name) _ecore_wl_disp->fd_hdl = ecore_main_fd_handler_add(_ecore_wl_disp->fd, - ECORE_FD_READ | ECORE_FD_WRITE, + ECORE_FD_READ, _ecore_wl_cb_handle_data, _ecore_wl_disp, NULL, NULL); + _ecore_wl_disp->idle_enterer = + ecore_idle_enterer_add(_ecore_wl_cb_idle_enterer, _ecore_wl_disp); + wl_list_init(&_ecore_wl_disp->inputs); wl_list_init(&_ecore_wl_disp->outputs); @@ -356,6 +360,8 @@ _ecore_wl_shutdown(Eina_Bool close) if (_ecore_wl_disp->fd_hdl) ecore_main_fd_handler_del(_ecore_wl_disp->fd_hdl); + if (_ecore_wl_disp->idle_enterer) + ecore_idle_enterer_del(_ecore_wl_disp->idle_enterer); if (close) { @@ -397,9 +403,31 @@ _ecore_wl_shutdown(Eina_Bool close) } static Eina_Bool +_ecore_wl_cb_idle_enterer(void *data) +{ + Ecore_Wl_Display *ewd; + int ret; + + if (!(ewd = data)) return ECORE_CALLBACK_RENEW; + + ret = wl_display_flush(ewd->wl.display); + if (ret < 0 && errno == EAGAIN) + { + ecore_main_fd_handler_active_set(ewd->fd_hdl, ECORE_FD_READ | ECORE_FD_WRITE); + } + else if (ret < 0) + { + /* FIXME: need do error processing? */ + } + + return ECORE_CALLBACK_RENEW; +} + +static Eina_Bool _ecore_wl_cb_handle_data(void *data, Ecore_Fd_Handler *hdl) { Ecore_Wl_Display *ewd; + int ret; /* LOGFN(__FILE__, __LINE__, __FUNCTION__); */ @@ -412,7 +440,15 @@ _ecore_wl_cb_handle_data(void *data, Ecore_Fd_Handler *hdl) if (ecore_main_fd_handler_active_get(hdl, ECORE_FD_READ)) wl_display_dispatch(ewd->wl.display); else if (ecore_main_fd_handler_active_get(hdl, ECORE_FD_WRITE)) - wl_display_flush(ewd->wl.display); + { + ret = wl_display_flush(ewd->wl.display); + if (ret == 0) + ecore_main_fd_handler_active_set(hdl, ECORE_FD_READ); + else if (ret == -1 && errno != EAGAIN) + { + /* FIXME: need do error processing? */ + } + } return ECORE_CALLBACK_RENEW; } -- 1.7.9.5
_______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel