From: Boram Park Date: Mon, 18 Apr 2016 11:19:18 +0000 (+0900) Subject: calling cancel_read if the main loop wakes up not by a wayland socket fd X-Git-Tag: accepted/tizen/ivi/20160418.235650^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=eae7d174823ed4fa2b0c6524cec6e23a2566af45;p=platform%2Fupstream%2Fefl.git calling cancel_read if the main loop wakes up not by a wayland socket fd Change-Id: I0a172bf4d77a14913e745f1e6507246f36484da8 --- diff --git a/src/lib/ecore/Ecore_Common.h b/src/lib/ecore/Ecore_Common.h index d969013..d84332c 100644 --- a/src/lib/ecore/Ecore_Common.h +++ b/src/lib/ecore/Ecore_Common.h @@ -176,6 +176,11 @@ EAPI void ecore_main_loop_select_func_set(Ecore_Select_Function func); */ EAPI Ecore_Select_Function ecore_main_loop_select_func_get(void); +typedef void (*Ecore_Awake_Cb)(void *data); + +EAPI Eina_Bool ecore_main_awake_handler_add(Ecore_Awake_Cb func, void *data); +EAPI void ecore_main_awake_handler_del(Ecore_Awake_Cb func); + /** * Request ecore to integrate GLib's main loop. * diff --git a/src/lib/ecore/ecore_glib.c b/src/lib/ecore/ecore_glib.c index e2586c1..80d48ff 100644 --- a/src/lib/ecore/ecore_glib.c +++ b/src/lib/ecore/ecore_glib.c @@ -168,6 +168,9 @@ _ecore_glib_select__locked(GMainContext *ctx, maxfds = (ecore_fds >= glib_fds) ? ecore_fds : glib_fds; ret = _ecore_glib_select_original(maxfds, rfds, wfds, efds, timeout); + _ecore_main_fdh_mark_active(rfds, wfds, efds); + _ecore_main_awake_handler_call(); + ret = _ecore_glib_context_poll_to (_ecore_glib_fds, reqfds, rfds, wfds, efds, ret); diff --git a/src/lib/ecore/ecore_main.c b/src/lib/ecore/ecore_main.c index 9c370d4..a3e0098 100644 --- a/src/lib/ecore/ecore_main.c +++ b/src/lib/ecore/ecore_main.c @@ -254,6 +254,8 @@ Ecore_Select_Function main_loop_select = NULL; # endif #endif +static Eina_List *awake_funcs = NULL; + #ifndef USE_G_MAIN_LOOP static double t1 = 0.0; static double t2 = 0.0; @@ -512,6 +514,52 @@ _ecore_main_fdh_epoll_mark_active(void) return ret; } +int +_ecore_main_fdh_mark_active(fd_set *rfds, fd_set *wfds, fd_set *exfds) +{ + Ecore_Fd_Handler *fdh; + Eina_List *l; + int ret = 0; + + if (HAVE_EPOLL && epoll_fd >= 0) + ret = _ecore_main_fdh_epoll_mark_active(); + else + { + EINA_INLIST_FOREACH(fd_handlers, fdh) + { + if (!fdh->delete_me) + { + if (FD_ISSET(fdh->fd, rfds)) + fdh->read_active = EINA_TRUE; + if (FD_ISSET(fdh->fd, wfds)) + fdh->write_active = EINA_TRUE; + if (FD_ISSET(fdh->fd, exfds)) + fdh->error_active = EINA_TRUE; + _ecore_try_add_to_call_list(fdh); + if (fdh->read_active || fdh->write_active || fdh->error_active) + ret++; + } + } + } + EINA_LIST_FOREACH(file_fd_handlers, l, fdh) + { + if (!fdh->delete_me) + { + if (FD_ISSET(fdh->fd, rfds)) + fdh->read_active = EINA_TRUE; + if (FD_ISSET(fdh->fd, wfds)) + fdh->write_active = EINA_TRUE; + if (FD_ISSET(fdh->fd, exfds)) + fdh->error_active = EINA_TRUE; + _ecore_try_add_to_call_list(fdh); + if (fdh->read_active || fdh->write_active || fdh->error_active) + ret++; + } + } + + return ret; +} + #ifdef USE_G_MAIN_LOOP static inline int @@ -1041,6 +1089,55 @@ ecore_main_loop_select_func_get(void) return main_loop_select; } +EAPI Eina_Bool +ecore_main_awake_handler_add(Ecore_Awake_Cb func, void *data) +{ + Ecore_Awake_Handler *handler; + + if (!func) return EINA_FALSE; + + handler = calloc(1, sizeof *handler); + if (!handler) return EINA_FALSE; + + handler->func = func; + handler->data = (void*)data; + awake_funcs = eina_list_append(awake_funcs, handler); + + return EINA_TRUE; +} + +EAPI void +ecore_main_awake_handler_del(Ecore_Awake_Cb func) +{ + Ecore_Awake_Handler *handler; + Eina_List *l, *ll; + + if (!func) return; + + EINA_LIST_FOREACH_SAFE(awake_funcs, l, ll, handler) + { + if (handler->func != func) + continue; + + awake_funcs = eina_list_remove(awake_funcs, handler); + free(handler); + break; + } +} + +void +_ecore_main_awake_handler_call(void) +{ + Ecore_Awake_Handler *handler; + Eina_List *l, *ll; + + EINA_LIST_FOREACH_SAFE(awake_funcs, l, ll, handler) + { + if (handler->func) + handler->func(handler->data); + } +} + Ecore_Fd_Handler * _ecore_main_fd_handler_add(int fd, Ecore_Fd_Handler_Flags flags, @@ -1335,6 +1432,8 @@ _ecore_main_shutdown(void) fd_handlers_to_delete = eina_list_free(fd_handlers_to_delete); if (file_fd_handlers) file_fd_handlers = eina_list_free(file_fd_handlers); + if (awake_funcs) + awake_funcs = eina_list_free(awake_funcs); fd_handlers_to_call = NULL; fd_handlers_to_call_current = NULL; @@ -1496,6 +1595,7 @@ _ecore_main_select(double timeout) } if (ret > 0) { +#ifndef HAVE_GLIB if (HAVE_EPOLL && epoll_fd >= 0) _ecore_main_fdh_epoll_mark_active(); else @@ -1527,10 +1627,16 @@ _ecore_main_select(double timeout) _ecore_try_add_to_call_list(fdh); } } +#endif _ecore_main_fd_handlers_cleanup(); #ifdef _WIN32 _ecore_main_win32_handlers_cleanup(); #endif + +#ifndef HAVE_GLIB + _ecore_main_awake_handler_call(); +#endif + return 1; } return 0; diff --git a/src/lib/ecore/ecore_private.h b/src/lib/ecore/ecore_private.h index 8262ede..eab53dd 100644 --- a/src/lib/ecore/ecore_private.h +++ b/src/lib/ecore/ecore_private.h @@ -204,6 +204,16 @@ int _ecore_pipe_wait(Ecore_Pipe *p, double wait); void *_ecore_pipe_del(Ecore_Pipe *p); +typedef struct _Ecore_Awake_Handler +{ + EINA_INLIST; + Ecore_Awake_Cb func; + void *data; +} Ecore_Awake_Handler; + +void _ecore_main_awake_handler_call(void); +int _ecore_main_fdh_mark_active(fd_set *rfds, fd_set *wfds, fd_set *exfds); + Ecore_Fd_Handler * _ecore_main_fd_handler_add(int fd, Ecore_Fd_Handler_Flags flags, diff --git a/src/lib/ecore_wayland/ecore_wl.c b/src/lib/ecore_wayland/ecore_wl.c index 7971ec7..104f693 100644 --- a/src/lib/ecore_wayland/ecore_wl.c +++ b/src/lib/ecore_wayland/ecore_wl.c @@ -4,6 +4,8 @@ #include #include +#include "Ecore.h" +#include "ecore_private.h" #include "ecore_wl_private.h" /* @@ -27,6 +29,7 @@ static int _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_pre_handle_data(void *data, Ecore_Fd_Handler *hdl); +static void _ecore_wl_cb_awake(void *data); 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_remove(void *data, struct wl_registry *registry EINA_UNUSED, unsigned int id); static Eina_Bool _ecore_wl_xkb_init(Ecore_Wl_Display *ewd); @@ -284,6 +287,8 @@ ecore_wl_init(const char *name) _ecore_wl_cb_pre_handle_data, _ecore_wl_disp); + ecore_main_awake_handler_add(_ecore_wl_cb_awake, _ecore_wl_disp); + _ecore_wl_disp->idle_enterer = ecore_idle_enterer_add(_ecore_wl_cb_idle_enterer, _ecore_wl_disp); @@ -606,6 +611,7 @@ _ecore_wl_shutdown(Eina_Bool close) _ecore_wl_events_shutdown(); _ecore_wl_window_shutdown(); + ecore_main_awake_handler_del(_ecore_wl_cb_awake); if (_ecore_wl_disp->fd_hdl) ecore_main_fd_handler_del(_ecore_wl_disp->fd_hdl); if (_ecore_wl_disp->idle_enterer) @@ -775,8 +781,11 @@ _ecore_wl_cb_handle_data(void *data, Ecore_Fd_Handler *hdl) return ECORE_CALLBACK_RENEW; cancel_read: - wl_display_cancel_read(ewd->wl.display); - ewd->wl.prepare_read = EINA_FALSE; + if (ewd->wl.prepare_read) + { + wl_display_cancel_read(ewd->wl.display); + ewd->wl.prepare_read = EINA_FALSE; + } return ECORE_CALLBACK_CANCEL; } @@ -812,6 +821,22 @@ _cb_global_event_free(void *data EINA_UNUSED, void *event) } static void +_ecore_wl_cb_awake(void *data) +{ + Ecore_Wl_Display *ewd; + Ecore_Fd_Handler_Flags flags = ECORE_FD_READ|ECORE_FD_WRITE|ECORE_FD_ERROR; + + if (_ecore_wl_fatal_error) return; + if (!(ewd = data)) return; + if (!ewd->wl.prepare_read) return; + if (ecore_main_fd_handler_active_get(_ecore_wl_disp->fd_hdl, flags)) + return; + + wl_display_cancel_read(ewd->wl.display); + ewd->wl.prepare_read = EINA_FALSE; +} + +static void _ecore_wl_cb_handle_global(void *data, struct wl_registry *registry, unsigned int id, const char *interface, unsigned int version) { Ecore_Wl_Display *ewd;