[vlc-commits] picture_pool: use ffsll() as appropriate

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 15:09:23 2015 +0300| [01bed0111a7997ce2f2352b00f60848e7ecef4c1] | committer: Rémi Denis-Courmont

picture_pool: use ffsll() as appropriate

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

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

diff --git a/src/misc/picture_pool.c b/src/misc/picture_pool.c
index c34f918..bb9c103 100644
--- a/src/misc/picture_pool.c
+++ b/src/misc/picture_pool.c
@@ -187,27 +187,33 @@ 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)
 {
     vlc_mutex_lock(&pool->lock);
     assert(pool->refs > 0);
 
-    for (unsigned i = 0; i < pool->picture_count; i++) {
-        if (!(pool->available & (1ULL << i)))
-            continue;
-
-        pool->available &= ~(1ULL << i);
+    for (unsigned i = ffsll(pool->available); i; i = fnsll(pool->available, i))
+    {
+        pool->available &= ~(1ULL << (i - 1));
         vlc_mutex_unlock(&pool->lock);
 
-        picture_t *picture = pool->picture[i];
+        picture_t *picture = pool->picture[i - 1];
 
         if (pool->pic_lock != NULL && pool->pic_lock(picture) != 0) {
             vlc_mutex_lock(&pool->lock);
-            pool->available |= 1ULL << i;
+            pool->available |= 1ULL << (i - 1);
             continue;
         }
 
-        picture_t *clone = picture_pool_ClonePicture(pool, i);
+        picture_t *clone = picture_pool_ClonePicture(pool, i - 1);
         if (clone != NULL) {
             assert(clone->p_next == NULL);
             atomic_fetch_add(&pool->refs, 1);



More information about the vlc-commits mailing list