ecore_evas: avoid crash during shutdown due to Ecore_Event queue.
authorCedric BAIL <cedric@osg.samsung.com>
Fri, 10 Mar 2017 00:11:07 +0000 (16:11 -0800)
committerCedric BAIL <cedric@osg.samsung.com>
Fri, 10 Mar 2017 00:17:58 +0000 (16:17 -0800)
src/lib/ecore_evas/ecore_evas.c
src/lib/ecore_evas/ecore_evas_ews.c
src/lib/ecore_evas/ecore_evas_extn.c
src/lib/ecore_evas/ecore_evas_private.h

index 8b53aab..bca08a1 100644 (file)
@@ -573,8 +573,12 @@ ecore_evas_shutdown(void)
      return _ecore_evas_init_count;
 
    eina_log_timing(_ecore_evas_log_dom,
-                  EINA_LOG_STATE_START,
-                  EINA_LOG_STATE_SHUTDOWN);
+                   EINA_LOG_STATE_START,
+                   EINA_LOG_STATE_SHUTDOWN);
+
+#ifdef BUILD_ECORE_EVAS_EWS
+   _ecore_evas_ews_events_flush();
+#endif
 
    while (ecore_evases) _ecore_evas_free(ecore_evases);
 
@@ -590,7 +594,7 @@ ecore_evas_shutdown(void)
    _ecore_evas_engine_shutdown();
    if (_ecore_evas_async_events_fd)
      ecore_main_fd_handler_del(_ecore_evas_async_events_fd);
-   
+
    ecore_fork_reset_callback_del(_ecore_evas_fork_cb, NULL);
 
    eina_log_domain_unregister(_ecore_evas_log_dom);
index 199c1d8..d67fa16 100644 (file)
@@ -705,6 +705,28 @@ _ecore_evas_ews_events_init(void)
    ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE = ecore_event_type_new();
 }
 
+void
+_ecore_evas_ews_events_flush(void)
+{
+   ecore_event_type_flush(ECORE_EVAS_EWS_EVENT_MANAGER_CHANGE,
+                          ECORE_EVAS_EWS_EVENT_ADD,
+                          ECORE_EVAS_EWS_EVENT_DEL,
+                          ECORE_EVAS_EWS_EVENT_RESIZE,
+                          ECORE_EVAS_EWS_EVENT_MOVE,
+                          ECORE_EVAS_EWS_EVENT_SHOW,
+                          ECORE_EVAS_EWS_EVENT_HIDE,
+                          ECORE_EVAS_EWS_EVENT_FOCUS,
+                          ECORE_EVAS_EWS_EVENT_UNFOCUS,
+                          ECORE_EVAS_EWS_EVENT_RAISE,
+                          ECORE_EVAS_EWS_EVENT_LOWER,
+                          ECORE_EVAS_EWS_EVENT_ACTIVATE,
+                          ECORE_EVAS_EWS_EVENT_ICONIFIED_CHANGE,
+                          ECORE_EVAS_EWS_EVENT_MAXIMIZED_CHANGE,
+                          ECORE_EVAS_EWS_EVENT_LAYER_CHANGE,
+                          ECORE_EVAS_EWS_EVENT_FULLSCREEN_CHANGE,
+                          ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
+}
+
 static int
 _ecore_evas_ews_init(void)
 {
index 8c3dee0..141bd78 100644 (file)
@@ -11,6 +11,7 @@ EAPI int ECORE_EVAS_EXTN_CLIENT_DEL = 0;
 void
 _ecore_evas_extn_init(void)
 {
+   if (ECORE_EVAS_EXTN_CLIENT_ADD != 0) return ;
    ECORE_EVAS_EXTN_CLIENT_ADD = ecore_event_type_new();
    ECORE_EVAS_EXTN_CLIENT_DEL = ecore_event_type_new();
 }
@@ -18,6 +19,6 @@ _ecore_evas_extn_init(void)
 void
 _ecore_evas_extn_shutdown(void)
 {
-   ECORE_EVAS_EXTN_CLIENT_ADD = 0;
-   ECORE_EVAS_EXTN_CLIENT_DEL = 0;
+   ecore_event_type_flush(ECORE_EVAS_EXTN_CLIENT_ADD,
+                          ECORE_EVAS_EXTN_CLIENT_DEL);
 }
index aa1d795..7400503 100644 (file)
@@ -443,6 +443,7 @@ EAPI void _ecore_evas_window_available_profiles_free(Ecore_Evas *ee);
 
 #ifdef BUILD_ECORE_EVAS_EWS
 void _ecore_evas_ews_events_init(void);
+void _ecore_evas_ews_events_flush(void);
 int _ecore_evas_ews_shutdown(void);
 #endif