[vlc-commits] picture_pool: make the reference count atomic

Rémi Denis-Courmont git at videolan.org
Sun Jun 28 14:26:14 CEST 2015


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Jun 28 13:30:22 2015 +0300| [a1adede15fd20411407dbe446730ab9aefeb75bc] | committer: Rémi Denis-Courmont

picture_pool: make the reference count atomic

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=a1adede15fd20411407dbe446730ab9aefeb75bc
---

 src/misc/picture_pool.c |   23 +++++++++--------------
 1 file changed, 9 insertions(+), 14 deletions(-)

diff --git a/src/misc/picture_pool.c b/src/misc/picture_pool.c
index 54289be..c34f918 100644
--- a/src/misc/picture_pool.c
+++ b/src/misc/picture_pool.c
@@ -31,6 +31,7 @@
 
 #include <vlc_common.h>
 #include <vlc_picture_pool.h>
+#include <vlc_atomic.h>
 #include "picture.h"
 
 static const uintptr_t pool_max = CHAR_BIT * sizeof (unsigned long long);
@@ -41,21 +42,14 @@ struct picture_pool_t {
     vlc_mutex_t lock;
 
     unsigned long long available;
-    unsigned    refs;
-    unsigned    picture_count;
+    atomic_ushort      refs;
+    unsigned short     picture_count;
     picture_t  *picture[];
 };
 
 static void picture_pool_Destroy(picture_pool_t *pool)
 {
-    bool destroy;
-
-    vlc_mutex_lock(&pool->lock);
-    assert(pool->refs > 0);
-    destroy = --pool->refs == 0;
-    vlc_mutex_unlock(&pool->lock);
-
-    if (likely(!destroy))
+    if (atomic_fetch_sub(&pool->refs, 1) != 1)
         return;
 
     vlc_mutex_destroy(&pool->lock);
@@ -129,7 +123,7 @@ picture_pool_t *picture_pool_NewExtended(const picture_pool_configuration_t *cfg
     pool->pic_unlock = cfg->unlock;
     vlc_mutex_init(&pool->lock);
     pool->available = (1ULL << cfg->picture_count) - 1;
-    pool->refs = 1;
+    atomic_init(&pool->refs,  1);
     pool->picture_count = cfg->picture_count;
     memcpy(pool->picture, cfg->picture,
            cfg->picture_count * sizeof (picture_t *));
@@ -203,7 +197,6 @@ picture_t *picture_pool_Get(picture_pool_t *pool)
             continue;
 
         pool->available &= ~(1ULL << i);
-        pool->refs++;
         vlc_mutex_unlock(&pool->lock);
 
         picture_t *picture = pool->picture[i];
@@ -211,12 +204,14 @@ picture_t *picture_pool_Get(picture_pool_t *pool)
         if (pool->pic_lock != NULL && pool->pic_lock(picture) != 0) {
             vlc_mutex_lock(&pool->lock);
             pool->available |= 1ULL << i;
-            pool->refs--;
             continue;
         }
 
         picture_t *clone = picture_pool_ClonePicture(pool, i);
-        assert(unlikely(clone == NULL) || clone->p_next == NULL);
+        if (clone != NULL) {
+            assert(clone->p_next == NULL);
+            atomic_fetch_add(&pool->refs, 1);
+        }
         return clone;
     }
 



More information about the vlc-commits mailing list