From: Boram Park Date: Tue, 27 Dec 2016 05:32:15 +0000 (+0900) Subject: fix ATOMICITY issue X-Git-Tag: accepted/tizen/3.0/common/20170109.195527~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;ds=sidebyside;h=71680d53b675b006191f7cd548cdca1b48d11ee6;p=platform%2Fcore%2Fuifw%2Flibtdm.git fix ATOMICITY issue Change-Id: I08cf135d0a5511c312c3b5f4c2e40857099c714d --- diff --git a/src/tdm_capture.c b/src/tdm_capture.c index c532754..6197013 100644 --- a/src/tdm_capture.c +++ b/src/tdm_capture.c @@ -327,6 +327,7 @@ tdm_capture_destroy_internal(tdm_private_capture *private_capture) tdm_private_display *private_display; tdm_func_capture *func_capture; tdm_buffer_info *b = NULL, *bb = NULL; + struct list_head clone_list; TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED()); @@ -345,26 +346,38 @@ tdm_capture_destroy_internal(tdm_private_capture *private_capture) TDM_WRN("capture(%p) not finished:", private_capture); _tdm_capture_print_list(&private_capture->pending_buffer_list); + LIST_INITHEAD(&clone_list); LIST_FOR_EACH_ENTRY_SAFE(b, bb, &private_capture->pending_buffer_list, link) { LIST_DEL(&b->link); - _pthread_mutex_unlock(&private_display->lock); + LIST_ADDTAIL(&b->link, &clone_list); + } + + _pthread_mutex_unlock(&private_display->lock); + LIST_FOR_EACH_ENTRY_SAFE(b, bb, &clone_list, link) { + LIST_DEL(&b->link); tdm_buffer_unref_backend(b->buffer); - _pthread_mutex_lock(&private_display->lock); free(b); } + _pthread_mutex_lock(&private_display->lock); } if (!LIST_IS_EMPTY(&private_capture->buffer_list)) { TDM_WRN("capture(%p) not finished:", private_capture); _tdm_capture_print_list(&private_capture->buffer_list); + LIST_INITHEAD(&clone_list); LIST_FOR_EACH_ENTRY_SAFE(b, bb, &private_capture->buffer_list, link) { LIST_DEL(&b->link); - _pthread_mutex_unlock(&private_display->lock); + LIST_ADDTAIL(&b->link, &clone_list); + } + + _pthread_mutex_unlock(&private_display->lock); + LIST_FOR_EACH_ENTRY_SAFE(b, bb, &clone_list, link) { + LIST_DEL(&b->link); tdm_buffer_unref_backend(b->buffer); - _pthread_mutex_lock(&private_display->lock); free(b); } + _pthread_mutex_lock(&private_display->lock); } private_capture->stamp = 0; diff --git a/src/tdm_pp.c b/src/tdm_pp.c index 563ae0d..3be10d3 100644 --- a/src/tdm_pp.c +++ b/src/tdm_pp.c @@ -247,6 +247,7 @@ tdm_pp_destroy_internal(tdm_private_pp *private_pp) tdm_private_display *private_display; tdm_func_pp *func_pp; tdm_pp_private_buffer *b = NULL, *bb = NULL; + struct list_head clone_list; TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED()); @@ -264,28 +265,40 @@ tdm_pp_destroy_internal(tdm_private_pp *private_pp) TDM_WRN("pp(%p) not finished:", private_pp); _tdm_pp_print_list(&private_pp->pending_buffer_list); + LIST_INITHEAD(&clone_list); LIST_FOR_EACH_ENTRY_SAFE(b, bb, &private_pp->pending_buffer_list, link) { LIST_DEL(&b->link); - _pthread_mutex_unlock(&private_display->lock); + LIST_ADDTAIL(&b->link, &clone_list); + } + + _pthread_mutex_unlock(&private_display->lock); + LIST_FOR_EACH_ENTRY_SAFE(b, bb, &clone_list, link) { + LIST_DEL(&b->link); tdm_buffer_unref_backend(b->src); tdm_buffer_unref_backend(b->dst); - _pthread_mutex_lock(&private_display->lock); free(b); } + _pthread_mutex_lock(&private_display->lock); } if (!LIST_IS_EMPTY(&private_pp->buffer_list)) { TDM_WRN("pp(%p) not finished:", private_pp); _tdm_pp_print_list(&private_pp->buffer_list); + LIST_INITHEAD(&clone_list); LIST_FOR_EACH_ENTRY_SAFE(b, bb, &private_pp->buffer_list, link) { LIST_DEL(&b->link); - _pthread_mutex_unlock(&private_display->lock); + LIST_ADDTAIL(&b->link, &clone_list); + } + + _pthread_mutex_unlock(&private_display->lock); + LIST_FOR_EACH_ENTRY_SAFE(b, bb, &clone_list, link) { + LIST_DEL(&b->link); tdm_buffer_unref_backend(b->src); tdm_buffer_unref_backend(b->dst); - _pthread_mutex_lock(&private_display->lock); free(b); } + _pthread_mutex_lock(&private_display->lock); } private_pp->stamp = 0;