vlc | branch: master | Rémi Denis-Courmont <r...@remlab.net> | Mon Feb 24 21:50:12 2020 +0200| [d76fb9cf3980e305c06777dbbdbbdc11b54d84a5] | committer: Rémi Denis-Courmont
thread: optimize the one-time initializer > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=d76fb9cf3980e305c06777dbbdbbdc11b54d84a5 --- include/vlc_threads.h | 8 ++++++++ src/misc/threads.c | 4 +++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/include/vlc_threads.h b/include/vlc_threads.h index 87d0691402..657d53ab4e 100644 --- a/include/vlc_threads.h +++ b/include/vlc_threads.h @@ -642,6 +642,14 @@ typedef struct * \param cb callback to execute (the first time) */ VLC_API void vlc_once(vlc_once_t *restrict once, void (*cb)(void)); + +static inline void vlc_once_inline(vlc_once_t *restrict once, void (*cb)(void)) +{ + /* Fast path: check if already initialized */ + if (unlikely(atomic_load_explicit(&once->value, memory_order_acquire) < 3)) + vlc_once(once, cb); +} +#define vlc_once(once, cb) vlc_once_inline(once, cb) #endif /** diff --git a/src/misc/threads.c b/src/misc/threads.c index 945b9568f6..e26a98f7cd 100644 --- a/src/misc/threads.c +++ b/src/misc/threads.c @@ -536,7 +536,9 @@ int vlc_sem_timedwait(vlc_sem_t *sem, vlc_tick_t deadline) enum { VLC_ONCE_UNDONE, VLC_ONCE_DOING, VLC_ONCE_CONTEND, VLC_ONCE_DONE }; -void vlc_once(vlc_once_t *restrict once, void (*cb)(void)) +static_assert (VLC_ONCE_DONE == 3, "Check vlc_once in header file"); + +void (vlc_once)(vlc_once_t *restrict once, void (*cb)(void)) { unsigned int value = VLC_ONCE_UNDONE; _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits