[FFmpeg-devel] [PATCH 1/3 v2] avcodec/util: use a mutex instead of atomics in avcodec_register()
James Almer
jamrial at gmail.com
Fri Jan 5 18:18:17 EET 2018
On 1/5/2018 1:02 PM, wm4 wrote:
> On Thu, 4 Jan 2018 22:40:44 -0300
> James Almer <jamrial at gmail.com> wrote:
>
>> Signed-off-by: James Almer <jamrial at gmail.com>
>> ---
>> libavcodec/utils.c | 12 +++++++++---
>> 1 file changed, 9 insertions(+), 3 deletions(-)
>>
>> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
>> index dfbfe98d63..4d736d2e7d 100644
>> --- a/libavcodec/utils.c
>> +++ b/libavcodec/utils.c
>> @@ -26,7 +26,6 @@
>> */
>>
>> #include "config.h"
>> -#include "libavutil/atomic.h"
>> #include "libavutil/attributes.h"
>> #include "libavutil/avassert.h"
>> #include "libavutil/avstring.h"
>> @@ -127,17 +126,24 @@ int av_codec_is_decoder(const AVCodec *codec)
>> return codec && (codec->decode || codec->receive_frame);
>> }
>>
>> +static AVMutex codec_register_mutex = AV_MUTEX_INITIALIZER;
>> +
>> av_cold void avcodec_register(AVCodec *codec)
>> {
>> AVCodec **p;
>> avcodec_init();
>> +
>> + ff_mutex_lock(&codec_register_mutex);
>> p = last_avcodec;
>> - codec->next = NULL;
>>
>> - while(*p || avpriv_atomic_ptr_cas((void * volatile *)p, NULL, codec))
>> + while (*p)
>> p = &(*p)->next;
>> + *p = codec;
>> + codec->next = NULL;
>> last_avcodec = &codec->next;
>>
>> + ff_mutex_unlock(&codec_register_mutex);
>> +
>> if (codec->init_static_data)
>> codec->init_static_data(codec);
>> }
>
> Seems good, but should init_static_data really be outside of the lock?
> (Sure, it wasn't under a look before either, but still.)
I don't think calling avcodec_register() twice with the same AVCodec is
defined or supported at all, so outside of creating the linked list i
don't see any other potential race here. But i may be wrong.
In any case, that's something for a separate patch as it's a change in
behavior (and may make things slower), so pushed as is.
More information about the ffmpeg-devel
mailing list