vblank: calculating SW target time properly
[platform/core/uifw/libtdm.git] / src / tdm_event_loop.c
index 4be20ce..32b7674 100644 (file)
@@ -60,25 +60,21 @@ typedef struct _tdm_event_loop_source_timer {
 static tdm_error
 _tdm_event_loop_main_fd_handler(int fd, tdm_event_loop_mask mask, void *user_data)
 {
-       tdm_private_display *private_display = (tdm_private_display*)user_data;
-       tdm_private_loop *private_loop;
+       tdm_private_module *private_module = (tdm_private_module*)user_data;
        tdm_func_display *func_display;
        tdm_error ret;
 
        TDM_RETURN_VAL_IF_FAIL(TDM_MUTEX_IS_LOCKED(), TDM_ERROR_OPERATION_FAILED);
-       TDM_RETURN_VAL_IF_FAIL(private_display != NULL, TDM_ERROR_OPERATION_FAILED);
-       TDM_RETURN_VAL_IF_FAIL(private_display->private_loop != NULL, TDM_ERROR_OPERATION_FAILED);
-
-       private_loop = private_display->private_loop;
+       TDM_RETURN_VAL_IF_FAIL(private_module != NULL, TDM_ERROR_OPERATION_FAILED);
 
-       if (tdm_debug_module & TDM_DEBUG_THREAD)
-               TDM_INFO("backend fd(%d) event happens", private_loop->backend_fd);
+       if (tdm_debug_module & TDM_DEBUG_EVENT)
+               TDM_INFO("backend fd(%d) event happens", private_module->fd);
 
-       func_display = &private_display->func_display;
+       func_display = &private_module->func_display;
        if (!func_display->display_handle_events)
                return TDM_ERROR_NONE;
 
-       ret = func_display->display_handle_events(private_display->bdata);
+       ret = func_display->display_handle_events(private_module->bdata);
 
        return ret;
 }
@@ -100,8 +96,6 @@ tdm_event_loop_init(tdm_private_display *private_display)
                return TDM_ERROR_OUT_OF_MEMORY;
        }
 
-       private_loop->backend_fd = -1;
-
        private_loop->wl_display = wl_display_create();
        if (!private_loop->wl_display) {
                TDM_ERR("creating a wayland display failed");
@@ -138,6 +132,8 @@ tdm_event_loop_init(tdm_private_display *private_display)
 INTERN void
 tdm_event_loop_deinit(tdm_private_display *private_display)
 {
+       tdm_private_module *private_module = NULL;
+
        TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED());
 
        if (!private_display->private_loop)
@@ -148,8 +144,12 @@ tdm_event_loop_deinit(tdm_private_display *private_display)
 
        tdm_server_deinit(private_display->private_loop);
 
-       if (private_display->private_loop->backend_source)
-               tdm_event_loop_source_remove(private_display->private_loop->backend_source);
+       LIST_FOR_EACH_ENTRY(private_module, &private_display->module_list, link) {
+               if (private_module->event_source)
+                       tdm_event_loop_source_remove(private_module->event_source);
+               private_module->event_source = NULL;
+               private_module->fd = -1;
+       }
 
        if (private_display->private_loop->wl_display)
                wl_display_destroy(private_display->private_loop->wl_display);
@@ -171,43 +171,42 @@ INTERN void
 tdm_event_loop_create_backend_source(tdm_private_display *private_display)
 {
        tdm_private_loop *private_loop = private_display->private_loop;
-       tdm_func_display *func_display;
+       tdm_private_module *private_module = NULL;
        tdm_error ret;
        int fd = -1;
 
        TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED());
        TDM_RETURN_IF_FAIL(private_loop != NULL);
 
-       func_display = &private_display->func_display;
-       if (!func_display->display_get_fd) {
-               TDM_INFO("TDM backend module won't offer a display fd");
-               return;
-       }
+       LIST_FOR_EACH_ENTRY(private_module, &private_display->module_list, link) {
+               tdm_func_display *func_display = &private_module->func_display;
 
-       ret = func_display->display_get_fd(private_display->bdata, &fd);
-       if (fd < 0) {
-               TDM_ERR("TDM backend module returns fd(%d)", fd);
-               return;
-       }
+               if (!func_display->display_get_fd) {
+                       TDM_INFO("TDM backend module won't offer a display fd");
+                       private_module->event_source = NULL;
+                       private_module->fd = -1;
+                       continue;
+               }
 
-       if (!func_display->display_handle_events) {
-               TDM_ERR("no display_handle_events function");
-               return;
-       }
+               ret = func_display->display_get_fd(private_module->bdata, &fd);
 
-       private_loop->backend_source =
-               tdm_event_loop_add_fd_handler(private_display, fd,
-                                                                         TDM_EVENT_LOOP_READABLE,
-                                                                         _tdm_event_loop_main_fd_handler,
-                                                                         private_display, &ret);
-       if (!private_loop->backend_source) {
-               TDM_ERR("no backend fd(%d) source", fd);
-               return;
-       }
+               assert(ret == TDM_ERROR_NONE && fd >= 0);
+               assert(func_display->display_handle_events);
 
-       private_loop->backend_fd = fd;
+               private_module->event_source =
+                       tdm_event_loop_add_fd_handler(private_display, fd,
+                                                                                 TDM_EVENT_LOOP_READABLE,
+                                                                                 _tdm_event_loop_main_fd_handler,
+                                                                                 private_module, &ret);
+               if (!private_module->event_source) {
+                       TDM_ERR("no backend fd(%d) source", fd);
+                       return;
+               }
 
-       TDM_INFO("backend fd(%d) source created", private_loop->backend_fd);
+               private_module->fd = fd;
+
+               TDM_INFO("backend fd(%d) source created", private_module->fd);
+       }
 }
 
 INTERN int
@@ -231,7 +230,7 @@ tdm_event_loop_dispatch(tdm_private_display *private_display)
 
        TDM_RETURN_VAL_IF_FAIL(private_loop->wl_loop != NULL, TDM_ERROR_OPERATION_FAILED);
 
-       if (tdm_debug_module & TDM_DEBUG_THREAD)
+       if (tdm_debug_module & TDM_DEBUG_EVENT)
                TDM_INFO("dispatch");
 
        if (tdm_thread_is_running() &&