fix ATOMICITY issue 86/107186/2
authorBoram Park <boram1288.park@samsung.com>
Tue, 27 Dec 2016 05:32:15 +0000 (14:32 +0900)
committerBoram Park <boram1288.park@samsung.com>
Tue, 27 Dec 2016 05:39:41 +0000 (14:39 +0900)
Change-Id: I08cf135d0a5511c312c3b5f4c2e40857099c714d

src/tdm_capture.c
src/tdm_pp.c

index c532754..6197013 100644 (file)
@@ -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;
index 563ae0d..3be10d3 100644 (file)
@@ -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;