calling cancel_read if the main loop wakes up not by a wayland socket fd 66/66366/3 accepted/tizen/ivi/20160418.235650 accepted/tizen/mobile/20160418.235637 accepted/tizen/tv/20160418.235643 accepted/tizen/wearable/20160418.235629 submit/tizen/20160418.102309
authorBoram Park <boram1288.park@samsung.com>
Mon, 18 Apr 2016 11:19:18 +0000 (20:19 +0900)
committerBoram Park <boram1288.park@samsung.com>
Mon, 18 Apr 2016 11:56:17 +0000 (20:56 +0900)
Change-Id: I0a172bf4d77a14913e745f1e6507246f36484da8

src/lib/ecore/Ecore_Common.h
src/lib/ecore/ecore_glib.c
src/lib/ecore/ecore_main.c
src/lib/ecore/ecore_private.h
src/lib/ecore_wayland/ecore_wl.c

index d969013..d84332c 100644 (file)
@@ -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.
  *
index e2586c1..80d48ff 100644 (file)
@@ -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);
 
index 9c370d4..a3e0098 100644 (file)
@@ -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;
index 8262ede..eab53dd 100644 (file)
@@ -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,
index 7971ec7..104f693 100644 (file)
@@ -4,6 +4,8 @@
 
 #include <assert.h>
 #include <fcntl.h>
+#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;