unref buffer when destroyed 07/62607/2
authorBoram Park <boram1288.park@samsung.com>
Thu, 17 Mar 2016 03:03:06 +0000 (12:03 +0900)
committerBoram Park <boram1288.park@samsung.com>
Thu, 17 Mar 2016 03:08:22 +0000 (12:08 +0900)
Change-Id: I71ed02cfe70569c25b175142c0420387e70825c1

src/tdm_capture.c
src/tdm_pp.c

index 133de4b..a68739d 100644 (file)
@@ -222,6 +222,7 @@ tdm_capture_create_layer_internal(tdm_private_layer *private_layer,
 INTERN void
 tdm_capture_destroy_internal(tdm_private_capture *private_capture)
 {
+       tdm_private_display *private_display = private_capture->private_display;
        tdm_func_capture *func_capture;
        tdm_buffer_info *b = NULL, *bb = NULL;
 
@@ -237,16 +238,24 @@ tdm_capture_destroy_internal(tdm_private_capture *private_capture)
                TDM_ERR("capture(%p) not finished:", private_capture);
                tdm_buffer_list_dump(&private_capture->pending_buffer_list);
 
-               LIST_FOR_EACH_ENTRY_SAFE(b, bb, &private_capture->pending_buffer_list, link)
+               LIST_FOR_EACH_ENTRY_SAFE(b, bb, &private_capture->pending_buffer_list, link) {
                        LIST_DEL(&b->link);
+                       pthread_mutex_unlock(&private_display->lock);
+                       tdm_buffer_unref_backend(b->buffer);
+                       pthread_mutex_lock(&private_display->lock);
+               }
        }
 
        if (!LIST_IS_EMPTY(&private_capture->buffer_list)) {
                TDM_ERR("capture(%p) not finished:", private_capture);
                tdm_buffer_list_dump(&private_capture->buffer_list);
 
-               LIST_FOR_EACH_ENTRY_SAFE(b, bb, &private_capture->buffer_list, link)
+               LIST_FOR_EACH_ENTRY_SAFE(b, bb, &private_capture->buffer_list, link) {
                        LIST_DEL(&b->link);
+                       pthread_mutex_unlock(&private_display->lock);
+                       tdm_buffer_unref_backend(b->buffer);
+                       pthread_mutex_lock(&private_display->lock);
+               }
        }
 
        free(private_capture);
index ad6f8a5..cd88f49 100644 (file)
@@ -211,32 +211,48 @@ tdm_pp_destroy_internal(tdm_private_pp *private_pp)
                TDM_ERR("pp(%p) not finished:", private_pp);
                tdm_buffer_list_dump(&private_pp->src_pending_buffer_list);
 
-               LIST_FOR_EACH_ENTRY_SAFE(b, bb, &private_pp->src_pending_buffer_list, link)
+               LIST_FOR_EACH_ENTRY_SAFE(b, bb, &private_pp->src_pending_buffer_list, link) {
                        LIST_DEL(&b->link);
+                       pthread_mutex_unlock(&private_display->lock);
+                       tdm_buffer_unref_backend(b->buffer);
+                       pthread_mutex_lock(&private_display->lock);
+               }
        }
 
        if (!LIST_IS_EMPTY(&private_pp->dst_pending_buffer_list)) {
                TDM_ERR("pp(%p) not finished:", private_pp);
                tdm_buffer_list_dump(&private_pp->dst_pending_buffer_list);
 
-               LIST_FOR_EACH_ENTRY_SAFE(b, bb, &private_pp->dst_pending_buffer_list, link)
+               LIST_FOR_EACH_ENTRY_SAFE(b, bb, &private_pp->dst_pending_buffer_list, link) {
                        LIST_DEL(&b->link);
+                       pthread_mutex_unlock(&private_display->lock);
+                       tdm_buffer_unref_backend(b->buffer);
+                       pthread_mutex_lock(&private_display->lock);
+               }
        }
 
        if (!LIST_IS_EMPTY(&private_pp->src_buffer_list)) {
                TDM_ERR("pp(%p) not finished:", private_pp);
                tdm_buffer_list_dump(&private_pp->src_buffer_list);
 
-               LIST_FOR_EACH_ENTRY_SAFE(b, bb, &private_pp->src_buffer_list, link)
+               LIST_FOR_EACH_ENTRY_SAFE(b, bb, &private_pp->src_buffer_list, link) {
                        LIST_DEL(&b->link);
+                       pthread_mutex_unlock(&private_display->lock);
+                       tdm_buffer_unref_backend(b->buffer);
+                       pthread_mutex_lock(&private_display->lock);
+               }
        }
 
        if (!LIST_IS_EMPTY(&private_pp->dst_buffer_list)) {
                TDM_ERR("pp(%p) not finished:", private_pp);
                tdm_buffer_list_dump(&private_pp->dst_buffer_list);
 
-               LIST_FOR_EACH_ENTRY_SAFE(b, bb, &private_pp->dst_buffer_list, link)
+               LIST_FOR_EACH_ENTRY_SAFE(b, bb, &private_pp->dst_buffer_list, link) {
                        LIST_DEL(&b->link);
+                       pthread_mutex_unlock(&private_display->lock);
+                       tdm_buffer_unref_backend(b->buffer);
+                       pthread_mutex_lock(&private_display->lock);
+               }
        }
 
        free(private_pp);