Commit 9ed4ebc5 authored by James Almer's avatar James Almer

avcodec/util: use a mutex instead of atomics in avcodec_register()

Reviewed-by: 's avatarwm4 <nfxjfg@googlemail.com>
Signed-off-by: 's avatarJames Almer <jamrial@gmail.com>
parent 7bb1be9a
...@@ -26,7 +26,6 @@ ...@@ -26,7 +26,6 @@
*/ */
#include "config.h" #include "config.h"
#include "libavutil/atomic.h"
#include "libavutil/attributes.h" #include "libavutil/attributes.h"
#include "libavutil/avassert.h" #include "libavutil/avassert.h"
#include "libavutil/avstring.h" #include "libavutil/avstring.h"
...@@ -127,17 +126,24 @@ int av_codec_is_decoder(const AVCodec *codec) ...@@ -127,17 +126,24 @@ int av_codec_is_decoder(const AVCodec *codec)
return codec && (codec->decode || codec->receive_frame); return codec && (codec->decode || codec->receive_frame);
} }
static AVMutex codec_register_mutex = AV_MUTEX_INITIALIZER;
av_cold void avcodec_register(AVCodec *codec) av_cold void avcodec_register(AVCodec *codec)
{ {
AVCodec **p; AVCodec **p;
avcodec_init(); avcodec_init();
ff_mutex_lock(&codec_register_mutex);
p = last_avcodec; p = last_avcodec;
codec->next = NULL;
while(*p || avpriv_atomic_ptr_cas((void * volatile *)p, NULL, codec)) while (*p)
p = &(*p)->next; p = &(*p)->next;
*p = codec;
codec->next = NULL;
last_avcodec = &codec->next; last_avcodec = &codec->next;
ff_mutex_unlock(&codec_register_mutex);
if (codec->init_static_data) if (codec->init_static_data)
codec->init_static_data(codec); codec->init_static_data(codec);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment