From 1291e14b597459fc5eb7f6ec19ab09e0a3837b50 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Thu, 17 Mar 2016 12:03:06 +0900 Subject: [PATCH] unref buffer when destroyed Change-Id: I71ed02cfe70569c25b175142c0420387e70825c1 --- src/tdm_capture.c | 13 +++++++++++-- src/tdm_pp.c | 24 ++++++++++++++++++++---- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/tdm_capture.c b/src/tdm_capture.c index 133de4b..a68739d 100644 --- a/src/tdm_capture.c +++ b/src/tdm_capture.c @@ -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); diff --git a/src/tdm_pp.c b/src/tdm_pp.c index ad6f8a5..cd88f49 100644 --- a/src/tdm_pp.c +++ b/src/tdm_pp.c @@ -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); -- 2.7.4