ecore main loop - fix fd handler clearning
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>
Sat, 23 Dec 2017 12:07:23 +0000 (21:07 +0900)
committerWonki Kim <wonki_.kim@samsung.com>
Wed, 10 Jan 2018 11:08:13 +0000 (20:08 +0900)
so loop object destruction was clearing out fd handlers but those may
be later deleted by destructors of child objects. so leave legacy
fdh's and just remove them from the list

src/lib/ecore/ecore_main.c
src/lib/ecore/efl_loop_handler.c

index 829535b..3a7d653 100644 (file)
@@ -1105,11 +1105,13 @@ _ecore_main_loop_clear(Eo *obj, Efl_Loop_Data *pd)
           }
 #endif
      }
+# ifdef HAVE_EPOLL
    if (pd->epoll_fd >= 0)
      {
         close(pd->epoll_fd);
         pd->epoll_fd = -1;
      }
+#endif
    if (pd->timer_fd >= 0)
      {
         close(pd->timer_fd);
@@ -1436,7 +1438,6 @@ _ecore_main_fd_handler_add(Eo                    *obj,
    pd->fd_handlers = (Ecore_Fd_Handler *)
      eina_inlist_append(EINA_INLIST_GET(pd->fd_handlers),
                         EINA_INLIST_GET(fdh));
-
    return fdh;
 }
 
@@ -1722,27 +1723,26 @@ _ecore_main_content_clear(Efl_Loop_Data *pd)
         if (fdh->handler) efl_del(fdh->handler);
         else
           {
-             ECORE_MAGIC_SET(fdh, ECORE_MAGIC_NONE);
-             ecore_fd_handler_mp_free(fdh);
+// XXX: can't do this because this fd handler is legacy and might
+// be cleaned up later in object destructors
+//             ECORE_MAGIC_SET(fdh, ECORE_MAGIC_NONE);
+//             ecore_fd_handler_mp_free(fdh);
           }
      }
-   if (pd)
-     {
-        if (pd->fd_handlers_with_buffer)
-          pd->fd_handlers_with_buffer =
-            eina_list_free(pd->fd_handlers_with_buffer);
-        if (pd->fd_handlers_with_prep)
-          pd->fd_handlers_with_prep =
-            eina_list_free(pd->fd_handlers_with_prep);
-        if (pd->file_fd_handlers)
-          pd->file_fd_handlers =
-            eina_list_free(pd->file_fd_handlers);
-        if (pd->fd_handlers_to_delete)
-          pd->fd_handlers_to_delete =
-            eina_list_free(pd->fd_handlers_to_delete);
-        pd->fd_handlers_to_call = NULL;
-        pd->fd_handlers_to_call_current = NULL;
-     }
+   if (pd->fd_handlers_with_buffer)
+     pd->fd_handlers_with_buffer =
+       eina_list_free(pd->fd_handlers_with_buffer);
+   if (pd->fd_handlers_with_prep)
+     pd->fd_handlers_with_prep =
+       eina_list_free(pd->fd_handlers_with_prep);
+   if (pd->file_fd_handlers)
+     pd->file_fd_handlers =
+       eina_list_free(pd->file_fd_handlers);
+   if (pd->fd_handlers_to_delete)
+     pd->fd_handlers_to_delete =
+       eina_list_free(pd->fd_handlers_to_delete);
+   pd->fd_handlers_to_call = NULL;
+   pd->fd_handlers_to_call_current = NULL;
 
    pd->do_quit = 0;
 
@@ -1784,7 +1784,6 @@ _ecore_main_shutdown(void)
         ERR("Calling ecore_shutdown() while still in the main loop!!!");
         return;
      }
-   _ecore_main_content_clear(pd);
 }
 
 static void
index 417e12d..7615652 100644 (file)
@@ -53,11 +53,15 @@ _handler_clear(Efl_Loop_Handler_Data *pd)
    Efl_Loop_Data *loop = pd->loop_data;
 
    if (pd->handler_fd)
-     _ecore_main_fd_handler_del(obj, loop, pd->handler_fd);
+     {
+        _ecore_main_fd_handler_del(obj, loop, pd->handler_fd);
+        pd->handler_fd = NULL;
+     }
    else if (pd->handler_win32)
-     _ecore_main_win32_handler_del(obj, loop, pd->handler_win32);
-   pd->handler_fd = NULL;
-   pd->handler_win32 = NULL;
+     {
+        _ecore_main_win32_handler_del(obj, loop, pd->handler_win32);
+        pd->handler_win32 = NULL;
+     }
 }
 
 static Ecore_Fd_Handler_Flags
@@ -108,18 +112,10 @@ _handler_reset(Eo *obj, Efl_Loop_Handler_Data *pd)
           _handler_active_update(obj, pd);
         else
           {
-             Ecore_Fd_Handler_Flags flags = _handler_flags_get(pd);
-
-             if (pd->file)
-               pd->handler_fd = _ecore_main_fd_handler_add
-                 (pd->loop, pd->loop_data, obj, pd->fd, flags,
-                  _cb_handler_fd, obj, buffer_func, buffer_data,
-                  EINA_TRUE);
-             else
-               pd->handler_fd = _ecore_main_fd_handler_add
-                 (pd->loop, pd->loop_data, obj, pd->fd, flags,
-                  _cb_handler_fd, obj, buffer_func, buffer_data,
-                  EINA_FALSE);
+             pd->handler_fd = _ecore_main_fd_handler_add
+               (pd->loop, pd->loop_data, obj, pd->fd, _handler_flags_get(pd),
+                _cb_handler_fd, obj, buffer_func, buffer_data,
+                pd->file ? EINA_TRUE : EINA_FALSE);
              if (pd->handler_fd) _handler_active_update(obj, pd);
           }
      }