rename tdm_event to tdm_event_loop 32/65532/1
authorBoram Park <boram1288.park@samsung.com>
Fri, 1 Apr 2016 04:51:34 +0000 (13:51 +0900)
committerBoram Park <boram1288.park@samsung.com>
Mon, 11 Apr 2016 10:33:03 +0000 (19:33 +0900)
Change-Id: Ied704a81006333d47a87206adb0cc7e44b981562

include/tdm_backend.h
include/tdm_types.h
src/Makefile.am
src/tdm.c
src/tdm_display.c
src/tdm_event.c [deleted file]
src/tdm_event_loop.c [new file with mode: 0644]
src/tdm_private.h
src/tdm_thread.c

index e5837b95810041d5911f0f5787d8e24123f19859..ca4c420dd44afa3af7a14f1dfc3b340b5b3a13d4 100644 (file)
@@ -939,23 +939,23 @@ tdm_buffer_remove_destroy_handler(tbm_surface_h buffer,
                                   tdm_buffer_destroy_handler func, void *user_data);
 
 
-tdm_event_source*
-tdm_event_add_fd_handler(tdm_display *dpy, int fd, tdm_event_mask mask,
-                         tdm_event_fd_handler func, void *user_data,
+tdm_event_loop_source*
+tdm_event_loop_add_fd_handler(tdm_display *dpy, int fd, tdm_event_loop_mask mask,
+                         tdm_event_loop_fd_handler func, void *user_data,
                          tdm_error *error);
 
 tdm_error
-tdm_event_source_fd_update(tdm_event_source *source, tdm_event_mask mask);
+tdm_event_loop_source_fd_update(tdm_event_loop_source *source, tdm_event_loop_mask mask);
 
-tdm_event_source*
-tdm_event_add_timer_handler(tdm_display *dpy, tdm_event_timer_handler func,
+tdm_event_loop_source*
+tdm_event_loop_add_timer_handler(tdm_display *dpy, tdm_event_loop_timer_handler func,
                             void *user_data, tdm_error *error);
 
 tdm_error
-tdm_event_source_timer_update(tdm_event_source *source, int ms_delay);
+tdm_event_loop_source_timer_update(tdm_event_loop_source *source, int ms_delay);
 
 void
-tdm_event_source_remove(tdm_event_source *source);
+tdm_event_loop_source_remove(tdm_event_loop_source *source);
 
 #ifdef __cplusplus
 }
index 523698257ac3a91b740ac6c51b82a4a4108bad3f..6ca3c83f8025e8fb58076df66aa5b5f7c55005ab 100755 (executable)
@@ -226,11 +226,11 @@ typedef enum {
 
 typedef enum
 {
-       TDM_EVENT_READABLE = (1 << 0),
-       TDM_EVENT_WRITABLE = (1 << 1),
-       TDM_EVENT_HANGUP   = (1 << 2),
-       TDM_EVENT_ERROR    = (1 << 3),
-} tdm_event_mask;
+       TDM_EVENT_LOOP_READABLE = (1 << 0),
+       TDM_EVENT_LOOP_WRITABLE = (1 << 1),
+       TDM_EVENT_LOOP_HANGUP   = (1 << 2),
+       TDM_EVENT_LOOP_ERROR    = (1 << 3),
+} tdm_event_loop_mask;
 
 /**
  * @brief The output mode structure
@@ -366,17 +366,17 @@ typedef void (*tdm_output_commit_handler)(tdm_output *output, unsigned int seque
 /**
  * @brief The tdm event source
  */
-typedef void tdm_event_source;
+typedef void tdm_event_loop_source;
 
 /**
  * @brief The fd source handler
  */
-typedef tdm_error (*tdm_event_fd_handler)(int fd, tdm_event_mask mask, void *user_data);
+typedef tdm_error (*tdm_event_loop_fd_handler)(int fd, tdm_event_loop_mask mask, void *user_data);
 
 /**
  * @brief The timer source handler
  */
-typedef tdm_error (*tdm_event_timer_handler)(void *user_data);
+typedef tdm_error (*tdm_event_loop_timer_handler)(void *user_data);
 
 #ifdef __cplusplus
 }
index 5a2ee06920f54eece2cc98c78b4e4919ec0b36c0..ee26b0beeceb70bf474fface75a1c060c6126be1 100644 (file)
@@ -11,7 +11,7 @@ libtdm_la_LIBADD = $(TDM_LIBS) -ldl -lpthread
 
 libtdm_la_SOURCES = \
        tdm_backend.c \
-       tdm_event.c \
+       tdm_event_loop.c \
        tdm_thread.c \
        tdm_helper.c \
        tdm_buffer.c \
index 1d279f31da2aa2f6e90123650b3988ef12d8771e..849efb89d71c96ed0947e6e1c9542ee1bd7a76bf 100644 (file)
--- a/src/tdm.c
+++ b/src/tdm.c
@@ -809,7 +809,7 @@ tdm_display_init(tdm_error *error)
                goto failed_mutex_init;
        }
 
-       ret = tdm_event_init(private_display);
+       ret = tdm_event_loop_init(private_display);
        if (ret != TDM_ERROR_NONE)
                goto failed_event;
 
@@ -827,7 +827,7 @@ tdm_display_init(tdm_error *error)
        if (ret != TDM_ERROR_NONE)
                goto failed_update;
 
-       tdm_event_create_backend_source(private_display);
+       tdm_event_loop_create_backend_source(private_display);
 
        private_display->init_count = 1;
 
@@ -845,7 +845,7 @@ failed_update:
 failed_load:
        tdm_thread_deinit(private_display);
 failed_thread:
-       tdm_event_deinit(private_display);
+       tdm_event_loop_deinit(private_display);
 failed_event:
        pthread_mutex_destroy(&private_display->lock);
 failed_mutex_init:
@@ -878,7 +878,7 @@ tdm_display_deinit(tdm_display *dpy)
        _pthread_mutex_lock(&private_display->lock);
 
        tdm_thread_deinit(private_display);
-       tdm_event_deinit(private_display);
+       tdm_event_loop_deinit(private_display);
 
        _tdm_display_destroy_private_display(private_display);
        _tdm_display_unload_module(private_display);
index 5ca4b4707df7e567d2dc2f5e767d6da659c29ce7..76b4ba4f8ea387dc4059b08891c1fbcbbfb3bbc2 100644 (file)
@@ -343,7 +343,7 @@ tdm_display_get_fd(tdm_display *dpy, int *fd)
        if (private_display->private_thread)
                *fd = tdm_thread_get_fd(private_display);
        else
-               *fd = tdm_event_get_fd(private_display);
+               *fd = tdm_event_loop_get_fd(private_display);
 
        _pthread_mutex_unlock(&private_display->lock);
 
@@ -385,7 +385,7 @@ tdm_display_handle_events(tdm_display *dpy)
        if (private_display->private_thread)
                ret = tdm_thread_handle_cb(private_display);
        else
-               ret = tdm_event_dispatch(private_display);
+               ret = tdm_event_loop_dispatch(private_display);
 
        _pthread_mutex_unlock(&private_display->lock);
 
diff --git a/src/tdm_event.c b/src/tdm_event.c
deleted file mode 100644 (file)
index 05cfa60..0000000
+++ /dev/null
@@ -1,425 +0,0 @@
-/**************************************************************************
-
-libtdm
-
-Copyright 2015 Samsung Electronics co., Ltd. All Rights Reserved.
-
-Contact: Eunchul Kim <chulspro.kim@samsung.com>,
-         JinYoung Jeon <jy0.jeon@samsung.com>,
-         Taeheon Kim <th908.kim@samsung.com>,
-         YoungJun Cho <yj44.cho@samsung.com>,
-         SooChan Lim <sc1.lim@samsung.com>,
-         Boram Park <sc1.lim@samsung.com>
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sub license, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice (including the
-next paragraph) shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
-IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
-ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-**************************************************************************/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "tdm.h"
-#include "tdm_private.h"
-#include "tdm_list.h"
-
-#include <wayland-server-core.h>
-
-struct _tdm_private_event {
-       struct wl_display *wl_display;
-       struct wl_event_loop *event_loop;
-
-       int backend_fd;
-       tdm_event_source *backend_source;
-
-       struct wl_display *wl_display2;
-       struct wl_event_loop *event_loop2;
-};
-
-typedef struct _tdm_event_source_base
-{
-       struct wl_event_source *wl_source;
-} tdm_event_source_base;
-
-typedef struct _tdm_event_source_fd
-{
-       tdm_event_source_base base;
-       tdm_private_display *private_display;
-       tdm_event_fd_handler func;
-       void *user_data;
-} tdm_event_source_fd;
-
-typedef struct _tdm_event_source_timer
-{
-       tdm_event_source_base base;
-       tdm_private_display *private_display;
-       tdm_event_timer_handler func;
-       void *user_data;
-} tdm_event_source_timer;
-
-static tdm_error
-_tdm_event_main_fd_handler(int fd, tdm_event_mask mask, void *user_data)
-{
-       tdm_private_display *private_display = (tdm_private_display*)user_data;
-       tdm_private_event *private_event;
-       tdm_func_display *func_display;
-
-       TDM_RETURN_VAL_IF_FAIL(private_display != NULL, TDM_ERROR_OPERATION_FAILED);
-       TDM_RETURN_VAL_IF_FAIL(private_display->private_event != NULL, TDM_ERROR_OPERATION_FAILED);
-
-       private_event = private_display->private_event;
-
-       if (tdm_debug_thread)
-               TDM_INFO("backend fd(%d) event happens", private_event->backend_fd);
-
-       func_display = &private_display->func_display;
-       if (!func_display->display_handle_events)
-               return TDM_ERROR_NONE;
-
-       return func_display->display_handle_events(private_display->bdata);
-}
-
-INTERN tdm_error
-tdm_event_init(tdm_private_display *private_display)
-{
-       tdm_private_event *private_event;
-
-       if (private_display->private_event)
-               return TDM_ERROR_NONE;
-
-       private_event = calloc(1, sizeof *private_event);
-       if (!private_event) {
-               TDM_ERR("alloc failed");
-               return TDM_ERROR_OUT_OF_MEMORY;
-       }
-
-       private_event->backend_fd = -1;
-
-       private_event->wl_display = wl_display_create();
-       if (!private_event->wl_display) {
-               TDM_ERR("creating a wayland display failed");
-               free(private_event);
-               return TDM_ERROR_OUT_OF_MEMORY;
-       }
-
-       private_event->event_loop = wl_display_get_event_loop(private_event->wl_display);
-       if (!private_event->event_loop) {
-               TDM_ERR("no event loop");
-               wl_display_destroy(private_event->wl_display);
-               free(private_event);
-               return TDM_ERROR_OUT_OF_MEMORY;
-       }
-
-       TDM_INFO("event loop fd(%d)", wl_event_loop_get_fd(private_event->event_loop));
-
-       private_event->wl_display2 = wl_display_create();
-       if (!private_event->wl_display2) {
-               TDM_ERR("creating a wayland display2 failed");
-               return TDM_ERROR_OUT_OF_MEMORY;
-       }
-
-       private_event->event_loop2 = wl_display_get_event_loop(private_event->wl_display2);
-       if (!private_event->event_loop2) {
-               TDM_ERR("no event loop2");
-               wl_display_destroy(private_event->wl_display2);
-               private_event->wl_display2 = NULL;
-               return TDM_ERROR_OUT_OF_MEMORY;
-       }
-
-       private_display->private_event = private_event;
-
-       return TDM_ERROR_NONE;
-}
-
-INTERN void
-tdm_event_deinit(tdm_private_display *private_display)
-{
-       if (!private_display->private_event)
-               return;
-
-       if (private_display->private_event->backend_source)
-               tdm_event_source_remove(private_display->private_event->backend_source);
-
-       if (private_display->private_event->wl_display)
-               wl_display_destroy(private_display->private_event->wl_display);
-
-       free(private_display->private_event);
-       private_display->private_event = NULL;
-}
-
-INTERN void
-tdm_event_create_backend_source(tdm_private_display *private_display)
-{
-       tdm_private_event *private_event = private_display->private_event;
-       tdm_func_display *func_display;
-       tdm_error ret;
-       int fd = -1;
-
-       TDM_RETURN_IF_FAIL(private_event != 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;
-       }
-
-       ret = func_display->display_get_fd(private_display->bdata, &fd);
-       if (fd < 0) {
-               TDM_WRN("TDM backend module returns fd(%d)", fd);
-               return;
-       }
-
-       if (!func_display->display_handle_events) {
-               TDM_ERR("no display_handle_events function");
-               return;
-       }
-
-       private_event->backend_source =
-               tdm_event_add_fd_handler(private_display, fd, TDM_EVENT_READABLE,
-                                        _tdm_event_main_fd_handler, private_display,
-                                        &ret);
-       if (!private_event->backend_source) {
-               TDM_ERR("no backend fd(%d) source", fd);
-               return;
-       }
-
-       private_event->backend_fd = fd;
-
-       TDM_INFO("backend fd(%d) source created", private_event->backend_fd);
-}
-
-INTERN int
-tdm_event_get_fd(tdm_private_display *private_display)
-{
-       tdm_private_event *private_event = private_display->private_event;
-
-       TDM_RETURN_VAL_IF_FAIL(private_event->event_loop != NULL, -1);
-
-       return wl_event_loop_get_fd(private_event->event_loop);
-}
-
-INTERN tdm_error
-tdm_event_dispatch(tdm_private_display *private_display)
-{
-       tdm_private_event *private_event = private_display->private_event;
-
-       TDM_RETURN_VAL_IF_FAIL(private_event->event_loop != NULL, TDM_ERROR_OPERATION_FAILED);
-
-       if (tdm_debug_thread)
-               TDM_INFO("dispatch");
-
-       /* Don't set timeout to -1. It can make deadblock by two mutex locks.
-        * If need to set -1, use poll() and call tdm_event_dispatch() after
-        * escaping polling.
-        */
-       if (wl_event_loop_dispatch(private_event->event_loop, 0) < 0)
-               TDM_ERR("dispatch failed");
-
-       return TDM_ERROR_NONE;
-}
-
-INTERN tdm_error
-tdm_event_add_socket(tdm_private_display *private_display, const char *name)
-{
-       tdm_private_event *private_event = private_display->private_event;
-
-       TDM_RETURN_VAL_IF_FAIL(private_event->wl_display != NULL, TDM_ERROR_OPERATION_FAILED);
-
-       if (wl_display_add_socket(private_event->wl_display, name) < 0) {
-               TDM_ERR("add socket(\"%s\") failed", name);
-               return TDM_ERROR_OPERATION_FAILED;
-       }
-
-       return TDM_ERROR_NONE;
-}
-
-static int
-_tdm_event_loop_fd_func(int fd, uint32_t wl_mask, void *data)
-{
-       tdm_event_source_fd *fd_source = (tdm_event_source_fd*)data;
-       tdm_event_mask mask = 0;
-
-       TDM_RETURN_VAL_IF_FAIL(fd_source, 1);
-       TDM_RETURN_VAL_IF_FAIL(fd_source->func, 1);
-
-       if (wl_mask & WL_EVENT_READABLE)
-               mask |= TDM_EVENT_READABLE;
-       if (wl_mask & WL_EVENT_WRITABLE)
-               mask |= TDM_EVENT_WRITABLE;
-       if (wl_mask & WL_EVENT_HANGUP)
-               mask |= TDM_EVENT_HANGUP;
-       if (wl_mask & WL_EVENT_ERROR)
-               mask |= TDM_EVENT_ERROR;
-
-       fd_source->func(fd, mask, fd_source->user_data);
-
-       return 1;
-}
-
-EXTERN tdm_event_source*
-tdm_event_add_fd_handler(tdm_display *dpy, int fd, tdm_event_mask mask,
-                         tdm_event_fd_handler func, void *user_data,
-                         tdm_error *error)
-{
-       tdm_private_display *private_display;
-       tdm_private_event *private_event;
-       tdm_event_source_fd *fd_source;
-       uint32_t wl_mask = 0;
-       tdm_error ret;
-
-       TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(dpy, TDM_ERROR_INVALID_PARAMETER, NULL);
-       TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(fd >= 0, TDM_ERROR_INVALID_PARAMETER, NULL);
-       TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(func, TDM_ERROR_INVALID_PARAMETER, NULL);
-
-       private_display = (tdm_private_display*)dpy;
-       private_event = private_display->private_event;
-       TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(private_event, TDM_ERROR_INVALID_PARAMETER, NULL);
-       TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(private_event->event_loop, TDM_ERROR_INVALID_PARAMETER, NULL);
-
-       fd_source = calloc(1, sizeof(tdm_event_source_fd));
-       TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(fd_source, TDM_ERROR_OUT_OF_MEMORY, NULL);
-
-       if (mask & TDM_EVENT_READABLE)
-               wl_mask |= WL_EVENT_READABLE;
-       if (mask & TDM_EVENT_WRITABLE)
-               wl_mask |= WL_EVENT_WRITABLE;
-
-       fd_source->base.wl_source =
-               wl_event_loop_add_fd(private_event->event_loop,
-                                    fd, wl_mask, _tdm_event_loop_fd_func, fd_source);
-       if (!fd_source->base.wl_source) {
-               if (error)
-                       *error = TDM_ERROR_OUT_OF_MEMORY;
-               free(fd_source);
-               return NULL;
-       }
-
-       fd_source->private_display = private_display;
-       fd_source->func = func;
-       fd_source->user_data = user_data;
-
-       if (error)
-               *error = TDM_ERROR_NONE;
-
-       return (tdm_event_source*)fd_source;
-}
-
-EXTERN tdm_error
-tdm_event_source_fd_update(tdm_event_source *source, tdm_event_mask mask)
-{
-       tdm_event_source_fd *fd_source = source;
-       uint32_t wl_mask = 0;
-
-       TDM_RETURN_VAL_IF_FAIL(fd_source, TDM_ERROR_INVALID_PARAMETER);
-
-       if (mask & TDM_EVENT_READABLE)
-               wl_mask |= WL_EVENT_READABLE;
-       if (mask & TDM_EVENT_WRITABLE)
-               wl_mask |= WL_EVENT_WRITABLE;
-
-       if (wl_event_source_fd_update(fd_source->base.wl_source, wl_mask) < 0) {
-               TDM_ERR("source update failed: %m");
-               return TDM_ERROR_OPERATION_FAILED;
-       }
-
-       return TDM_ERROR_NONE;
-}
-
-static int
-_tdm_event_loop_timer_func(void *data)
-{
-       tdm_event_source_timer *timer_source = (tdm_event_source_timer*)data;
-
-       TDM_RETURN_VAL_IF_FAIL(timer_source, 1);
-       TDM_RETURN_VAL_IF_FAIL(timer_source->func, 1);
-
-       timer_source->func(timer_source->user_data);
-
-       return 1;
-}
-
-EXTERN tdm_event_source*
-tdm_event_add_timer_handler(tdm_display *dpy, tdm_event_timer_handler func,
-                            void *user_data, tdm_error *error)
-{
-       tdm_private_display *private_display;
-       tdm_private_event *private_event;
-       tdm_event_source_timer *timer_source;
-       tdm_error ret;
-
-       TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(dpy, TDM_ERROR_INVALID_PARAMETER, NULL);
-       TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(func, TDM_ERROR_INVALID_PARAMETER, NULL);
-
-       private_display = (tdm_private_display*)dpy;
-       private_event = private_display->private_event;
-       TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(private_event, TDM_ERROR_INVALID_PARAMETER, NULL);
-       TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(private_event->event_loop, TDM_ERROR_INVALID_PARAMETER, NULL);
-
-       timer_source = calloc(1, sizeof(tdm_event_source_timer));
-       TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(timer_source, TDM_ERROR_OUT_OF_MEMORY, NULL);
-
-       timer_source->base.wl_source =
-               wl_event_loop_add_timer(private_event->event_loop,
-                                       _tdm_event_loop_timer_func, timer_source);
-       if (!timer_source->base.wl_source) {
-               if (error)
-                       *error = TDM_ERROR_OUT_OF_MEMORY;
-               free(timer_source);
-               return NULL;
-       }
-
-       timer_source->private_display = private_display;
-       timer_source->func = func;
-       timer_source->user_data = user_data;
-
-       if (error)
-               *error = TDM_ERROR_NONE;
-
-       return (tdm_event_source*)timer_source;
-}
-
-EXTERN tdm_error
-tdm_event_source_timer_update(tdm_event_source *source, int ms_delay)
-{
-       tdm_event_source_timer *timer_source = source;
-
-       TDM_RETURN_VAL_IF_FAIL(timer_source, TDM_ERROR_INVALID_PARAMETER);
-
-       if (wl_event_source_timer_update(timer_source->base.wl_source, ms_delay) < 0) {
-               TDM_ERR("source update failed: %m");
-               return TDM_ERROR_OPERATION_FAILED;
-       }
-
-       return TDM_ERROR_NONE;
-}
-
-EXTERN void
-tdm_event_source_remove(tdm_event_source *source)
-{
-       tdm_event_source_base *base = (tdm_event_source_base*)source;
-
-       if (!base)
-               return;
-
-       wl_event_source_remove(base->wl_source);
-
-       free(source);
-}
diff --git a/src/tdm_event_loop.c b/src/tdm_event_loop.c
new file mode 100644 (file)
index 0000000..e2beaf7
--- /dev/null
@@ -0,0 +1,409 @@
+/**************************************************************************
+
+libtdm
+
+Copyright 2015 Samsung Electronics co., Ltd. All Rights Reserved.
+
+Contact: Eunchul Kim <chulspro.kim@samsung.com>,
+         JinYoung Jeon <jy0.jeon@samsung.com>,
+         Taeheon Kim <th908.kim@samsung.com>,
+         YoungJun Cho <yj44.cho@samsung.com>,
+         SooChan Lim <sc1.lim@samsung.com>,
+         Boram Park <sc1.lim@samsung.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sub license, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice (including the
+next paragraph) shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+**************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "tdm.h"
+#include "tdm_private.h"
+#include "tdm_list.h"
+
+#include <wayland-server-core.h>
+
+struct _tdm_private_loop {
+       struct wl_display *wl_display;
+       struct wl_event_loop *wl_loop;
+
+       int backend_fd;
+       tdm_event_loop_source *backend_source;
+};
+
+typedef struct _tdm_event_loop_source_base
+{
+       struct wl_event_source *wl_source;
+} tdm_event_loop_source_base;
+
+typedef struct _tdm_event_loop_source_fd
+{
+       tdm_event_loop_source_base base;
+       tdm_private_display *private_display;
+       tdm_event_loop_fd_handler func;
+       void *user_data;
+} tdm_event_loop_source_fd;
+
+typedef struct _tdm_event_loop_source_timer
+{
+       tdm_event_loop_source_base base;
+       tdm_private_display *private_display;
+       tdm_event_loop_timer_handler func;
+       void *user_data;
+} 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_func_display *func_display;
+
+       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;
+
+       if (tdm_debug_thread)
+               TDM_INFO("backend fd(%d) event happens", private_loop->backend_fd);
+
+       func_display = &private_display->func_display;
+       if (!func_display->display_handle_events)
+               return TDM_ERROR_NONE;
+
+       return func_display->display_handle_events(private_display->bdata);
+}
+
+INTERN tdm_error
+tdm_event_loop_init(tdm_private_display *private_display)
+{
+       tdm_private_loop *private_loop;
+
+       if (private_display->private_loop)
+               return TDM_ERROR_NONE;
+
+       private_loop = calloc(1, sizeof *private_loop);
+       if (!private_loop) {
+               TDM_ERR("alloc failed");
+               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");
+               free(private_loop);
+               return TDM_ERROR_OUT_OF_MEMORY;
+       }
+
+       private_loop->wl_loop = wl_display_get_event_loop(private_loop->wl_display);
+       if (!private_loop->wl_loop) {
+               TDM_ERR("no event loop");
+               wl_display_destroy(private_loop->wl_display);
+               free(private_loop);
+               return TDM_ERROR_OUT_OF_MEMORY;
+       }
+
+       TDM_INFO("event loop fd(%d)", wl_event_loop_get_fd(private_loop->wl_loop));
+
+       private_display->private_loop = private_loop;
+
+       return TDM_ERROR_NONE;
+}
+
+INTERN void
+tdm_event_loop_deinit(tdm_private_display *private_display)
+{
+       if (!private_display->private_loop)
+               return;
+
+       if (private_display->private_loop->backend_source)
+               tdm_event_loop_source_remove(private_display->private_loop->backend_source);
+
+       if (private_display->private_loop->wl_display)
+               wl_display_destroy(private_display->private_loop->wl_display);
+
+       free(private_display->private_loop);
+       private_display->private_loop = NULL;
+}
+
+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_error ret;
+       int fd = -1;
+
+       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;
+       }
+
+       ret = func_display->display_get_fd(private_display->bdata, &fd);
+       if (fd < 0) {
+               TDM_WRN("TDM backend module returns fd(%d)", fd);
+               return;
+       }
+
+       if (!func_display->display_handle_events) {
+               TDM_ERR("no display_handle_events function");
+               return;
+       }
+
+       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;
+       }
+
+       private_loop->backend_fd = fd;
+
+       TDM_INFO("backend fd(%d) source created", private_loop->backend_fd);
+}
+
+INTERN int
+tdm_event_loop_get_fd(tdm_private_display *private_display)
+{
+       tdm_private_loop *private_loop = private_display->private_loop;
+
+       TDM_RETURN_VAL_IF_FAIL(private_loop->wl_loop != NULL, -1);
+
+       return wl_event_loop_get_fd(private_loop->wl_loop);
+}
+
+INTERN tdm_error
+tdm_event_loop_dispatch(tdm_private_display *private_display)
+{
+       tdm_private_loop *private_loop = private_display->private_loop;
+
+       TDM_RETURN_VAL_IF_FAIL(private_loop->wl_loop != NULL, TDM_ERROR_OPERATION_FAILED);
+
+       if (tdm_debug_thread)
+               TDM_INFO("dispatch");
+
+       /* Don't set timeout to -1. It can make deadblock by two mutex locks.
+        * If need to set -1, use poll() and call tdm_event_loop_dispatch() after
+        * escaping polling.
+        */
+       if (wl_event_loop_dispatch(private_loop->wl_loop, 0) < 0)
+               TDM_ERR("dispatch failed");
+
+       return TDM_ERROR_NONE;
+}
+
+INTERN tdm_error
+tdm_event_loop_add_socket(tdm_private_display *private_display, const char *name)
+{
+       tdm_private_loop *private_loop = private_display->private_loop;
+
+       TDM_RETURN_VAL_IF_FAIL(private_loop->wl_display != NULL, TDM_ERROR_OPERATION_FAILED);
+
+       if (wl_display_add_socket(private_loop->wl_display, name) < 0) {
+               TDM_ERR("add socket(\"%s\") failed", name);
+               return TDM_ERROR_OPERATION_FAILED;
+       }
+
+       return TDM_ERROR_NONE;
+}
+
+static int
+_tdm_event_loop_fd_func(int fd, uint32_t wl_mask, void *data)
+{
+       tdm_event_loop_source_fd *fd_source = (tdm_event_loop_source_fd*)data;
+       tdm_event_loop_mask mask = 0;
+
+       TDM_RETURN_VAL_IF_FAIL(fd_source, 1);
+       TDM_RETURN_VAL_IF_FAIL(fd_source->func, 1);
+
+       if (wl_mask & WL_EVENT_READABLE)
+               mask |= TDM_EVENT_LOOP_READABLE;
+       if (wl_mask & WL_EVENT_WRITABLE)
+               mask |= TDM_EVENT_LOOP_WRITABLE;
+       if (wl_mask & WL_EVENT_HANGUP)
+               mask |= TDM_EVENT_LOOP_HANGUP;
+       if (wl_mask & WL_EVENT_ERROR)
+               mask |= TDM_EVENT_LOOP_ERROR;
+
+       fd_source->func(fd, mask, fd_source->user_data);
+
+       return 1;
+}
+
+EXTERN tdm_event_loop_source*
+tdm_event_loop_add_fd_handler(tdm_display *dpy, int fd, tdm_event_loop_mask mask,
+                              tdm_event_loop_fd_handler func, void *user_data,
+                              tdm_error *error)
+{
+       tdm_private_display *private_display;
+       tdm_private_loop *private_loop;
+       tdm_event_loop_source_fd *fd_source;
+       uint32_t wl_mask = 0;
+       tdm_error ret;
+
+       TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(dpy, TDM_ERROR_INVALID_PARAMETER, NULL);
+       TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(fd >= 0, TDM_ERROR_INVALID_PARAMETER, NULL);
+       TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(func, TDM_ERROR_INVALID_PARAMETER, NULL);
+
+       private_display = (tdm_private_display*)dpy;
+       private_loop = private_display->private_loop;
+       TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(private_loop, TDM_ERROR_INVALID_PARAMETER, NULL);
+       TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(private_loop->wl_loop, TDM_ERROR_INVALID_PARAMETER, NULL);
+
+       fd_source = calloc(1, sizeof(tdm_event_loop_source_fd));
+       TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(fd_source, TDM_ERROR_OUT_OF_MEMORY, NULL);
+
+       if (mask & TDM_EVENT_LOOP_READABLE)
+               wl_mask |= WL_EVENT_READABLE;
+       if (mask & TDM_EVENT_LOOP_WRITABLE)
+               wl_mask |= WL_EVENT_WRITABLE;
+
+       fd_source->base.wl_source =
+               wl_event_loop_add_fd(private_loop->wl_loop,
+                                    fd, wl_mask, _tdm_event_loop_fd_func, fd_source);
+       if (!fd_source->base.wl_source) {
+               if (error)
+                       *error = TDM_ERROR_OUT_OF_MEMORY;
+               free(fd_source);
+               return NULL;
+       }
+
+       fd_source->private_display = private_display;
+       fd_source->func = func;
+       fd_source->user_data = user_data;
+
+       if (error)
+               *error = TDM_ERROR_NONE;
+
+       return (tdm_event_loop_source*)fd_source;
+}
+
+EXTERN tdm_error
+tdm_event_loop_source_fd_update(tdm_event_loop_source *source, tdm_event_loop_mask mask)
+{
+       tdm_event_loop_source_fd *fd_source = source;
+       uint32_t wl_mask = 0;
+
+       TDM_RETURN_VAL_IF_FAIL(fd_source, TDM_ERROR_INVALID_PARAMETER);
+
+       if (mask & TDM_EVENT_LOOP_READABLE)
+               wl_mask |= WL_EVENT_READABLE;
+       if (mask & TDM_EVENT_LOOP_WRITABLE)
+               wl_mask |= WL_EVENT_WRITABLE;
+
+       if (wl_event_source_fd_update(fd_source->base.wl_source, wl_mask) < 0) {
+               TDM_ERR("source update failed: %m");
+               return TDM_ERROR_OPERATION_FAILED;
+       }
+
+       return TDM_ERROR_NONE;
+}
+
+static int
+_tdm_event_loop_timer_func(void *data)
+{
+       tdm_event_loop_source_timer *timer_source = (tdm_event_loop_source_timer*)data;
+
+       TDM_RETURN_VAL_IF_FAIL(timer_source, 1);
+       TDM_RETURN_VAL_IF_FAIL(timer_source->func, 1);
+
+       timer_source->func(timer_source->user_data);
+
+       return 1;
+}
+
+EXTERN tdm_event_loop_source*
+tdm_event_loop_add_timer_handler(tdm_display *dpy, tdm_event_loop_timer_handler func,
+                                 void *user_data, tdm_error *error)
+{
+       tdm_private_display *private_display;
+       tdm_private_loop *private_loop;
+       tdm_event_loop_source_timer *timer_source;
+       tdm_error ret;
+
+       TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(dpy, TDM_ERROR_INVALID_PARAMETER, NULL);
+       TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(func, TDM_ERROR_INVALID_PARAMETER, NULL);
+
+       private_display = (tdm_private_display*)dpy;
+       private_loop = private_display->private_loop;
+       TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(private_loop, TDM_ERROR_INVALID_PARAMETER, NULL);
+       TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(private_loop->wl_loop, TDM_ERROR_INVALID_PARAMETER, NULL);
+
+       timer_source = calloc(1, sizeof(tdm_event_loop_source_timer));
+       TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(timer_source, TDM_ERROR_OUT_OF_MEMORY, NULL);
+
+       timer_source->base.wl_source =
+               wl_event_loop_add_timer(private_loop->wl_loop,
+                                       _tdm_event_loop_timer_func, timer_source);
+       if (!timer_source->base.wl_source) {
+               if (error)
+                       *error = TDM_ERROR_OUT_OF_MEMORY;
+               free(timer_source);
+               return NULL;
+       }
+
+       timer_source->private_display = private_display;
+       timer_source->func = func;
+       timer_source->user_data = user_data;
+
+       if (error)
+               *error = TDM_ERROR_NONE;
+
+       return (tdm_event_loop_source*)timer_source;
+}
+
+EXTERN tdm_error
+tdm_event_loop_source_timer_update(tdm_event_loop_source *source, int ms_delay)
+{
+       tdm_event_loop_source_timer *timer_source = source;
+
+       TDM_RETURN_VAL_IF_FAIL(timer_source, TDM_ERROR_INVALID_PARAMETER);
+
+       if (wl_event_source_timer_update(timer_source->base.wl_source, ms_delay) < 0) {
+               TDM_ERR("source update failed: %m");
+               return TDM_ERROR_OPERATION_FAILED;
+       }
+
+       return TDM_ERROR_NONE;
+}
+
+EXTERN void
+tdm_event_loop_source_remove(tdm_event_loop_source *source)
+{
+       tdm_event_loop_source_base *base = (tdm_event_loop_source_base*)source;
+
+       if (!base)
+               return;
+
+       wl_event_source_remove(base->wl_source);
+
+       free(source);
+}
index f0e838b88fbca5c0797d5e1681cf5f3107d63097..62b59c7fc7c4d88caa86afaaea33b98f492db179 100644 (file)
@@ -164,7 +164,7 @@ typedef struct _tdm_private_output tdm_private_output;
 typedef struct _tdm_private_layer tdm_private_layer;
 typedef struct _tdm_private_pp tdm_private_pp;
 typedef struct _tdm_private_capture tdm_private_capture;
-typedef struct _tdm_private_event tdm_private_event;
+typedef struct _tdm_private_loop tdm_private_loop;
 typedef struct _tdm_private_thread tdm_private_thread;
 typedef struct _tdm_private_vblank_handler tdm_private_vblank_handler;
 typedef struct _tdm_private_commit_handler tdm_private_commit_handler;
@@ -200,7 +200,7 @@ struct _tdm_private_display {
        void **outputs_ptr;
 
        /* for event handling */
-       tdm_private_event *private_event;
+       tdm_private_loop *private_loop;
 
        /* for own event thread */
        tdm_private_thread *private_thread;
@@ -373,17 +373,17 @@ tdm_buffer_list_dump(struct list_head *list);
 
 /* event functions for private */
 tdm_error
-tdm_event_init(tdm_private_display *private_display);
+tdm_event_loop_init(tdm_private_display *private_display);
 void
-tdm_event_deinit(tdm_private_display *private_display);
+tdm_event_loop_deinit(tdm_private_display *private_display);
 void
-tdm_event_create_backend_source(tdm_private_display *private_display);
+tdm_event_loop_create_backend_source(tdm_private_display *private_display);
 int
-tdm_event_get_fd(tdm_private_display *private_display);
+tdm_event_loop_get_fd(tdm_private_display *private_display);
 tdm_error
-tdm_event_dispatch(tdm_private_display *private_display);
+tdm_event_loop_dispatch(tdm_private_display *private_display);
 tdm_error
-tdm_event_add_socket(tdm_private_display *private_display, const char *name);
+tdm_event_loop_add_socket(tdm_private_display *private_display, const char *name);
 
 
 typedef enum {
index 3d64142379ff41e7701b4cd9fe86a5ab55a3ab04..5e0d8c792b1f009dff7f892ccdf9d0b4c0b11d6e 100644 (file)
@@ -71,7 +71,7 @@ _tdm_thread_main(void *data)
        TDM_INFO("display_tid:%d, thread_tid: %d",
                 private_thread->display_tid, private_thread->thread_tid);
 
-       fd = tdm_event_get_fd(private_display);
+       fd = tdm_event_loop_get_fd(private_display);
        if (fd < 0) {
                TDM_ERR("couldn't get fd");
                goto exit_thread;
@@ -107,7 +107,7 @@ _tdm_thread_main(void *data)
 
                _pthread_mutex_lock(&private_display->lock);
 
-               if (tdm_event_dispatch(private_display) < 0)
+               if (tdm_event_loop_dispatch(private_display) < 0)
                        TDM_ERR("dispatch error");
 
                _pthread_mutex_unlock(&private_display->lock);