From 6abc037265160665b1a54f67e79c019acda1b77f Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 25 Jul 2017 19:05:18 +0900 Subject: [PATCH] deinit the event loop after all resources are destroyed. The event loop should be deinited after all event sources are removed. The event sources can be removed in _tdm_display_destroy_private_display and _tdm_display_unload_module function. So we make the tdm thread join to the main thread and remove all resources. And finally we deinit the event loop. Change-Id: I32f3b5429b40b0711ef50215d05e0eda1c8b1814 --- src/tdm.c | 8 +++++--- src/tdm_event_loop.c | 14 ++++++++++++-- src/tdm_private.h | 2 ++ 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/tdm.c b/src/tdm.c index 9baace2..7723018 100644 --- a/src/tdm.c +++ b/src/tdm.c @@ -1006,6 +1006,7 @@ tdm_display_init(tdm_error *error) failed_update: _tdm_display_unload_module(private_display); failed_load: + tdm_event_loop_stop(private_display); tdm_event_loop_deinit(private_display); failed_event: _pthread_mutex_unlock(&private_display->lock); @@ -1040,11 +1041,12 @@ tdm_display_deinit(tdm_display *dpy) * things because it's finalized. */ _pthread_mutex_lock(&private_display->lock); - tdm_event_loop_deinit(private_display); - _pthread_mutex_unlock(&private_display->lock); - + tdm_event_loop_stop(private_display); _tdm_display_destroy_private_display(private_display); _tdm_display_unload_module(private_display); + _pthread_mutex_unlock(&private_display->lock); + + tdm_event_loop_deinit(private_display); #ifdef INIT_BUFMGR if (private_display->bufmgr) diff --git a/src/tdm_event_loop.c b/src/tdm_event_loop.c index c947243..1c88685 100644 --- a/src/tdm_event_loop.c +++ b/src/tdm_event_loop.c @@ -147,8 +147,9 @@ tdm_event_loop_deinit(tdm_private_display *private_display) if (!private_display->private_loop) return; - /* after tdm_thread_deinit, we don't worry about thread things because it's finalized */ - tdm_thread_deinit(private_display->private_loop); + if (tdm_thread_is_running()) + TDM_ERR("thread is still running. tdm_event_loop_stop SHOULD be called"); + tdm_server_deinit(private_display->private_loop); if (private_display->private_loop->backend_source) @@ -162,6 +163,15 @@ tdm_event_loop_deinit(tdm_private_display *private_display) } INTERN void +tdm_event_loop_stop(tdm_private_display *private_display) +{ + TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED()); + + /* after tdm_thread_deinit, we don't worry about thread things because it's finalized */ + tdm_thread_deinit(private_display->private_loop); +} + +INTERN void tdm_event_loop_create_backend_source(tdm_private_display *private_display) { tdm_private_loop *private_loop = private_display->private_loop; diff --git a/src/tdm_private.h b/src/tdm_private.h index 12ac385..cecf66d 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -494,6 +494,8 @@ tdm_event_loop_init(tdm_private_display *private_display); void tdm_event_loop_deinit(tdm_private_display *private_display); void +tdm_event_loop_stop(tdm_private_display *private_display); +void tdm_event_loop_create_backend_source(tdm_private_display *private_display); int tdm_event_loop_get_fd(tdm_private_display *private_display); -- 2.7.4