From a3f102f742e51cc71e715a5c2ebcd7ad0ac21488 Mon Sep 17 00:00:00 2001 From: Alex Wu Date: Fri, 14 Dec 2012 19:00:53 +0000 Subject: [PATCH] Reverting 80476 and 80479. This solution is flawed and causes some weird collateral damages that need further investigation. All programs running with wayland engines are consuming 100% CPU. ecore-wayland: 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. Patch by: Alex Wu SVN revision: 80981 --- src/lib/ecore_wayland/ecore_wl.c | 36 ++------------------------------ 1 file changed, 2 insertions(+), 34 deletions(-) diff --git a/src/lib/ecore_wayland/ecore_wl.c b/src/lib/ecore_wayland/ecore_wl.c index 6297b06a2e..7f06a1d065 100644 --- a/src/lib/ecore_wayland/ecore_wl.c +++ b/src/lib/ecore_wayland/ecore_wl.c @@ -7,7 +7,6 @@ /* 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); @@ -139,11 +138,10 @@ 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_READ | ECORE_FD_WRITE, _ecore_wl_cb_handle_data, _ecore_wl_disp, NULL, NULL); - 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); @@ -398,32 +396,10 @@ _ecore_wl_shutdown(Eina_Bool close) return _ecore_wl_init_count; } -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__); */ @@ -436,15 +412,7 @@ _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)) - { - 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? */ - } - } + wl_display_flush(ewd->wl.display); return ECORE_CALLBACK_RENEW; }