vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Sun Jun 28 13:30:22 2015 +0300| [a1adede15fd20411407dbe446730ab9aefeb75bc] | committer: Rémi Denis-Courmont
picture_pool: make the reference count atomic > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=a1adede15fd20411407dbe446730ab9aefeb75bc --- src/misc/picture_pool.c | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/src/misc/picture_pool.c b/src/misc/picture_pool.c index 54289be..c34f918 100644 --- a/src/misc/picture_pool.c +++ b/src/misc/picture_pool.c @@ -31,6 +31,7 @@ #include <vlc_common.h> #include <vlc_picture_pool.h> +#include <vlc_atomic.h> #include "picture.h" static const uintptr_t pool_max = CHAR_BIT * sizeof (unsigned long long); @@ -41,21 +42,14 @@ struct picture_pool_t { vlc_mutex_t lock; unsigned long long available; - unsigned refs; - unsigned picture_count; + atomic_ushort refs; + unsigned short picture_count; picture_t *picture[]; }; static void picture_pool_Destroy(picture_pool_t *pool) { - bool destroy; - - vlc_mutex_lock(&pool->lock); - assert(pool->refs > 0); - destroy = --pool->refs == 0; - vlc_mutex_unlock(&pool->lock); - - if (likely(!destroy)) + if (atomic_fetch_sub(&pool->refs, 1) != 1) return; vlc_mutex_destroy(&pool->lock); @@ -129,7 +123,7 @@ picture_pool_t *picture_pool_NewExtended(const picture_pool_configuration_t *cfg pool->pic_unlock = cfg->unlock; vlc_mutex_init(&pool->lock); pool->available = (1ULL << cfg->picture_count) - 1; - pool->refs = 1; + atomic_init(&pool->refs, 1); pool->picture_count = cfg->picture_count; memcpy(pool->picture, cfg->picture, cfg->picture_count * sizeof (picture_t *)); @@ -203,7 +197,6 @@ picture_t *picture_pool_Get(picture_pool_t *pool) continue; pool->available &= ~(1ULL << i); - pool->refs++; vlc_mutex_unlock(&pool->lock); picture_t *picture = pool->picture[i]; @@ -211,12 +204,14 @@ picture_t *picture_pool_Get(picture_pool_t *pool) if (pool->pic_lock != NULL && pool->pic_lock(picture) != 0) { vlc_mutex_lock(&pool->lock); pool->available |= 1ULL << i; - pool->refs--; continue; } picture_t *clone = picture_pool_ClonePicture(pool, i); - assert(unlikely(clone == NULL) || clone->p_next == NULL); + if (clone != NULL) { + assert(clone->p_next == NULL); + atomic_fetch_add(&pool->refs, 1); + } return clone; } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
