[vlc-commits] [Git][videolan/vlc][master] 2 commits: picture_pool: add missing picture_Release()

Steve Lhomme (@robUx4) gitlab at videolan.org
Sat Dec 14 14:05:08 UTC 2024



Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
a1cf255d by Thomas Guillem at 2024-12-14T13:51:36+00:00
picture_pool: add missing picture_Release()

The destroy callback from picture_InternalClone() must release the
original picture.

Regression from 922c5f0392eed3324efdfdbf93d61b3c34e1db6f

- - - - -
c94ab5e3 by Thomas Guillem at 2024-12-14T13:51:36+00:00
picture_pool: fix leak of in-use pictures

Release pictures from both available and in-use lists from
picture_pool_Release().

It's best to release these pictures the earliest possible, and not wait
for the last cloned picture to be released to avoid high memory usage
when changing pools.

- - - - -


1 changed file:

- src/misc/picture_pool.c


Changes:

=====================================
src/misc/picture_pool.c
=====================================
@@ -45,6 +45,7 @@ struct picture_pool_t {
     vlc_cond_t  wait;
 
     vlc_atomic_rc_t    refs;
+    bool released;
     struct vlc_list inuse_list;
     struct vlc_list available_list;
 };
@@ -55,19 +56,31 @@ static void picture_pool_Destroy(picture_pool_t *pool)
         return;
 
     assert(vlc_list_is_empty(&pool->inuse_list));
+    assert(vlc_list_is_empty(&pool->available_list));
 
     free(pool);
 }
 
 void picture_pool_Release(picture_pool_t *pool)
 {
-    picture_priv_t *priv;
-    vlc_list_foreach(priv, &pool->available_list, pool_node)
+    vlc_mutex_lock(&pool->lock);
+
+    /* Release pictures from both available and in-use lists */
+    for (size_t i = 0; i < 2; ++i)
     {
-        assert(priv->pool == pool);
-        priv->pool = NULL;
-        picture_Release(&priv->picture);
+        struct vlc_list *list = i == 0 ? &pool->available_list : &pool->inuse_list;
+
+        picture_priv_t *priv;
+        vlc_list_foreach(priv, list, pool_node)
+        {
+            assert(priv->pool == pool);
+            vlc_list_remove(&priv->pool_node);
+            picture_Release(&priv->picture);
+        }
     }
+    /* Prevent in-use cloned pictures to be added back to lists */
+    pool->released = true;
+    vlc_mutex_unlock(&pool->lock);
     picture_pool_Destroy(pool);
 }
 
@@ -84,12 +97,17 @@ static void picture_pool_ReleaseClone(picture_t *clone)
 
     vlc_mutex_lock(&pool->lock);
 
-    vlc_list_remove(&original_priv->pool_node);
-    vlc_list_append(&original_priv->pool_node, &pool->available_list);
+    if (!pool->released)
+    {
+        vlc_list_remove(&original_priv->pool_node);
+        vlc_list_append(&original_priv->pool_node, &pool->available_list);
+        vlc_cond_signal(&pool->wait);
+    }
 
-    vlc_cond_signal(&pool->wait);
     vlc_mutex_unlock(&pool->lock);
 
+    picture_Release(original);
+
     picture_pool_Destroy(pool);
 }
 
@@ -127,6 +145,7 @@ picture_pool_NewCommon(void)
     vlc_mutex_init(&pool->lock);
     vlc_cond_init(&pool->wait);
     vlc_atomic_rc_init(&pool->refs);
+    pool->released = false;
 
     return pool;
 }



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/4f760827ccb6163de61adc927501fe398a62534f...c94ab5e31b0a75ef853db40b6644a6115ad63692

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/4f760827ccb6163de61adc927501fe398a62534f...c94ab5e31b0a75ef853db40b6644a6115ad63692
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance


More information about the vlc-commits mailing list