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)
{
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);
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);
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))
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),
_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);
}