vlc | branch: master | KO Myung-Hun <kom...@gmail.com> | Thu May 10 21:41:46 2018 +0900| [94756f160c776300c9f72290dbf5864fad9021d4] | committer: Thomas Guillem
os2: implement vlc_once() Signed-off-by: Thomas Guillem <tho...@gllm.fr> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=94756f160c776300c9f72290dbf5864fad9021d4 --- include/vlc_threads.h | 6 ++++++ src/os2/thread.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/include/vlc_threads.h b/include/vlc_threads.h index 508ddbc001..b0891ac88c 100644 --- a/include/vlc_threads.h +++ b/include/vlc_threads.h @@ -125,6 +125,12 @@ typedef struct #define VLC_STATIC_COND { NULLHANDLE, 0, NULLHANDLE, 0 } #define LIBVLC_NEED_SEMAPHORE #define LIBVLC_NEED_RWLOCK +typedef struct +{ + unsigned done; + vlc_mutex_t mutex; +} vlc_once_t; +#define VLC_STATIC_ONCE { 0, VLC_STATIC_MUTEX } typedef struct vlc_threadvar *vlc_threadvar_t; typedef struct vlc_timer *vlc_timer_t; diff --git a/src/os2/thread.c b/src/os2/thread.c index 42dba0aa10..e4afb5bbe2 100644 --- a/src/os2/thread.c +++ b/src/os2/thread.c @@ -429,6 +429,34 @@ int vlc_cond_timedwait_daytime (vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex, return vlc_cond_wait_common (p_condvar, p_mutex, ulTimeout); } +void vlc_once(vlc_once_t *once, void (*cb)(void)) +{ + unsigned done; + + /* load once->done */ + __atomic_xchg( &done, once->done ); + + /* not initialized ? */ + if( done == 0 ) + { + vlc_mutex_lock( &once->mutex ); + + /* load once->done */ + __atomic_xchg( &done, once->done ); + + /* still not initialized ? */ + if( done == 0 ) + { + cb(); + + /* set once->done to 1 */ + __atomic_xchg( &once->done, 1 ); + } + + vlc_mutex_unlock( &once->mutex ); + } +} + /*** Thread-specific variables (TLS) ***/ struct vlc_threadvar { _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits