enhance log for buffer debugging 80/61580/1
authorBoram Park <boram1288.park@samsung.com>
Wed, 9 Mar 2016 04:27:31 +0000 (13:27 +0900)
committerBoram Park <boram1288.park@samsung.com>
Wed, 9 Mar 2016 04:27:31 +0000 (13:27 +0900)
Change-Id: I0b5cda4cf5cb00e4ef3d000a8a16844db3b36e17

include/tdm_log.h
src/tdm.c
src/tdm_buffer.c
src/tdm_capture.c
src/tdm_pp.c
src/tdm_private.h

index 1952e2a..451bbf8 100644 (file)
@@ -52,6 +52,7 @@ extern "C" {
  * @endcode
  */
 extern int tdm_debug;
+extern int tdm_debug_buffer;
 
 //#define TDM_CONFIG_DLOG
 #ifdef TDM_CONFIG_DLOG
index 05f72c5..2933a23 100644 (file)
--- 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);
 }
index 1385e18..33838df 100644 (file)
@@ -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;
+       }
+}
index 1bcbd1a..6c3fed6 100644 (file)
@@ -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;
index 3962bbe..8294466 100644 (file)
@@ -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;
index accb10f..9ac18ba 100644 (file)
@@ -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