cedric pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=0cd43b45d9fed2915dd8f91f57c003bd569b8160

commit 0cd43b45d9fed2915dd8f91f57c003bd569b8160
Author: Cedric BAIL <ced...@osg.samsung.com>
Date:   Thu Mar 9 16:11:07 2017 -0800

    ecore_evas: avoid crash during shutdown due to Ecore_Event queue.
---
 src/lib/ecore_evas/ecore_evas.c         | 10 +++++++---
 src/lib/ecore_evas/ecore_evas_ews.c     | 22 ++++++++++++++++++++++
 src/lib/ecore_evas/ecore_evas_extn.c    |  5 +++--
 src/lib/ecore_evas/ecore_evas_private.h |  1 +
 4 files changed, 33 insertions(+), 5 deletions(-)

diff --git a/src/lib/ecore_evas/ecore_evas.c b/src/lib/ecore_evas/ecore_evas.c
index 8b53aab..bca08a1 100644
--- a/src/lib/ecore_evas/ecore_evas.c
+++ b/src/lib/ecore_evas/ecore_evas.c
@@ -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);
diff --git a/src/lib/ecore_evas/ecore_evas_ews.c 
b/src/lib/ecore_evas/ecore_evas_ews.c
index 199c1d8..d67fa16 100644
--- a/src/lib/ecore_evas/ecore_evas_ews.c
+++ b/src/lib/ecore_evas/ecore_evas_ews.c
@@ -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)
 {
diff --git a/src/lib/ecore_evas/ecore_evas_extn.c 
b/src/lib/ecore_evas/ecore_evas_extn.c
index 8c3dee0..141bd78 100644
--- a/src/lib/ecore_evas/ecore_evas_extn.c
+++ b/src/lib/ecore_evas/ecore_evas_extn.c
@@ -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);
 }
diff --git a/src/lib/ecore_evas/ecore_evas_private.h 
b/src/lib/ecore_evas/ecore_evas_private.h
index aa1d795..7400503 100644
--- a/src/lib/ecore_evas/ecore_evas_private.h
+++ b/src/lib/ecore_evas/ecore_evas_private.h
@@ -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
 

-- 


Reply via email to