On Tue, 7 Mar 2017 02:47:36 +0700 Muhammad Faiz <mfc...@gmail.com> wrote:
> Signed-off-by: Muhammad Faiz <mfc...@gmail.com> > --- > libavcodec/allcodecs.c | 13 ++++++++++--- > 1 file changed, 10 insertions(+), 3 deletions(-) > > diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c > index eee322b..1d05fc1 100644 > --- a/libavcodec/allcodecs.c > +++ b/libavcodec/allcodecs.c > @@ -24,6 +24,8 @@ > * Provide registration of all codecs, parsers and bitstream filters for > libavcodec. > */ > > +#include <stdatomic.h> > + > #include "config.h" > #include "avcodec.h" > #include "version.h" > @@ -60,11 +62,14 @@ > > void avcodec_register_all(void) > { > - static int initialized; > + static atomic_int initialized; > + static atomic_int ready; > > - if (initialized) > + if (atomic_exchange_explicit(&initialized, 1, memory_order_relaxed)) { > + while (!atomic_load_explicit(&ready, memory_order_relaxed)) > + ; > return; > - initialized = 1; > + } > > /* hardware accelerators */ > REGISTER_HWACCEL(H263_VAAPI, h263_vaapi); > @@ -716,4 +721,6 @@ void avcodec_register_all(void) > REGISTER_PARSER(VP8, vp8); > REGISTER_PARSER(VP9, vp9); > REGISTER_PARSER(XMA, xma); > + > + atomic_store_explicit(&ready, 1, memory_order_relaxed); > } avcodec_register() is already "safe" by attempting to do lock-free and wait-free list insertion (not very convincing IMHO, but it's there). Should that code be removed? Does anyone know why avcodec_register() is even still public API? The same affects some other things. Also, if you want to do it right, please use ff_thread_once() to do it without busy waiting. It works like pthread_once(), which was invented to avoid such constructions. _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel