[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