vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Fri Nov 9 00:36:33 2012 +0200| [a5e3a954b54587db0a7b47320f94ed7284122763] | committer: Rémi Denis-Courmont
vout: use atomic variables for stats instead of spin lock > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=a5e3a954b54587db0a7b47320f94ed7284122763 --- src/video_output/statistic.h | 40 +++++++++++++++++++++------------------ src/video_output/video_output.c | 4 ++-- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/video_output/statistic.h b/src/video_output/statistic.h index e17386e..083b0d7 100644 --- a/src/video_output/statistic.h +++ b/src/video_output/statistic.h @@ -22,39 +22,43 @@ *****************************************************************************/ #ifndef LIBVLC_VOUT_STATISTIC_H -#define LIBVLC_VOUT_STATISTIC_H +# define LIBVLC_VOUT_STATISTIC_H +# include <vlc_atomic.h> +/* NOTE: Both statistics are atomic on their own, so one might be older than + * the other one. Currently, only one of them is updated at a time, so this + * is a non-issue. */ typedef struct { - vlc_spinlock_t spin; - - int displayed; - int lost; + atomic_uint displayed; + atomic_uint lost; } vout_statistic_t; static inline void vout_statistic_Init(vout_statistic_t *stat) { - vlc_spin_init(&stat->spin); + atomic_init(&stat->displayed, 0); + atomic_init(&stat->lost, 0); } + static inline void vout_statistic_Clean(vout_statistic_t *stat) { - vlc_spin_destroy(&stat->spin); + (void) stat; } + static inline void vout_statistic_GetReset(vout_statistic_t *stat, int *displayed, int *lost) { - vlc_spin_lock(&stat->spin); - *displayed = stat->displayed; - *lost = stat->lost; + *displayed = atomic_exchange(&stat->displayed, 0); + *lost = atomic_exchange(&stat->lost, 0); +} - stat->displayed = 0; - stat->lost = 0; - vlc_spin_unlock(&stat->spin); +static inline void vout_statistic_AddDisplayed(vout_statistic_t *stat, + int displayed) +{ + atomic_fetch_add(&stat->displayed, displayed); } -static inline void vout_statistic_Update(vout_statistic_t *stat, int displayed, int lost) + +static inline void vout_statistic_AddLost(vout_statistic_t *stat, int lost) { - vlc_spin_lock(&stat->spin); - stat->displayed += displayed; - stat->lost += lost; - vlc_spin_unlock(&stat->spin); + atomic_fetch_add(&stat->lost, lost); } #endif diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c index 0a68cc8..b83d040 100644 --- a/src/video_output/video_output.c +++ b/src/video_output/video_output.c @@ -862,7 +862,7 @@ static int ThreadDisplayPreparePicture(vout_thread_t *vout, bool reuse, bool is_ vlc_mutex_unlock(&vout->p->filter.lock); - vout_statistic_Update(&vout->p->statistic, 0, lost_count); + vout_statistic_AddLost(&vout->p->statistic, lost_count); if (!picture) return VLC_EGENERIC; @@ -1056,7 +1056,7 @@ static int ThreadDisplayRenderPicture(vout_thread_t *vout, bool is_forced) subpic); sys->display.filtered = NULL; - vout_statistic_Update(&vout->p->statistic, 1, 0); + vout_statistic_AddDisplayed(&vout->p->statistic, 1); return VLC_SUCCESS; } _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
