vlc | branch: master | Rémi Denis-Courmont <[email protected]> | 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); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
