From: Boram Park Date: Wed, 9 Mar 2016 04:27:31 +0000 (+0900) Subject: enhance log for buffer debugging X-Git-Tag: submit/tizen/20160311.061039~3 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ff966f3f14a879b9dde736549ea662233b22f7ec;p=platform%2Fcore%2Fuifw%2Flibtdm.git enhance log for buffer debugging Change-Id: I0b5cda4cf5cb00e4ef3d000a8a16844db3b36e17 --- diff --git a/include/tdm_log.h b/include/tdm_log.h index 1952e2a0..451bbf89 100644 --- a/include/tdm_log.h +++ b/include/tdm_log.h @@ -52,6 +52,7 @@ extern "C" { * @endcode */ extern int tdm_debug; +extern int tdm_debug_buffer; //#define TDM_CONFIG_DLOG #ifdef TDM_CONFIG_DLOG diff --git a/src/tdm.c b/src/tdm.c index 05f72c59..2933a23c 100644 --- a/src/tdm.c +++ b/src/tdm.c @@ -500,6 +500,7 @@ tdm_display_update(tdm_display *dpy) #define DEFAULT_MODULE "libtdm-default"SUFFIX_MODULE int tdm_debug; +int tdm_debug_buffer; static tdm_private_display *g_private_display; static pthread_mutex_t gLock = PTHREAD_MUTEX_INITIALIZER; @@ -736,6 +737,10 @@ tdm_display_init(tdm_error *error) if (debug && (strstr(debug, "1"))) tdm_debug = 1; + debug = getenv("TDM_DEBUG_BUFFER"); + if (debug && (strstr(debug, "1"))) + tdm_debug_buffer = 1; + private_display = calloc(1, sizeof(tdm_private_display)); if (!private_display) { ret = TDM_ERROR_OUT_OF_MEMORY; @@ -784,6 +789,7 @@ failed_mutex_init: free(private_display); failed_alloc: tdm_debug = 0; + tdm_debug_buffer = 0; if (error) *error = ret; pthread_mutex_unlock(&gLock); @@ -820,6 +826,7 @@ tdm_display_deinit(tdm_display *dpy) free(private_display); g_private_display = NULL; tdm_debug = 0; + tdm_debug_buffer = 0; pthread_mutex_unlock(&gLock); } diff --git a/src/tdm_buffer.c b/src/tdm_buffer.c index 1385e18a..33838df3 100644 --- a/src/tdm_buffer.c +++ b/src/tdm_buffer.c @@ -60,6 +60,8 @@ typedef struct _tdm_buffer_info { struct list_head release_funcs; struct list_head destroy_funcs; + + struct list_head link; } tdm_buffer_info; static void @@ -84,6 +86,8 @@ _tdm_buffer_destroy_info(void *user_data) free(func_info); } + LIST_DEL(&buf_info->link); + free(buf_info); } @@ -106,6 +110,7 @@ _tdm_buffer_get_info(tbm_surface_h buffer) LIST_INITHEAD(&buf_info->release_funcs); LIST_INITHEAD(&buf_info->destroy_funcs); + LIST_INITHEAD(&buf_info->link); tbm_bo_add_user_data(bo, TDM_BUFFER_KEY, _tdm_buffer_destroy_info); tbm_bo_set_user_data(bo, TDM_BUFFER_KEY, buf_info); @@ -248,3 +253,61 @@ tdm_buffer_remove_destroy_handler(tbm_surface_h buffer, return; } } + +INTERN void +tdm_buffer_add_list(struct list_head *list, tbm_surface_h buffer) +{ + tdm_buffer_info *buf_info; + + TDM_RETURN_IF_FAIL(list != NULL); + TDM_RETURN_IF_FAIL(buffer != NULL); + + buf_info = _tdm_buffer_get_info(buffer); + TDM_RETURN_IF_FAIL(buf_info != NULL); + + if (buf_info->link.prev != buf_info->link.next) { + TDM_ERR("%p already added other list\n", buffer); + return; + } + + LIST_ADD(&buf_info->link, list); +} + +INTERN void +tdm_buffer_remove_list(struct list_head *list, tbm_surface_h buffer) +{ + tdm_buffer_info *buf_info, *b = NULL, *bb = NULL; + + TDM_RETURN_IF_FAIL(list != NULL); + + if (!buffer) + return; + + buf_info = _tdm_buffer_get_info(buffer); + TDM_RETURN_IF_FAIL(buf_info != NULL); + + LIST_FOR_EACH_ENTRY_SAFE(b, bb, list, link) { + if (b == buf_info) { + LIST_DEL(&buf_info->link); + return; + } + } +} + +INTERN void +tdm_buffer_dump_list(struct list_head *list, char *str, int len) +{ + tdm_buffer_info *buf_info = NULL; + + TDM_RETURN_IF_FAIL(list != NULL); + + LIST_FOR_EACH_ENTRY(buf_info, list, link) { + if (len > 0) { + int l = snprintf(str, len, " %p", buf_info->buffer); + str += l; + len -= l; + } + else + break; + } +} diff --git a/src/tdm_capture.c b/src/tdm_capture.c index 1bcbd1a0..6c3fed69 100644 --- a/src/tdm_capture.c +++ b/src/tdm_capture.c @@ -68,6 +68,11 @@ _tdm_caputre_cb_done(tdm_capture *capture_backend, tbm_surface_h buffer, lock_after_cb_done = 1; } + if (tdm_debug_buffer) + TDM_INFO("done: %p", buffer); + + tdm_buffer_remove_list(&private_capture->buffer_list, buffer); + tdm_buffer_unref_backend(buffer); if (lock_after_cb_done) @@ -126,6 +131,8 @@ tdm_capture_create_output_internal(tdm_private_output *private_output, private_capture->private_layer = NULL; private_capture->capture_backend = capture_backend; + LIST_INITHEAD(&private_capture->buffer_list); + if (error) *error = TDM_ERROR_NONE; @@ -172,6 +179,8 @@ tdm_capture_create_layer_internal(tdm_private_layer *private_layer, private_capture->private_layer = private_layer; private_capture->capture_backend = capture_backend; + LIST_INITHEAD(&private_capture->buffer_list); + if (error) *error = TDM_ERROR_NONE; @@ -191,6 +200,13 @@ tdm_capture_destroy_internal(tdm_private_capture *private_capture) func_capture = &private_capture->private_display->func_capture; func_capture->capture_destroy(private_capture->capture_backend); + if (!LIST_IS_EMPTY(&private_capture->buffer_list)) { + char str[256] = {0,}; + tdm_buffer_dump_list(&private_capture->buffer_list, str, 256); + if (strlen(str) > 0) + TDM_WRN("not finished: %s buffers", str); + } + free(private_capture); } @@ -248,6 +264,15 @@ tdm_capture_attach(tdm_capture *capture, tbm_surface_h buffer) tdm_buffer_ref_backend(buffer); ret = func_capture->capture_attach(private_capture->capture_backend, buffer); + if (ret == TDM_ERROR_NONE) + tdm_buffer_add_list(&private_capture->buffer_list, buffer); + + if (tdm_debug_buffer) { + char str[256] = {0,}; + tdm_buffer_dump_list(&private_capture->buffer_list, str, 256); + TDM_INFO("attached: %s", str); + } + pthread_mutex_unlock(&private_display->lock); return ret; diff --git a/src/tdm_pp.c b/src/tdm_pp.c index 3962bbe8..82944660 100644 --- a/src/tdm_pp.c +++ b/src/tdm_pp.c @@ -68,6 +68,11 @@ _tdm_pp_cb_done(tdm_pp *pp_backend, tbm_surface_h src, tbm_surface_h dst, lock_after_cb_done = 1; } + if (tdm_debug_buffer) + TDM_INFO("done: %p", src); + + tdm_buffer_remove_list(&private_pp->buffer_list, src); + tdm_buffer_unref_backend(src); tdm_buffer_unref_backend(dst); @@ -123,6 +128,8 @@ tdm_pp_create_internal(tdm_private_display *private_display, tdm_error *error) private_pp->private_display = private_display; private_pp->pp_backend = pp_backend; + LIST_INITHEAD(&private_pp->buffer_list); + if (error) *error = TDM_ERROR_NONE; @@ -143,6 +150,13 @@ tdm_pp_destroy_internal(tdm_private_pp *private_pp) func_pp->pp_destroy(private_pp->pp_backend); + if (!LIST_IS_EMPTY(&private_pp->buffer_list)) { + char str[256] = {0,}; + tdm_buffer_dump_list(&private_pp->buffer_list, str, 256); + if (strlen(str) > 0) + TDM_WRN("not finished: %s buffers", str); + } + free(private_pp); } @@ -213,6 +227,15 @@ tdm_pp_attach(tdm_pp *pp, tbm_surface_h src, tbm_surface_h dst) tdm_buffer_ref_backend(dst); ret = func_pp->pp_attach(private_pp->pp_backend, src, dst); + if (ret == TDM_ERROR_NONE) + tdm_buffer_add_list(&private_pp->buffer_list, src); + + if (tdm_debug_buffer) { + char str[256] = {0,}; + tdm_buffer_dump_list(&private_pp->buffer_list, str, 256); + TDM_INFO("attached: %s", str); + } + pthread_mutex_unlock(&private_display->lock); return ret; diff --git a/src/tdm_private.h b/src/tdm_private.h index accb10f0..9ac18ba5 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -236,6 +236,8 @@ struct _tdm_private_pp { tdm_private_display *private_display; tdm_pp *pp_backend; + + struct list_head buffer_list; }; struct _tdm_private_capture { @@ -248,6 +250,8 @@ struct _tdm_private_capture { tdm_private_layer *private_layer; tdm_capture *capture_backend; + + struct list_head buffer_list; }; struct _tdm_private_vblank_handler { @@ -280,6 +284,13 @@ tdm_capture_create_layer_internal(tdm_private_layer *private_layer, void tdm_capture_destroy_internal(tdm_private_capture *private_capture); +void +tdm_buffer_add_list(struct list_head *list, tbm_surface_h buffer); +void +tdm_buffer_remove_list(struct list_head *list, tbm_surface_h buffer); +void +tdm_buffer_dump_list(struct list_head *list, char *str, int len); + #ifdef __cplusplus } #endif