output: correct buffer leak when calling tdm_output_commit without a handler 11/171711/1
authorBoram Park <boram1288.park@samsung.com>
Wed, 7 Mar 2018 01:20:54 +0000 (10:20 +0900)
committerBoram Park <boram1288.park@samsung.com>
Wed, 7 Mar 2018 01:35:48 +0000 (10:35 +0900)
Change-Id: I032d556d6cab02d5bed3076e91fe57ed745a6bd3

src/tdm_layer.c
src/tdm_output.c
src/tdm_private.h

index f37a948..b36f37f 100644 (file)
@@ -71,7 +71,6 @@
        private_output = private_layer->private_output; \
        private_display = private_output->private_display
 
-static void _tdm_layer_free_buffer(tdm_private_layer *private_layer, tdm_private_layer_buffer *layer_buffer);
 static void _tdm_layer_cb_wait_vblank(tdm_vblank *vblank, tdm_error error, unsigned int sequence,
                                                                          unsigned int tv_sec, unsigned int tv_usec, void *user_data);
 static void _tbm_layer_queue_acquirable_cb(tbm_surface_queue_h surface_queue, void *data);
@@ -347,8 +346,8 @@ _tdm_layer_dump_buffer(tdm_layer *layer, tbm_surface_h buffer)
 }
 /* LCOV_EXCL_STOP */
 
-static void
-_tdm_layer_free_buffer(tdm_private_layer *private_layer, tdm_private_layer_buffer *layer_buffer)
+void
+tdm_layer_free_buffer(tdm_private_layer *private_layer, tdm_private_layer_buffer *layer_buffer)
 {
        tdm_private_display *private_display;
 
@@ -380,7 +379,7 @@ _tdm_layer_free_all_buffers(tdm_private_layer *private_layer)
        _tdm_layer_reset_pending_data(private_layer);
 
        if (private_layer->waiting_buffer) {
-               _tdm_layer_free_buffer(private_layer, private_layer->waiting_buffer);
+               tdm_layer_free_buffer(private_layer, private_layer->waiting_buffer);
                private_layer->waiting_buffer = NULL;
 
                if (tdm_debug_module & TDM_DEBUG_BUFFER)
@@ -389,7 +388,7 @@ _tdm_layer_free_all_buffers(tdm_private_layer *private_layer)
        }
 
        if (private_layer->committed_buffer) {
-               _tdm_layer_free_buffer(private_layer, private_layer->committed_buffer);
+               tdm_layer_free_buffer(private_layer, private_layer->committed_buffer);
                private_layer->committed_buffer = NULL;
 
                if (tdm_debug_module & TDM_DEBUG_BUFFER)
@@ -398,7 +397,7 @@ _tdm_layer_free_all_buffers(tdm_private_layer *private_layer)
        }
 
        if (private_layer->showing_buffer) {
-               _tdm_layer_free_buffer(private_layer, private_layer->showing_buffer);
+               tdm_layer_free_buffer(private_layer, private_layer->showing_buffer);
                private_layer->showing_buffer = NULL;
 
                if (tdm_debug_module & TDM_DEBUG_BUFFER)
@@ -416,7 +415,7 @@ _tdm_layer_free_all_buffers(tdm_private_layer *private_layer)
        LIST_FOR_EACH_ENTRY_SAFE(lm, lmm, &clone_list, link) {
                LIST_DEL(&lm->link);
                tdm_output_remove_commit_handler_internal(private_output, _tdm_layer_cb_output_commit, lm);
-               _tdm_layer_free_buffer(private_layer, lm->committed_buffer);
+               tdm_layer_free_buffer(private_layer, lm->committed_buffer);
                free(lm);
        }
 
@@ -429,7 +428,7 @@ _tdm_layer_free_all_buffers(tdm_private_layer *private_layer)
 
        LIST_FOR_EACH_ENTRY_SAFE(lm, lmm, &clone_list, link) {
                LIST_DEL(&lm->link);
-               _tdm_layer_free_buffer(private_layer, lm->committed_buffer);
+               tdm_layer_free_buffer(private_layer, lm->committed_buffer);
                free(lm);
        }
 
@@ -598,7 +597,7 @@ tdm_layer_committed(tdm_private_layer *private_layer, tdm_private_layer_buffer *
                        TDM_TRACE_ASYNC_END((intptr_t)private_layer, "[LAYER] %d", tbm_bo_export(bo));
                }
 
-               _tdm_layer_free_buffer(private_layer, private_layer->showing_buffer);
+               tdm_layer_free_buffer(private_layer, private_layer->showing_buffer);
        }
 
        private_layer->showing_buffer = *committed_buffer;
@@ -650,7 +649,7 @@ _tdm_layer_got_output_vblank(tdm_private_output *private_output, unsigned int se
                        lm->func(lm->private_layer, sequence, tv_sec, tv_usec, lm->user_data);
                _pthread_mutex_lock(&private_display->lock);
                if (lm->committed_buffer)
-                       _tdm_layer_free_buffer(lm->private_layer, lm->committed_buffer);
+                       tdm_layer_free_buffer(lm->private_layer, lm->committed_buffer);
                free(lm);
        }
 
@@ -704,7 +703,7 @@ wait_failed:
                if (lm->func)
                        lm->func(lm->private_layer, sequence, tv_sec, tv_usec, lm->user_data);
                _pthread_mutex_lock(&private_display->lock);
-               _tdm_layer_free_buffer(lm->private_layer, lm->committed_buffer);
+               tdm_layer_free_buffer(lm->private_layer, lm->committed_buffer);
                free(lm);
        }
 
@@ -876,7 +875,7 @@ tdm_layer_commit_pending_data(tdm_private_layer *private_layer)
 
                if (ret == TDM_ERROR_NONE) {
                        if (private_layer->waiting_buffer)
-                               _tdm_layer_free_buffer(private_layer, private_layer->waiting_buffer);
+                               tdm_layer_free_buffer(private_layer, private_layer->waiting_buffer);
 
                        private_layer->waiting_buffer = layer_buffer;
                        private_layer->waiting_buffer->buffer = tdm_buffer_ref_backend(private_layer->pending_buffer);
@@ -884,7 +883,7 @@ tdm_layer_commit_pending_data(tdm_private_layer *private_layer)
                                TDM_INFO("layer(%p) waiting_buffer(%p)",
                                                 private_layer, private_layer->waiting_buffer->buffer);
                } else
-                       _tdm_layer_free_buffer(private_layer, layer_buffer);
+                       tdm_layer_free_buffer(private_layer, layer_buffer);
        }
 
 done:
@@ -1070,7 +1069,7 @@ tdm_layer_remove_commit_handler_internal(tdm_layer *layer, tdm_layer_commit_hand
                if (lm->func == func && lm->user_data == user_data) {
                        LIST_DEL(&lm->link);
                        tdm_output_remove_commit_handler_internal(private_output, _tdm_layer_cb_output_commit, lm);
-                       _tdm_layer_free_buffer(private_layer, lm->committed_buffer);
+                       tdm_layer_free_buffer(private_layer, lm->committed_buffer);
                        free(lm);
                        break;
                }
@@ -1080,7 +1079,7 @@ tdm_layer_remove_commit_handler_internal(tdm_layer *layer, tdm_layer_commit_hand
                if (lm->func == func && lm->user_data == user_data) {
                        LIST_DEL(&lm->link);
                        tdm_output_remove_commit_handler_internal(private_output, _tdm_layer_cb_output_commit, lm);
-                       _tdm_layer_free_buffer(private_layer, lm->committed_buffer);
+                       tdm_layer_free_buffer(private_layer, lm->committed_buffer);
                        free(lm);
                        break;
                }
@@ -1223,7 +1222,7 @@ tdm_layer_set_buffer_queue(tdm_layer *layer, tbm_surface_queue_h buffer_queue)
        }
 
        if (private_layer->waiting_buffer) {
-               _tdm_layer_free_buffer(private_layer, private_layer->waiting_buffer);
+               tdm_layer_free_buffer(private_layer, private_layer->waiting_buffer);
                private_layer->waiting_buffer = NULL;
 
                if (tdm_debug_module & TDM_DEBUG_BUFFER)
index f208dfe..03dcd45 100644 (file)
@@ -1129,6 +1129,9 @@ tdm_output_commit_internal(tdm_output *output, int sync, tdm_output_commit_handl
                if (!private_layer->waiting_buffer)
                        continue;
 
+               if (private_layer->committed_buffer)
+                       tdm_layer_free_buffer(private_layer, private_layer->committed_buffer);
+
                private_layer->committed_buffer = private_layer->waiting_buffer;
                private_layer->waiting_buffer = NULL;
                if (tdm_debug_module & TDM_DEBUG_BUFFER)
index 4cb34e4..43c639c 100644 (file)
@@ -147,6 +147,8 @@ tdm_error
 tdm_layer_set_buffer_internal(tdm_private_layer *private_layer, tbm_surface_h buffer);
 tdm_error
 tdm_layer_unset_buffer_internal(tdm_private_layer *private_layer);
+void
+tdm_layer_free_buffer(tdm_private_layer *private_layer, tdm_private_layer_buffer *layer_buffer);
 
 tdm_error
 tdm_vblank_init(tdm_display *dpy);