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. SVN revision: 81360
This commit is contained in:
parent
fa11a3507d
commit
58304e01ab
|
@ -87,6 +87,7 @@ struct _Ecore_Wl_Display
|
||||||
unsigned int mask;
|
unsigned int mask;
|
||||||
unsigned int serial;
|
unsigned int serial;
|
||||||
Ecore_Fd_Handler *fd_hdl;
|
Ecore_Fd_Handler *fd_hdl;
|
||||||
|
Ecore_Idle_Enterer *idle_enterer;
|
||||||
|
|
||||||
struct wl_list inputs;
|
struct wl_list inputs;
|
||||||
struct wl_list outputs;
|
struct wl_list outputs;
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
/* local function prototypes */
|
/* local function prototypes */
|
||||||
static Eina_Bool _ecore_wl_shutdown(Eina_Bool close);
|
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 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 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);
|
static Eina_Bool _ecore_wl_xkb_init(Ecore_Wl_Display *ewd);
|
||||||
|
@ -139,10 +140,13 @@ ecore_wl_init(const char *name)
|
||||||
|
|
||||||
_ecore_wl_disp->fd_hdl =
|
_ecore_wl_disp->fd_hdl =
|
||||||
ecore_main_fd_handler_add(_ecore_wl_disp->fd,
|
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,
|
_ecore_wl_cb_handle_data, _ecore_wl_disp,
|
||||||
NULL, NULL);
|
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->inputs);
|
||||||
wl_list_init(&_ecore_wl_disp->outputs);
|
wl_list_init(&_ecore_wl_disp->outputs);
|
||||||
|
|
||||||
|
@ -359,6 +363,8 @@ _ecore_wl_shutdown(Eina_Bool close)
|
||||||
|
|
||||||
if (_ecore_wl_disp->fd_hdl)
|
if (_ecore_wl_disp->fd_hdl)
|
||||||
ecore_main_fd_handler_del(_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)
|
if (close)
|
||||||
{
|
{
|
||||||
|
@ -399,10 +405,32 @@ _ecore_wl_shutdown(Eina_Bool close)
|
||||||
return _ecore_wl_init_count;
|
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
|
static Eina_Bool
|
||||||
_ecore_wl_cb_handle_data(void *data, Ecore_Fd_Handler *hdl)
|
_ecore_wl_cb_handle_data(void *data, Ecore_Fd_Handler *hdl)
|
||||||
{
|
{
|
||||||
Ecore_Wl_Display *ewd;
|
Ecore_Wl_Display *ewd;
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* LOGFN(__FILE__, __LINE__, __FUNCTION__); */
|
/* LOGFN(__FILE__, __LINE__, __FUNCTION__); */
|
||||||
|
|
||||||
|
@ -415,7 +443,15 @@ _ecore_wl_cb_handle_data(void *data, Ecore_Fd_Handler *hdl)
|
||||||
if (ecore_main_fd_handler_active_get(hdl, ECORE_FD_READ))
|
if (ecore_main_fd_handler_active_get(hdl, ECORE_FD_READ))
|
||||||
wl_display_dispatch(ewd->wl.display);
|
wl_display_dispatch(ewd->wl.display);
|
||||||
else if (ecore_main_fd_handler_active_get(hdl, ECORE_FD_WRITE))
|
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;
|
return ECORE_CALLBACK_RENEW;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue