evas: rely on ecore to reset evas rendering thread on fork.
authorCedric BAIL <cedric@osg.samsung.com>
Tue, 7 Nov 2017 23:47:28 +0000 (15:47 -0800)
committerCedric BAIL <cedric@osg.samsung.com>
Wed, 8 Nov 2017 00:08:39 +0000 (16:08 -0800)
src/lib/evas/common/evas_thread_render.c

index 84ea7b4..c823125 100644 (file)
@@ -1,5 +1,6 @@
 #include "evas_common_private.h"
 
+#include "Ecore.h"
 #include <assert.h>
 
 static Eina_Thread evas_thread_worker;
@@ -180,6 +181,43 @@ out:
    return NULL;
 }
 
+static void
+evas_thread_fork_reset(void *data EINA_UNUSED)
+{
+   if (!eina_lock_new(&evas_thread_queue_lock))
+     {
+        CRI("Could not create draw thread lock (%m)");
+        goto on_error;
+     }
+   if (!eina_condition_new(&evas_thread_queue_condition, &evas_thread_queue_lock))
+     {
+        CRI("Could not create draw thread condition (%m)");
+        goto on_error;
+     }
+
+   if (!eina_thread_create(&evas_thread_worker, EINA_THREAD_NORMAL, -1,
+                           evas_thread_worker_func, NULL))
+     {
+        CRI("Could not recreate draw thread.");
+        goto on_error;
+     }
+
+   return ;
+
+ on_error:
+   eina_lock_free(&evas_thread_queue_lock);
+   eina_condition_free(&evas_thread_queue_condition);
+
+   evas_thread_worker = 0;
+
+   free(evas_thread_queue_cache);
+   evas_thread_queue_cache = NULL;
+   evas_thread_queue_cache_max = 0;
+   eina_inarray_flush(&evas_thread_queue);
+
+   eina_threads_shutdown();
+}
+
 int
 evas_thread_init(void)
 {
@@ -189,6 +227,8 @@ evas_thread_init(void)
    exit_thread = EINA_FALSE;
    evas_thread_exited = 0;
 
+   ecore_init();
+
    if(!eina_threads_init())
      {
         CRI("Could not init eina threads");
@@ -215,6 +255,8 @@ evas_thread_init(void)
         goto fail_on_thread_creation;
      }
 
+   ecore_fork_reset_callback_add(evas_thread_fork_reset, NULL);
+
    return init_count;
 
 fail_on_thread_creation:
@@ -227,6 +269,7 @@ fail_on_lock_creation:
 fail_on_eina_thread_init:
    exit_thread = EINA_TRUE;
    evas_thread_exited = 1;
+   ecore_shutdown();
    return --init_count;
 }
 
@@ -244,8 +287,13 @@ evas_thread_shutdown(void)
    if (--init_count)
      return init_count;
 
+   if (!evas_thread_worker)
+     return init_count;
+
    eina_lock_take(&evas_thread_queue_lock);
 
+   ecore_fork_reset_callback_del(evas_thread_fork_reset, NULL);
+
    exit_thread = EINA_TRUE;
    eina_condition_signal(&evas_thread_queue_condition);
 
@@ -275,5 +323,7 @@ timeout_shutdown:
 
    eina_threads_shutdown();
 
+   ecore_shutdown();
+
    return 0;
 }