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 waylanddisplay 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