From 01bed0111a7997ce2f2352b00f60848e7ecef4c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sun, 28 Jun 2015 15:09:23 +0300 Subject: [PATCH] picture_pool: use ffsll() as appropriate --- 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 c34f918c92..bb9c103e13 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); -- GitLab