compositor: cleanup 'pepper_efl_compositor_create' 39/241239/2
authorSeunghun Lee <shiin.lee@samsung.com>
Fri, 31 Jul 2020 16:17:53 +0000 (01:17 +0900)
committerSeunghun Lee <shiin.lee@samsung.com>
Wed, 19 Aug 2020 16:45:09 +0000 (01:45 +0900)
no functional changes

Change-Id: If799694d6c54134efd291f3ceb1ab99ff96e3033

src/lib/compositor.c

index 4b2230445a6d2fe9c953d531571dd0da84d038b5..a0b8c93c450b3d3f7cc579c56806a940a979c77c 100644 (file)
 static Eina_Hash *_comp_hash = NULL;
 static pthread_mutex_t _comp_hash_lock = PTHREAD_MUTEX_INITIALIZER;
 
+static Eina_Bool            _pepper_efl_compositor_init(void);
+static void                 _pepper_efl_compositor_shutdown(void);
+static pepper_efl_comp_t   *_pepper_efl_compositor_create(Evas_Object *win, const char *name);
+static void                 _pepper_efl_compositor_destroy(pepper_efl_comp_t *comp);
+
 static Eina_Bool
 _pepper_efl_compositor_cb_fd_read(void *data, Ecore_Fd_Handler *hdl EINA_UNUSED)
 {
@@ -185,23 +190,11 @@ pepper_efl_compositor_destroy(const char *name)
         return EINA_FALSE;
      }
 
-   _pepper_efl_compositor_output_all_del(comp);
-
-   pepper_efl_shell_shutdown();
-   tizen_policy_shutdown();
-
-   PE_FREE_FUNC(comp->input, pepper_efl_input_destroy);
-   PE_FREE_FUNC(comp->name, eina_stringshare_del);
-   PE_FREE_FUNC(comp->pepper.comp, pepper_compositor_destroy);
-   PE_FREE_FUNC(comp->fd_hdlr, ecore_main_fd_handler_del);
+   _pepper_efl_compositor_destroy(comp);
 
    eina_hash_del(_comp_hash, name, NULL);
    if (eina_hash_population(_comp_hash) == 0)
-     {
-        PE_FREE_FUNC(_comp_hash, eina_hash_free);
-        ecore_shutdown();
-        pepper_efl_log_shutdown();
-     }
+     _pepper_efl_compositor_shutdown();
 
    pthread_mutex_unlock(&_comp_hash_lock);
 
@@ -212,46 +205,112 @@ const char *
 pepper_efl_compositor_create(Evas_Object *win, const char *name)
 {
    pepper_efl_comp_t *comp;
-   Eina_Bool first_init = EINA_FALSE;
-   int loop_fd;
-   int socket_fd = -1;
-   const char *sock_name;
-   Eina_Bool res = EINA_FALSE;
+   Eina_Bool res, initted = EINA_FALSE;
 
    pthread_mutex_lock(&_comp_hash_lock);
 
-   if (_comp_hash)
+   if (!_comp_hash)
+     {
+        initted = _pepper_efl_compositor_init();
+        if (!initted)
+          {
+             fprintf(stderr, "failed to init compositor");
+             pthread_mutex_unlock(&_comp_hash_lock);
+             return NULL;
+          }
+     }
+   else if (name)
      {
         comp = eina_hash_find(_comp_hash, name);
-
         if (comp)
-          goto create_output;
+          {
+             res = _pepper_efl_compositor_output_add(comp, win);
+             if (!res)
+               {
+                  ERR("failed to add output");
+                  pthread_mutex_unlock(&_comp_hash_lock);
+                  return NULL;
+               }
+
+             goto found;
+          }
      }
-   else
+
+   comp = _pepper_efl_compositor_create(win, name);
+   if (!comp)
      {
-        first_init = EINA_TRUE;
+        ERR("failed to create pepper_efl_compositor");
+        if (initted)
+          _pepper_efl_compositor_shutdown();
+        pthread_mutex_unlock(&_comp_hash_lock);
+        return NULL;
+     }
 
-        _comp_hash = eina_hash_string_superfast_new(NULL);
+   eina_hash_add(_comp_hash, name, comp);
 
-        if (!pepper_efl_log_init("pepper-efl"))
-          {
-             fprintf(stderr, "failed to init log system\n");
-             goto err_log_init;
-          }
+found:
+   pthread_mutex_unlock(&_comp_hash_lock);
 
-        if (!ecore_init())
-          {
-             ERR("failed to init ecore");
-             goto err_ecore_init;
-          }
+   return comp->name;
+}
+
+static Eina_Bool
+_pepper_efl_compositor_init(void)
+{
+   Eina_Bool res;
+
+   res = pepper_efl_log_init("pepper-efl");
+   if (!res)
+     {
+        fprintf(stderr, "failed to init log system\n");
+        goto err_log;
      }
 
+   if (!ecore_init())
+     {
+        ERR("failed to init ecore");
+        goto err_ecore;
+     }
+
+   _comp_hash = eina_hash_string_superfast_new(NULL);
+   if (!_comp_hash)
+     {
+        ERR("failed to create hash for compositors");
+        goto err_hash;
+     }
+
+   return EINA_TRUE;
+
+err_hash:
+   ecore_shutdown();
+err_ecore:
+   pepper_efl_log_shutdown();
+err_log:
+   return EINA_FALSE;
+}
+
+static void
+_pepper_efl_compositor_shutdown(void)
+{
+   PE_FREE_FUNC(_comp_hash, eina_hash_free);
+   ecore_shutdown();
+   pepper_efl_log_shutdown();
+}
+
+static pepper_efl_comp_t *
+_pepper_efl_compositor_create(Evas_Object *win, const char *name)
+{
+   pepper_efl_comp_t *comp;
+   int loop_fd, socket_fd = -1;
+   const char *sock_name;
+
    DBG("create compositor");
-   comp = calloc(1, sizeof(pepper_efl_comp_t));
+
+   comp = (pepper_efl_comp_t *)calloc(1, sizeof *comp);
    if (!comp)
      {
         ERR("oom, alloc comp");
-        goto err_alloc;
+        return NULL;
      }
 
    comp->output_hash = eina_hash_pointer_new(NULL);
@@ -261,14 +320,14 @@ pepper_efl_compositor_create(Evas_Object *win, const char *name)
    if (socket_fd == -1)
      {
         ERR("failed to get socket_fd from server");
-        goto err_comp;
+        goto err_socket;
      }
 
    comp->pepper.comp = pepper_compositor_create_fd(name, socket_fd);
    if (!comp->pepper.comp)
      {
         ERR("failed to create pepper compositor");
-        goto err_comp;
+        goto err_pepper_comp;
      }
 
    if (!pepper_efl_shell_init(comp))
@@ -299,12 +358,17 @@ pepper_efl_compositor_create(Evas_Object *win, const char *name)
         goto err_input;
      }
 
-   eina_hash_add(_comp_hash, name, comp);
+   if (!_pepper_efl_compositor_output_add(comp, win))
+     {
+        ERR("failed to add output");
+        goto err_output;
+     }
+
    sock_name = pepper_compositor_get_socket_name(comp->pepper.comp);
    comp->name = eina_stringshare_add(sock_name);
    comp->wl.disp = pepper_compositor_get_display(comp->pepper.comp);
-
    comp->wl.loop = wl_display_get_event_loop(comp->wl.disp);
+
    loop_fd = wl_event_loop_get_fd(comp->wl.loop);
    comp->fd_hdlr =
       ecore_main_fd_handler_add(loop_fd, (ECORE_FD_READ | ECORE_FD_ERROR),
@@ -314,58 +378,36 @@ pepper_efl_compositor_create(Evas_Object *win, const char *name)
                                               _pepper_efl_compositor_cb_fd_prepare,
                                               comp);
 
-create_output:
-   res = _pepper_efl_compositor_output_add(comp, win);
-   if (!res)
-     {
-        ERR("failed to add output");
-
-        if (first_init)
-          goto err_output;
-
-        pthread_mutex_unlock(&_comp_hash_lock);
-
-        return NULL;
-     }
-
-   pthread_mutex_unlock(&_comp_hash_lock);
-
-   return comp->name;
+   return comp;
 
 err_output:
-   eina_hash_del(_comp_hash, name, comp);
-   eina_stringshare_del(comp->name);
-   ecore_main_fd_handler_del(comp->fd_hdlr);
-
+   pepper_efl_input_destroy(comp->input);
 err_input:
    wayland_tbm_server_deinit(comp->tbm_server);
-
 err_tbm:
    tizen_policy_shutdown();
-
 err_extension:
    pepper_efl_shell_shutdown();
-
 err_shell:
    pepper_compositor_destroy(comp->pepper.comp);
-
-err_comp:
-   eina_hash_free(comp->output_hash);
+err_pepper_comp:
+   close(socket_fd);
+err_socket:
    free(comp);
 
-err_alloc:
-   if (first_init)
-     {
-        ecore_shutdown();
-
-err_ecore_init:
-        pepper_efl_log_shutdown();
+   return NULL;
+}
 
-err_log_init:
-        PE_FREE_FUNC(_comp_hash, eina_hash_free);
-     }
+static void
+_pepper_efl_compositor_destroy(pepper_efl_comp_t *comp)
+{
+   _pepper_efl_compositor_output_all_del(comp);
 
-   pthread_mutex_unlock(&_comp_hash_lock);
+   pepper_efl_shell_shutdown();
+   tizen_policy_shutdown();
 
-   return NULL;
+   PE_FREE_FUNC(comp->input, pepper_efl_input_destroy);
+   PE_FREE_FUNC(comp->name, eina_stringshare_del);
+   PE_FREE_FUNC(comp->pepper.comp, pepper_compositor_destroy);
+   PE_FREE_FUNC(comp->fd_hdlr, ecore_main_fd_handler_del);
 }