From 9c7adf6d4fe394be239b1b134159c15a5c614bee Mon Sep 17 00:00:00 2001 From: Boram Park Date: Wed, 21 Feb 2018 15:28:25 +0900 Subject: [PATCH 01/16] remove unused file Change-Id: I8c4e786bd29a33d5dad356d517fa137798dfac66 --- 0001-save.patch | 31 ------------------------------- 1 file changed, 31 deletions(-) delete mode 100644 0001-save.patch diff --git a/0001-save.patch b/0001-save.patch deleted file mode 100644 index 25ad8f0..0000000 --- a/0001-save.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 60fa1ef61f143eb5310588bba987bdfce5d33ad1 Mon Sep 17 00:00:00 2001 -From: Boram Park -Date: Wed, 21 Feb 2018 15:26:17 +0900 -Subject: [PATCH] save - -Change-Id: I5e33d25ad3678f4a77c5ec4396af2b1b45a32488 ---- - include/tdm.h | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/include/tdm.h b/include/tdm.h -index f4aa8d8..3cae42f 100644 ---- a/include/tdm.h -+++ b/include/tdm.h -@@ -222,10 +222,10 @@ tdm_backend_get_info(tdm_backend *backend, const char **name, - const char **vendor, int *major, int *minor); - - /** -- * @brief Get the capabilities of a output object. -+ * @brief Get a backend object of the given output. - * @param[in] output A output object -- * @param[out] capabilities The capabilities of a output object -- * @return #TDM_ERROR_NONE if success. Otherwise, error value. -+ * @param[out] error #TDM_ERROR_NONE if success. Otherwise, error value. -+ * @return A backend object if success. Otherwise, NULL. - */ - tdm_backend * - tdm_output_get_backend(tdm_output *output, tdm_error *error); --- -1.9.1 - -- 2.7.4 From d7cab3249db011494da88586a9488de357194b15 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Wed, 21 Feb 2018 16:09:04 +0900 Subject: [PATCH 02/16] log: restore stdout when set NULL. Change-Id: I25934b33f8468e55fdd063068f868fafab81f948 --- common/tdm_log.c | 46 +++++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/common/tdm_log.c b/common/tdm_log.c index 3ddcda1..1befbfb 100644 --- a/common/tdm_log.c +++ b/common/tdm_log.c @@ -69,6 +69,8 @@ static pthread_mutex_t log_lock; unsigned int tdm_log_debug_level = TDM_LOG_LEVEL_INFO; +static int stdout_fd = -1; + EXTERN void tdm_log_enable_color(unsigned int enable) { @@ -105,26 +107,40 @@ tdm_log_set_assert_level(int level) EXTERN void tdm_log_set_path(const char *path) { - char fd_name[TDM_PATH_LEN]; - int log_fd = -1; - FILE *log_fl; + if (!path) { + if (stdout_fd != -1) { + fflush(stdout); + close(STDOUT_FILENO); + dup2(stdout_fd, STDOUT_FILENO); + close(stdout_fd); + stdout_fd = -1; + } + } else { + char fd_name[TDM_PATH_LEN]; + int log_fd = -1; + FILE *log_fl; - snprintf(fd_name, TDM_PATH_LEN, "%s", path); + snprintf(fd_name, TDM_PATH_LEN, "%s", path); - log_fl = fopen(fd_name, "a"); - if (!log_fl) { - TDM_ERR("failed: open file(%s)\n", fd_name); - return; - } + log_fl = fopen(fd_name, "a"); + if (!log_fl) { + TDM_ERR("failed: open file(%s)\n", fd_name); + return; + } - fflush(stdout); - close(STDOUT_FILENO); + if (stdout_fd == -1) { + fflush(stdout); + stdout_fd = dup(STDOUT_FILENO); + TDM_RETURN_IF_FAIL(stdout_fd != -1); + } - setvbuf(log_fl, NULL, _IOLBF, 512); - log_fd = fileno(log_fl); + setvbuf(log_fl, NULL, _IOLBF, 512); + log_fd = fileno(log_fl); - dup2(log_fd, STDOUT_FILENO); - fclose(log_fl); + close(STDOUT_FILENO); + dup2(log_fd, STDOUT_FILENO); + fclose(log_fl); + } } EXTERN void -- 2.7.4 From 65b89e98b7f61add110439f250cceab0e106c4af Mon Sep 17 00:00:00 2001 From: Boram Park Date: Thu, 22 Feb 2018 08:38:55 +0900 Subject: [PATCH 03/16] macro: move backend's name definition Change-Id: I53d086d54b8a9b13f686f91d93d6d543ffe0059e --- src/tdm.c | 4 ---- src/tdm_macro.h | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/tdm.c b/src/tdm.c index d744875..3a0ecad 100644 --- a/src/tdm.c +++ b/src/tdm.c @@ -682,10 +682,6 @@ tdm_display_update(tdm_display *dpy) return TDM_ERROR_NONE; } -#define SUFFIX_MODULE ".so" -#define TDM_DEFAULT_MODULE "libtdm-default"SUFFIX_MODULE -#define TDM_DUMMY_MODULE "libtdm-dummy"SUFFIX_MODULE - int tdm_debug_module; int tdm_debug_dump; int tdm_ttrace_module; diff --git a/src/tdm_macro.h b/src/tdm_macro.h index 5d41886..88dc034 100644 --- a/src/tdm_macro.h +++ b/src/tdm_macro.h @@ -83,6 +83,10 @@ extern "C" { } \ } while (0) +/* common backend names *****************************************************/ +#define TDM_DEFAULT_MODULE "libtdm-default.so" +#define TDM_DUMMY_MODULE "libtdm-dummy.so" + /* dump directory ***********************************************************/ #define TDM_DUMP_DIR "/tmp" -- 2.7.4 From 3e00a0eecd370289ff30426836f50c1e7874566e Mon Sep 17 00:00:00 2001 From: Boram Park Date: Thu, 22 Feb 2018 14:02:51 +0900 Subject: [PATCH 04/16] thread: use two lists for each thread When tdm_thread_call_cb is called in both threads at the same time, the 'called' variable makes a thread issue. 1) Calling tdm_thread_call_cb in display-thread makes the 'called' variable as 1 2) Calling tdm_thread_call_cb in tdm-thread at the same time checks cb->called. 3) Because cb->called is 1 by display-thread, tdm_thread_call_cb in tdm-thread does nothing. Change-Id: I009e3a17b40d32502f3567b8ecd712fa7c8dc349 --- src/tdm_thread.c | 119 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 82 insertions(+), 37 deletions(-) diff --git a/src/tdm_thread.c b/src/tdm_thread.c index 30966b4..6058bb3 100644 --- a/src/tdm_thread.c +++ b/src/tdm_thread.c @@ -69,11 +69,13 @@ typedef struct _tdm_private_thread_cb { void *user_data; pid_t owner_tid; - unsigned int called; } tdm_private_thread_cb; static tdm_thread_find_object find_funcs[TDM_THREAD_CB_MAX] = {0, }; -static struct list_head cb_list; + +/* 0: for display thread, 1: for tdm thread */ +static struct list_head cb_list[2]; +static pthread_mutex_t cb_list_lock; static void _tdm_thread_free_cb(tdm_private_thread_cb *cb); @@ -193,13 +195,19 @@ tdm_thread_init(tdm_private_loop *private_loop) private_display = private_loop->dpy; TDM_RETURN_VAL_IF_FAIL(private_display->private_loop, TDM_ERROR_OPERATION_FAILED); + if (private_loop->private_thread) + return TDM_ERROR_NONE; + for (i = 0; i < TDM_THREAD_CB_MAX; i++) find_funcs[i] = NULL; - LIST_INITHEAD(&cb_list); + if (pthread_mutex_init(&cb_list_lock, NULL)) { + TDM_ERR("mutex init failed: %m"); + return TDM_ERROR_OUT_OF_MEMORY; + } - if (private_loop->private_thread) - return TDM_ERROR_NONE; + LIST_INITHEAD(&cb_list[0]); + LIST_INITHEAD(&cb_list[1]); /* enable as default */ thread = tdm_config_get_int(TDM_CONFIG_KEY_GENERAL_THREAD, 1); @@ -291,7 +299,12 @@ tdm_thread_deinit(tdm_private_loop *private_loop) tdm_log_reset(); - LIST_FOR_EACH_ENTRY_SAFE(cb, hh, &cb_list, link) { + pthread_mutex_destroy(&cb_list_lock); + + LIST_FOR_EACH_ENTRY_SAFE(cb, hh, &cb_list[0], link) { + _tdm_thread_free_cb(cb); + } + LIST_FOR_EACH_ENTRY_SAFE(cb, hh, &cb_list[1], link) { _tdm_thread_free_cb(cb); } @@ -358,7 +371,7 @@ tdm_thread_send_cb(tdm_private_loop *private_loop, tdm_thread_cb_base *base) pipe = private_thread->pipe[1]; if (tdm_debug_module & TDM_DEBUG_THREAD) - TDM_INFO("fd(%d) type(%d), length(%d)", pipe, base->type, base->length); + TDM_INFO("fd(%d) type(%s), length(%d)", pipe, tdm_cb_type_str(base->type), base->length); len = write(pipe, base, base->length); if (len != base->length) { @@ -419,7 +432,7 @@ tdm_thread_handle_cb(tdm_private_loop *private_loop) while (i < len) { base = (tdm_thread_cb_base*)&buffer[i]; if (tdm_debug_module & TDM_DEBUG_THREAD) - TDM_INFO("type(%d), length(%d)", base->type, base->length); + TDM_INFO("type(%s), length(%d)", tdm_cb_type_str(base->type), base->length); switch (base->type) { case TDM_THREAD_CB_OUTPUT_COMMIT: case TDM_THREAD_CB_OUTPUT_VBLANK: @@ -472,34 +485,24 @@ _tdm_thread_free_cb(tdm_private_thread_cb *cb) } static tdm_private_thread_cb * -_tdm_thread_find_cb(void *object, tdm_thread_cb_type cb_type, void *cb_data, tdm_thread_cb func, void *user_data, pid_t owner_tid) +_tdm_thread_find_cb(struct list_head *list, void *object, tdm_thread_cb_type cb_type, + void *cb_data, tdm_thread_cb func, void *user_data, pid_t caller_tid) { tdm_private_thread_cb *cb = NULL; - LIST_FOR_EACH_ENTRY(cb, &cb_list, link) { + LIST_FOR_EACH_ENTRY(cb, list, link) { if (cb->object == object && cb->cb_type == cb_type && cb->cb_data == cb_data && cb->func == func && cb->user_data == user_data && - cb->owner_tid == owner_tid) + cb->owner_tid == caller_tid) return cb; } return NULL; } -static void -_tdm_thread_reset_cb(tdm_thread_cb_type cb_type) -{ - tdm_private_thread_cb *cb = NULL; - - LIST_FOR_EACH_ENTRY(cb, &cb_list, link) { - if (cb->cb_type == cb_type) - cb->called = 0; - } -} - INTERN void tdm_thread_cb_set_find_func(tdm_thread_cb_type cb_type, tdm_thread_find_object func) { @@ -516,6 +519,7 @@ tdm_thread_cb_add(void *object, tdm_thread_cb_type cb_type, void *cb_data, tdm_t { tdm_private_thread_cb *cb = NULL; pid_t caller_tid; + struct list_head *list; TDM_RETURN_VAL_IF_FAIL(TDM_MUTEX_IS_LOCKED(), TDM_ERROR_OPERATION_FAILED); TDM_RETURN_VAL_IF_FAIL(object != NULL, TDM_ERROR_INVALID_PARAMETER); @@ -524,8 +528,16 @@ tdm_thread_cb_add(void *object, tdm_thread_cb_type cb_type, void *cb_data, tdm_t caller_tid = syscall(SYS_gettid); - cb = _tdm_thread_find_cb(object, cb_type, cb_data, func, user_data, caller_tid); + pthread_mutex_lock(&cb_list_lock); + + if (tdm_thread_in_display_thread(caller_tid)) + list = &cb_list[0]; + else + list = &cb_list[1]; + + cb = _tdm_thread_find_cb(list, object, cb_type, cb_data, func, user_data, caller_tid); if (cb) { + pthread_mutex_unlock(&cb_list_lock); TDM_ERR("can't be added twice with same data"); #if 1 assert(0); @@ -535,11 +547,12 @@ tdm_thread_cb_add(void *object, tdm_thread_cb_type cb_type, void *cb_data, tdm_t cb = calloc(1, sizeof *cb); if (!cb) { + pthread_mutex_unlock(&cb_list_lock); TDM_ERR("calloc failed"); return TDM_ERROR_OUT_OF_MEMORY; } - LIST_ADDTAIL(&cb->link, &cb_list); + LIST_ADDTAIL(&cb->link, list); LIST_INITHEAD(&cb->call_link); cb->object = object; @@ -550,7 +563,9 @@ tdm_thread_cb_add(void *object, tdm_thread_cb_type cb_type, void *cb_data, tdm_t cb->owner_tid = caller_tid; if (tdm_debug_module & TDM_DEBUG_THREAD) - TDM_INFO("cb_type(%d) cb(%p) added", cb_type, cb); + TDM_INFO("cb_type(%s) cb(%p) added", tdm_cb_type_str(cb_type), cb); + + pthread_mutex_unlock(&cb_list_lock); return TDM_ERROR_NONE; } @@ -560,6 +575,7 @@ tdm_thread_cb_remove(void *object, tdm_thread_cb_type cb_type, void *cb_data, td { tdm_private_thread_cb *cb; pid_t caller_tid; + struct list_head *list; TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED()); TDM_RETURN_IF_FAIL(object != NULL); @@ -568,11 +584,21 @@ tdm_thread_cb_remove(void *object, tdm_thread_cb_type cb_type, void *cb_data, td caller_tid = syscall(SYS_gettid); - cb = _tdm_thread_find_cb(object, cb_type, cb_data, func, user_data, caller_tid); - if (!cb) + pthread_mutex_lock(&cb_list_lock); + + if (tdm_thread_in_display_thread(caller_tid)) + list = &cb_list[0]; + else + list = &cb_list[1]; + + cb = _tdm_thread_find_cb(list, object, cb_type, cb_data, func, user_data, caller_tid); + if (!cb) { + pthread_mutex_unlock(&cb_list_lock); return; + } _tdm_thread_free_cb(cb); + pthread_mutex_unlock(&cb_list_lock); } /* when call a callback, we check both cb_base's type and cb_base's data, @@ -585,6 +611,7 @@ tdm_thread_cb_call(void *object, tdm_thread_cb_base *cb_base) tdm_private_thread_cb *cb = NULL, *hh = NULL; int handler_in_other_thread = 0; pid_t caller_tid; + struct list_head *list, *other_list; struct list_head call_list; tdm_error ret; @@ -607,35 +634,53 @@ tdm_thread_cb_call(void *object, tdm_thread_cb_base *cb_base) } } + pthread_mutex_lock(&cb_list_lock); + + if (tdm_thread_in_display_thread(caller_tid)) { + list = &cb_list[0]; + other_list = &cb_list[1]; + } else { + other_list = &cb_list[0]; + list = &cb_list[1]; + } + LIST_INITHEAD(&call_list); - LIST_FOR_EACH_ENTRY_SAFE(cb, hh, &cb_list, link) { - if (cb->called || - cb->object != object || + LIST_FOR_EACH_ENTRY_SAFE(cb, hh, list, link) { + if (cb->object != object || cb->cb_type != cb_base->type || cb->cb_data != cb_base->data) continue; - if (cb->owner_tid == caller_tid) - LIST_ADDTAIL(&cb->call_link, &call_list); - else - handler_in_other_thread = 1; + LIST_ADDTAIL(&cb->call_link, &call_list); } if (!LIST_IS_EMPTY(&call_list)) { LIST_FOR_EACH_ENTRY_SAFE(cb, hh, &call_list, call_link) { LIST_DELINIT(&cb->call_link); - cb->called = 1; if (tdm_debug_module & TDM_DEBUG_THREAD) - TDM_INFO("cb_type(%d) cb(%p) called", cb->cb_type, cb); + TDM_INFO("cb_type(%s) cb(%p) calling", tdm_cb_type_str(cb->cb_type), cb); + pthread_mutex_unlock(&cb_list_lock); cb->func(private_display, cb->object, cb_base, cb->user_data); + pthread_mutex_lock(&cb_list_lock); } } + pthread_mutex_unlock(&cb_list_lock); + assert(LIST_IS_EMPTY(&call_list)); + LIST_FOR_EACH_ENTRY_SAFE(cb, hh, other_list, link) { + if (cb->object != object || + cb->cb_type != cb_base->type || + cb->cb_data != cb_base->data) + continue; + + handler_in_other_thread = 1; + break; + } + if (!handler_in_other_thread) { - _tdm_thread_reset_cb(cb_base->type); if (keep_private_thread) { if (cb_base->sync) { pthread_cond_signal(&keep_private_thread->event_cond); -- 2.7.4 From db5780af098f675d9c7105ce26ebcb8cedb38937 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 23 Feb 2018 07:50:21 +0900 Subject: [PATCH 05/16] layer: correct error type Change-Id: I6bc89d04588ac3f94ed129943a0be12b94fd6fb0 --- src/tdm_layer.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/tdm_layer.c b/src/tdm_layer.c index 3afebd1..1f757ee 100644 --- a/src/tdm_layer.c +++ b/src/tdm_layer.c @@ -1115,8 +1115,6 @@ tdm_layer_get_displaying_buffer(tdm_layer *layer, tdm_error *error) if (private_layer->showing_buffer) { buffer = private_layer->showing_buffer->buffer; } else { - if (error) - *error = TDM_ERROR_OPERATION_FAILED; _pthread_mutex_unlock(&private_display->lock); TDM_DBG("layer(%p) showing_buffer is null", private_layer); return NULL; @@ -1313,7 +1311,7 @@ tdm_layer_set_video_pos(tdm_layer *layer, int zpos) if (!(private_layer->caps.capabilities & TDM_LAYER_CAPABILITY_VIDEO)) { TDM_ERR("layer(%p) is not video layer", private_layer); _pthread_mutex_unlock(&private_display->lock); - return TDM_ERROR_INVALID_PARAMETER; + return TDM_ERROR_BAD_REQUEST; } if (!func_layer->layer_set_video_pos) { -- 2.7.4 From fa0b43c5a0a3a5a81b27e8e36fb6ccc29159214c Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 23 Feb 2018 07:51:29 +0900 Subject: [PATCH 06/16] layer: correct set_buffer_queue behavior Change-Id: I7d72456f54ed91b392799918727886d8520e6b9f --- src/tdm_layer.c | 51 ++++++++++++++++----------------------------------- 1 file changed, 16 insertions(+), 35 deletions(-) diff --git a/src/tdm_layer.c b/src/tdm_layer.c index 1f757ee..79c7c2f 100644 --- a/src/tdm_layer.c +++ b/src/tdm_layer.c @@ -1131,7 +1131,7 @@ _tbm_layer_queue_acquirable_cb(tbm_surface_queue_h surface_queue, void *data) tdm_layer *layer = data; tdm_private_backend *private_backend; tdm_func_layer *func_layer; - tbm_surface_h surface = NULL; + tbm_surface_h buffer = NULL; tdm_private_layer_buffer *layer_buffer; LAYER_FUNC_ENTRY_VOID_RETURN(); @@ -1157,49 +1157,30 @@ _tbm_layer_queue_acquirable_cb(tbm_surface_queue_h surface_queue, void *data) } LIST_INITHEAD(&layer_buffer->link); - if (TBM_SURFACE_QUEUE_ERROR_NONE != tbm_surface_queue_acquire(private_layer->buffer_queue, &surface) || - surface == NULL) { + if (TBM_SURFACE_QUEUE_ERROR_NONE != tbm_surface_queue_acquire(private_layer->buffer_queue, &buffer) || + buffer == NULL) { /* LCOV_EXCL_START */ TDM_ERR("layer(%p) tbm_surface_queue_acquire() failed surface:%p", - private_layer, surface); + private_layer, buffer); _pthread_mutex_unlock(&private_display->lock); free(layer_buffer); return; /* LCOV_EXCL_STOP */ } - /* we don't need to handle pending data here because the changes in this function - * should be applied immediately. we can't expect calling tdm_layer_commit. - */ - ret = func_layer->layer_set_buffer(private_layer->layer_backend, surface); - TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); - - if (ret == TDM_ERROR_NONE) { - if (private_layer->waiting_buffer) { - TDM_DBG("layer(%p) drop waiting_buffer(%p)", private_layer, private_layer->waiting_buffer->buffer); - _tdm_layer_free_buffer(private_layer, private_layer->waiting_buffer); - } - - private_layer->waiting_buffer = layer_buffer; - private_layer->waiting_buffer->buffer = tdm_buffer_ref_backend(surface); - - if (tdm_debug_module & TDM_DEBUG_BUFFER) - TDM_INFO("layer(%p) waiting_buffer(%p)", - private_layer, private_layer->waiting_buffer->buffer); + ret = tdm_layer_set_buffer_internal(private_layer, buffer); + if (ret != TDM_ERROR_NONE) { + TDM_ERR("tdm_layer_set_buffer_internal failed"); + _pthread_mutex_unlock(&private_display->lock); + return; + } - if (private_output->commit_type == TDM_COMMIT_TYPE_OUTPUT) { - ret = tdm_output_commit_internal(private_layer->private_output, 0, NULL, NULL); - if (ret != TDM_ERROR_NONE) - TDM_ERR("tdm_output_commit_internal() is fail"); - } else if (private_output->commit_type == TDM_COMMIT_TYPE_LAYER) { - ret = _tdm_layer_commit(private_layer, NULL, NULL); - if (ret != TDM_ERROR_NONE) - TDM_ERR("layer(%p) _tdm_layer_commit() is fail", private_layer); - } else { - TDM_NEVER_GET_HERE(); - } - } else - _tdm_layer_free_buffer(private_layer, layer_buffer); + ret = tdm_layer_commit_internal(private_layer, NULL, NULL); + if (ret != TDM_ERROR_NONE) { + TDM_ERR("tdm_layer_commit_internal failed"); + _pthread_mutex_unlock(&private_display->lock); + return; + } _pthread_mutex_unlock(&private_display->lock); } -- 2.7.4 From 46b0ce93f95645589b5ee04092b9e768a7365e12 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 23 Feb 2018 08:08:32 +0900 Subject: [PATCH 07/16] log: remove time information from stdout Change-Id: I4328046076b3b4d6824a7eab5a357b8ddd163e82 --- common/tdm_log.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/common/tdm_log.c b/common/tdm_log.c index 1befbfb..aa68703 100644 --- a/common/tdm_log.c +++ b/common/tdm_log.c @@ -179,12 +179,9 @@ tdm_log_print(int level, const char *fmt, ...) __dlog_vprint(LOG_ID_SYSTEM, dlog_prio, LOG_TAG, fmt, arg); va_end(arg); } else { - struct timespec ts; char *lvl_str[] = {"TDM_NON", "TDM_ERR", "TDM_WRN", "TDM_INF", "TDM_DBG"}; char *color[] = {COLOR_RESET, COLOR_RED, COLOR_YELLOW, COLOR_GREEN, COLOR_RESET}; - clock_gettime(CLOCK_MONOTONIC, &ts); - pthread_mutex_lock(&log_lock); if (color_enable) @@ -192,7 +189,6 @@ tdm_log_print(int level, const char *fmt, ...) printf("[%s]", lvl_str[level]); if (color_enable) printf(COLOR_RESET); - printf("[%d.%06d]", (int)ts.tv_sec, (int)ts.tv_nsec / 1000); va_start(arg, fmt); vprintf(fmt, arg); va_end(arg); -- 2.7.4 From f1d99591b70ccd618592f2e9034f2d9b7b6ae205 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 23 Feb 2018 09:04:25 +0900 Subject: [PATCH 08/16] output: correct return type Change-Id: I927d257820e11dcfa5bf545c88f374d092d6fb7f --- src/tdm_output.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tdm_output.c b/src/tdm_output.c index 689eed0..49b113b 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -545,7 +545,7 @@ tdm_output_get_cursor_available_size(tdm_output *output, int *min_w, int *min_h, _pthread_mutex_unlock(&private_display->lock); - return TDM_ERROR_BAD_MODULE; + return TDM_ERROR_BAD_REQUEST; } if (min_w) -- 2.7.4 From 9e7971e27e1a50142add6f46e71689f784989c58 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 23 Feb 2018 09:05:24 +0900 Subject: [PATCH 09/16] helper: add tdm_helper_output_vblank_timer_expired To check if output-vblank is expired Change-Id: I4c3339a62f970372c2749808f2a8d930dd211935 --- include/tdm_helper.h | 8 ++++++++ src/tdm_helper.c | 9 +++++++++ src/tdm_output.c | 8 +++++++- src/tdm_private_types.h | 1 + 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/include/tdm_helper.h b/include/tdm_helper.h index fa82602..99fd638 100644 --- a/include/tdm_helper.h +++ b/include/tdm_helper.h @@ -236,6 +236,14 @@ tdm_helper_get_display_information(tdm_display *dpy, char *reply, int *len); int tdm_helper_output_commit_per_vblank_enabled(tdm_output *output); +/** + * @brief Get whether the vblank timer is expired or not for the output. + * @param[in] output An output the functionality has to be checked for + * @return -1 if error occurred, 1 if enabled, 0 if disabled. + */ +unsigned int +tdm_helper_output_vblank_timer_expired(tdm_output *output); + #ifdef __cplusplus } #endif diff --git a/src/tdm_helper.c b/src/tdm_helper.c index 6e2c5cf..0f6cd37 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -1087,3 +1087,12 @@ tdm_helper_output_commit_per_vblank_enabled(tdm_output *output) return !!private_output->commit_per_vblank; } +EXTERN unsigned int +tdm_helper_output_vblank_timer_expired(tdm_output *output) +{ + tdm_private_output *private_output = output; + + TDM_RETURN_VAL_IF_FAIL(private_output != NULL, -1); + + return private_output->vblank_timeout_timer_expired; +} \ No newline at end of file diff --git a/src/tdm_output.c b/src/tdm_output.c index 49b113b..53ea938 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -68,7 +68,12 @@ _tdm_output_vblank_timeout_cb(void *user_data) TDM_RETURN_VAL_IF_FAIL(private_output != NULL, TDM_ERROR_OPERATION_FAILED); - TDM_ERR("TDM output(%d) vblank TIMEOUT!!", private_output->pipe); + private_output->vblank_timeout_timer_expired++; + + TDM_ERR("TDM output(%d) vblank TIMEOUT!! (%d time%s)", + private_output->pipe, + private_output->vblank_timeout_timer_expired, + (private_output->vblank_timeout_timer_expired > 1) ? "s" : ""); LIST_FOR_EACH_ENTRY(v, &private_output->vblank_handler_list, link) { TDM_ERR("vblank_handler(%p) interval(%d) sync(%d) sent_to_frontend(%u) owner_tid(%d)", @@ -112,6 +117,7 @@ _tdm_output_vblank_timeout_update(tdm_private_output *private_output, int ms_del return; } TDM_INFO("output(%d) create vblank timeout timer", private_output->pipe); + private_output->vblank_timeout_timer_expired = 0; } ret = tdm_event_loop_source_timer_update(private_output->vblank_timeout_timer, ms_delay); diff --git a/src/tdm_private_types.h b/src/tdm_private_types.h index 099dae1..2b6d25d 100644 --- a/src/tdm_private_types.h +++ b/src/tdm_private_types.h @@ -208,6 +208,7 @@ struct _tdm_private_output { int layer_waiting_vblank; tdm_event_loop_source *vblank_timeout_timer; + unsigned int vblank_timeout_timer_expired; struct list_head change_handler_list; -- 2.7.4 From 83e01cfd8d96500b77c4fb905bc8d768e425ea16 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 23 Feb 2018 09:09:59 +0900 Subject: [PATCH 10/16] thread: remove test code Change-Id: I70f8d4bde93c521ba12ec2177666806da921e7e6 --- src/tdm_thread.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/tdm_thread.c b/src/tdm_thread.c index 6058bb3..3811bdc 100644 --- a/src/tdm_thread.c +++ b/src/tdm_thread.c @@ -539,9 +539,6 @@ tdm_thread_cb_add(void *object, tdm_thread_cb_type cb_type, void *cb_data, tdm_t if (cb) { pthread_mutex_unlock(&cb_list_lock); TDM_ERR("can't be added twice with same data"); -#if 1 - assert(0); -#endif return TDM_ERROR_BAD_REQUEST; } -- 2.7.4 From d3fda9bb164da6aac9c3803d0182cc1b179e6084 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 23 Feb 2018 10:50:40 +0900 Subject: [PATCH 11/16] output: don't touch return params when failed Change-Id: Iba17eb76a47078f3bd37e338318bbcc8354a69d6 --- src/tdm_output.c | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/tdm_output.c b/src/tdm_output.c index 53ea938..ae4e359 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -537,20 +537,7 @@ tdm_output_get_cursor_available_size(tdm_output *output, int *min_w, int *min_h, _pthread_mutex_lock(&private_display->lock); if (!tdm_backend_check_module_abi(private_output->private_backend, 1, 5)) { - - if (min_w) - *min_w = -1; - if (min_h) - *min_h = -1; - if (max_w) - *max_w = -1; - if (max_h) - *max_h = -1; - if (preferred_align) - *preferred_align = -1; - _pthread_mutex_unlock(&private_display->lock); - return TDM_ERROR_BAD_REQUEST; } -- 2.7.4 From aabb1bea385b9a443fc4b79b11165f938ac6f1ca Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 23 Feb 2018 15:37:11 +0900 Subject: [PATCH 12/16] tdm: add missed description Change-Id: I91f0053a9e97459ec5269cc1fb638adc310c74e4 --- include/tdm.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/tdm.h b/include/tdm.h index 3cae42f..6bc822f 100644 --- a/include/tdm.h +++ b/include/tdm.h @@ -738,6 +738,7 @@ tdm_output_hwc_get_video_supported_formats(tdm_layer *layer, const tbm_format ** /** * @brief Get a output object of a layer object * @param[in] layer A layer object + * @param[out] error #TDM_ERROR_NONE if success. Otherwise, error value. * @return A TDM output object if success. Otherwise, NULL. */ tdm_output* @@ -892,6 +893,7 @@ tdm_layer_remove_commit_handler(tdm_layer *layer, tdm_layer_commit_handler func, * @details A displaying TDM buffer is a current showing buffer on screen * that is set to layer object and applied output object of a layer object. * @param[in] layer A layer object + * @param[out] error #TDM_ERROR_NONE if success. Otherwise, error value. * @return A TDM buffer if success. Otherwise, NULL. */ tbm_surface_h -- 2.7.4 From 39d1cdbb97a02a6008fe8e64a0a3de826c3c5684 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 23 Feb 2018 15:37:50 +0900 Subject: [PATCH 13/16] buffer: not allow adding handler twice Change-Id: I385a17820ff81f527ab21e0d01dbe07e274dace0 --- src/tdm_buffer.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/tdm_buffer.c b/src/tdm_buffer.c index 5d501b0..31e8c41 100644 --- a/src/tdm_buffer.c +++ b/src/tdm_buffer.c @@ -120,7 +120,7 @@ tdm_buffer_add_release_handler(tbm_surface_h buffer, tdm_buffer_release_handler func, void *user_data) { tdm_buffer_info *buf_info; - tdm_buffer_func_info *func_info; + tdm_buffer_func_info *func_info = NULL; TDM_RETURN_VAL_IF_FAIL(buffer != NULL, TDM_ERROR_INVALID_PARAMETER); TDM_RETURN_VAL_IF_FAIL(func != NULL, TDM_ERROR_INVALID_PARAMETER); @@ -128,6 +128,13 @@ tdm_buffer_add_release_handler(tbm_surface_h buffer, buf_info = tdm_buffer_get_info(buffer); TDM_RETURN_VAL_IF_FAIL(buf_info != NULL, TDM_ERROR_OUT_OF_MEMORY); + LIST_FOR_EACH_ENTRY(func_info, &buf_info->release_funcs, link) { + if (func_info->release_func == func && func_info->user_data == user_data) { + TDM_ERR("can't add twice"); + return TDM_ERROR_BAD_REQUEST; + } + } + func_info = calloc(1, sizeof(tdm_buffer_func_info)); TDM_RETURN_VAL_IF_FAIL(func_info != NULL, TDM_ERROR_OUT_OF_MEMORY); @@ -240,6 +247,13 @@ tdm_buffer_add_destroy_handler(tbm_surface_h buffer, buf_info = tdm_buffer_get_info(buffer); TDM_RETURN_VAL_IF_FAIL(buf_info != NULL, TDM_ERROR_OUT_OF_MEMORY); + LIST_FOR_EACH_ENTRY(func_info, &buf_info->destroy_funcs, link) { + if (func_info->destroy_func == func && func_info->user_data == user_data) { + TDM_ERR("can't add twice"); + return TDM_ERROR_BAD_REQUEST; + } + } + func_info = calloc(1, sizeof(tdm_buffer_func_info)); TDM_RETURN_VAL_IF_FAIL(func_info != NULL, TDM_ERROR_OUT_OF_MEMORY); -- 2.7.4 From d2069700e013e5f7f7eb0b18cd5fc637587e21f1 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 23 Feb 2018 15:38:12 +0900 Subject: [PATCH 14/16] output: not allow adding handler twice Change-Id: I63ff48c75010263e96f765366d6a7f3ec5988dae --- src/tdm_output.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/tdm_output.c b/src/tdm_output.c index ae4e359..ed860d3 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -314,13 +314,21 @@ tdm_output_add_change_handler(tdm_output *output, tdm_output_change_handler func, void *user_data) { - tdm_private_output_change_handler *change_handler; + tdm_private_output_change_handler *change_handler = NULL; OUTPUT_FUNC_ENTRY(); TDM_RETURN_VAL_IF_FAIL(func != NULL, TDM_ERROR_INVALID_PARAMETER); _pthread_mutex_lock(&private_display->lock); + LIST_FOR_EACH_ENTRY(change_handler, &private_output->change_handler_list, link) { + if (change_handler->func == func || change_handler->user_data == user_data) { + TDM_ERR("can't add twice"); + _pthread_mutex_unlock(&private_display->lock); + return TDM_ERROR_BAD_REQUEST; + } + } + change_handler = calloc(1, sizeof(tdm_private_output_change_handler)); if (!change_handler) { /* LCOV_EXCL_START */ -- 2.7.4 From 279452f7f7879b87d2f4fdfdec64bb1286c92a02 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 23 Feb 2018 15:38:44 +0900 Subject: [PATCH 15/16] layer: fix syntax error Change-Id: Ie57843ae9735804d50e3118340d86b9fa0db56ca --- src/tdm_layer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tdm_layer.c b/src/tdm_layer.c index 79c7c2f..d22a1de 100644 --- a/src/tdm_layer.c +++ b/src/tdm_layer.c @@ -752,7 +752,7 @@ _tdm_layer_cb_output_commit(tdm_output *output, unsigned int sequence, if (layer_commit_handler->func) { _pthread_mutex_unlock(&private_display->lock); - layer_commit_handler->func(private_output, sequence, + layer_commit_handler->func(private_layer, sequence, tv_sec, tv_usec, layer_commit_handler->user_data); _pthread_mutex_lock(&private_display->lock); } -- 2.7.4 From 805e6f0b8f83dabebb8eb0ee21bad9e131dd33bb Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 23 Feb 2018 15:39:09 +0900 Subject: [PATCH 16/16] vblank: add tdm_vblank_get_output Change-Id: Ibad717742bb0ebe8ad7b92926c1b48bdc3fc37ac --- include/tdm.h | 10 ++++++++++ src/tdm_vblank.c | 14 ++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/include/tdm.h b/include/tdm.h index 6bc822f..9ae31a3 100644 --- a/include/tdm.h +++ b/include/tdm.h @@ -1350,6 +1350,16 @@ void tdm_vblank_destroy(tdm_vblank *vblank); /** + * @brief Get a output object of a vblank object + * @param[in] vblank A vblank object + * @param[out] error #TDM_ERROR_NONE if success. Otherwise, error value. + * @return A TDM output object if success. Otherwise, NULL. + * @see #tdm_vblank_create + */ +tdm_output * +tdm_vblank_get_output(tdm_vblank *vblank, tdm_error *error); + +/** * @brief Get the client PID for a vblank object * @param[in] vblank A vblank object * @param[out] pid PID of vblank's client diff --git a/src/tdm_vblank.c b/src/tdm_vblank.c index d0839ba..e1ba393 100644 --- a/src/tdm_vblank.c +++ b/src/tdm_vblank.c @@ -827,6 +827,20 @@ tdm_vblank_destroy(tdm_vblank *vblank) free(private_vblank); } +EXTERN tdm_output * +tdm_vblank_get_output(tdm_vblank *vblank, tdm_error *error) +{ + tdm_private_vblank *private_vblank = vblank; + tdm_error ret = TDM_ERROR_NONE; + + TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(tdm_vblank_is_valid(vblank), TDM_ERROR_INVALID_PARAMETER, NULL); + + if (error) + *error = TDM_ERROR_NONE; + + return private_vblank->output; +} + EXTERN tdm_error tdm_vblank_get_client_pid(tdm_vblank *vblank, pid_t *pid) { -- 2.7.4