[vlc-commits] picture_pool: simplify using ctz()

Rémi Denis-Courmont git at videolan.org
Sun Feb 25 20:09:50 CET 2018


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Feb 25 21:05:19 2018 +0200| [09fa628168421b5d8881b72ced9390d84dd58123] | committer: Rémi Denis-Courmont

picture_pool: simplify using ctz()

Zero-based value is easier than one-based in this context.

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

 src/misc/picture_pool.c | 24 +++++++++++-------------
 1 file changed, 11 insertions(+), 13 deletions(-)

diff --git a/src/misc/picture_pool.c b/src/misc/picture_pool.c
index 94b54c1c10..e8184e51d9 100644
--- a/src/misc/picture_pool.c
+++ b/src/misc/picture_pool.c
@@ -201,18 +201,13 @@ error:
     return NULL;
 }
 
-/** Find next (bit) set */
-static int fnsll(unsigned long long x, unsigned i)
-{
-    if (i >= CHAR_BIT * sizeof (x))
-        return 0;
-    return ffsll(x & ~((1ULL << i) - 1));
-}
-
 picture_t *picture_pool_Get(picture_pool_t *pool)
 {
+    unsigned long long available;
+
     vlc_mutex_lock(&pool->lock);
     assert(pool->refs > 0);
+    available = pool->available;
 
     if (pool->canceled)
     {
@@ -220,20 +215,23 @@ picture_t *picture_pool_Get(picture_pool_t *pool)
         return NULL;
     }
 
-    for (unsigned i = ffsll(pool->available); i; i = fnsll(pool->available, i))
+    while (available != 0)
     {
-        pool->available &= ~(1ULL << (i - 1));
+        int i = ctz(available);
+
+        pool->available &= ~(1ULL << i);
         vlc_mutex_unlock(&pool->lock);
+        available &= ~(1ULL << i);
 
-        picture_t *picture = pool->picture[i - 1];
+        picture_t *picture = pool->picture[i];
 
         if (pool->pic_lock != NULL && pool->pic_lock(picture) != VLC_SUCCESS) {
             vlc_mutex_lock(&pool->lock);
-            pool->available |= 1ULL << (i - 1);
+            pool->available |= 1ULL << i;
             continue;
         }
 
-        picture_t *clone = picture_pool_ClonePicture(pool, i - 1);
+        picture_t *clone = picture_pool_ClonePicture(pool, i);
         if (clone != NULL) {
             assert(clone->p_next == NULL);
             atomic_fetch_add(&pool->refs, 1);



More information about the vlc-commits mailing list