X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Ftdm_event_loop.c;h=5117c273b676890fa24e0c67cbb25980519a7426;hb=refs%2Fheads%2Ftizen_5.0;hp=157c8e8ee007db4fdf7ae4257eb4d56b50543003;hpb=a03f1283751930597b6c9f2fe43bffef288d6ead;p=platform%2Fcore%2Fuifw%2Flibtdm.git diff --git a/src/tdm_event_loop.c b/src/tdm_event_loop.c index 157c8e8..5117c27 100644 --- a/src/tdm_event_loop.c +++ b/src/tdm_event_loop.c @@ -9,7 +9,7 @@ * Taeheon Kim , * YoungJun Cho , * SooChan Lim , - * Boram Park + * Boram Park * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the @@ -40,41 +40,47 @@ #include "tdm_private.h" typedef struct _tdm_event_loop_source_base { + struct list_head link; + tdm_private_display *private_display; 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_private_loop *keep_private_loop; + static tdm_error _tdm_event_loop_main_fd_handler(int fd, tdm_event_loop_mask mask, void *user_data) { - tdm_private_backend *private_backend = (tdm_private_backend*)user_data; + tdm_private_module *private_module = (tdm_private_module*)user_data; + tdm_private_display *private_display; 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_backend != NULL, TDM_ERROR_OPERATION_FAILED); + TDM_RETURN_VAL_IF_FAIL(private_module != NULL, TDM_ERROR_OPERATION_FAILED); if (tdm_debug_module & TDM_DEBUG_EVENT) - TDM_INFO("backend fd(%d) event happens", private_backend->fd); + TDM_INFO("backend fd(%d) event happens", private_module->fd); - func_display = &private_backend->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_backend->bdata); + private_display = private_module->private_display; + private_display->current_module = private_module; + ret = func_display->display_handle_events(private_module->bdata); + private_display->current_module = NULL; return ret; } @@ -112,6 +118,8 @@ tdm_event_loop_init(tdm_private_display *private_display) return TDM_ERROR_OPERATION_FAILED; } + LIST_INITHEAD(&private_loop->source_list); + private_loop->dpy = private_display; private_display->private_loop = private_loop; @@ -124,6 +132,8 @@ tdm_event_loop_init(tdm_private_display *private_display) return TDM_ERROR_OPERATION_FAILED; } + keep_private_loop = private_loop; + TDM_INFO("event loop fd(%d)", wl_event_loop_get_fd(private_loop->wl_loop)); return TDM_ERROR_NONE; @@ -132,7 +142,8 @@ tdm_event_loop_init(tdm_private_display *private_display) INTERN void tdm_event_loop_deinit(tdm_private_display *private_display) { - tdm_private_backend *private_backend = NULL; + tdm_private_module *private_module = NULL; + tdm_event_loop_source_base *source = NULL, *ss = NULL; TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED()); @@ -144,18 +155,28 @@ tdm_event_loop_deinit(tdm_private_display *private_display) tdm_server_deinit(private_display->private_loop); - LIST_FOR_EACH_ENTRY(private_backend, &private_display->backend_list, link) { - if (private_backend->event_source) - tdm_event_loop_source_remove(private_backend->event_source); - private_backend->event_source = NULL; - private_backend->fd = -1; + 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); + LIST_FOR_EACH_ENTRY_SAFE(source, ss, &private_display->private_loop->source_list, link) { + tdm_event_loop_source_remove(source); + } + +#if WAYLAND_VERSION_MAJOR >= 1 && WAYLAND_VERSION_MINOR >= 15 + wl_display_destroy_clients(private_display->private_loop->wl_display); +#endif + + wl_display_destroy(private_display->private_loop->wl_display); free(private_display->private_loop); private_display->private_loop = NULL; + keep_private_loop = NULL; + + TDM_INFO("event loop deinit done"); } INTERN void @@ -171,41 +192,41 @@ INTERN void tdm_event_loop_create_backend_source(tdm_private_display *private_display) { tdm_private_loop *private_loop = private_display->private_loop; - tdm_private_backend *private_backend = NULL; + 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); - LIST_FOR_EACH_ENTRY(private_backend, &private_display->backend_list, link) { - tdm_func_display *func_display = &private_backend->func_display; + LIST_FOR_EACH_ENTRY(private_module, &private_display->module_list, link) { + tdm_func_display *func_display = &private_module->func_display; if (!func_display->display_get_fd) { TDM_INFO("TDM backend module won't offer a display fd"); - private_backend->event_source = NULL; - private_backend->fd = -1; + private_module->event_source = NULL; + private_module->fd = -1; continue; } - ret = func_display->display_get_fd(private_backend->bdata, &fd); + ret = func_display->display_get_fd(private_module->bdata, &fd); assert(ret == TDM_ERROR_NONE && fd >= 0); assert(func_display->display_handle_events); - private_backend->event_source = + private_module->event_source = tdm_event_loop_add_fd_handler(private_display, fd, TDM_EVENT_LOOP_READABLE, _tdm_event_loop_main_fd_handler, - private_backend, &ret); - if (!private_backend->event_source) { + private_module, &ret); + if (!private_module->event_source) { TDM_ERR("no backend fd(%d) source", fd); return; } - private_backend->fd = fd; + private_module->fd = fd; - TDM_INFO("backend fd(%d) source created", private_backend->fd); + TDM_INFO("backend fd(%d) source created", private_module->fd); } } @@ -282,7 +303,7 @@ _tdm_event_loop_fd_func(int fd, uint32_t wl_mask, void *data) TDM_RETURN_VAL_IF_FAIL(fd_source, 1); TDM_RETURN_VAL_IF_FAIL(fd_source->func, 1); - private_display = fd_source->private_display; + private_display = fd_source->base.private_display; if (wl_mask & WL_EVENT_READABLE) mask |= TDM_EVENT_LOOP_READABLE; @@ -329,10 +350,10 @@ tdm_event_loop_add_fd_handler(tdm_display *dpy, int fd, tdm_event_loop_mask mask if (mask & TDM_EVENT_LOOP_WRITABLE) wl_mask |= WL_EVENT_WRITABLE; - fd_source->private_display = private_display; fd_source->func = func; fd_source->user_data = user_data; + fd_source->base.private_display = private_display; fd_source->base.wl_source = wl_event_loop_add_fd(private_loop->wl_loop, fd, wl_mask, _tdm_event_loop_fd_func, fd_source); @@ -343,6 +364,8 @@ tdm_event_loop_add_fd_handler(tdm_display *dpy, int fd, tdm_event_loop_mask mask return NULL; } + LIST_ADDTAIL(&fd_source->base.link, &private_loop->source_list); + if (error) *error = TDM_ERROR_NONE; @@ -382,7 +405,7 @@ _tdm_event_loop_timer_func(void *data) TDM_RETURN_VAL_IF_FAIL(timer_source, 1); TDM_RETURN_VAL_IF_FAIL(timer_source->func, 1); - private_display = timer_source->private_display; + private_display = timer_source->base.private_display; /* TDM event_loop function is actually for TDM backend module. When we call the * backend's functions, we have to lock the mutex. TDM backend shouldn't consider @@ -416,10 +439,10 @@ tdm_event_loop_add_timer_handler(tdm_display *dpy, tdm_event_loop_timer_handler 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->private_display = private_display; timer_source->func = func; timer_source->user_data = user_data; + timer_source->base.private_display = private_display; timer_source->base.wl_source = wl_event_loop_add_timer(private_loop->wl_loop, _tdm_event_loop_timer_func, timer_source); @@ -430,6 +453,8 @@ tdm_event_loop_add_timer_handler(tdm_display *dpy, tdm_event_loop_timer_handler return NULL; } + LIST_ADDTAIL(&timer_source->base.link, &private_loop->source_list); + if (error) *error = TDM_ERROR_NONE; @@ -459,9 +484,11 @@ tdm_event_loop_source_remove(tdm_event_loop_source *source) TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED()); - if (!base) + if (!base || !keep_private_loop) return; + LIST_DEL(&base->link); + wl_event_source_remove(base->wl_source); free(source);