[FFmpeg-devel] [PATCH 1/4] avcodec/allcodecs: make avcodec_register_all thread safe

Muhammad Faiz mfcc64 at gmail.com
Tue Mar 7 10:16:38 EET 2017


On Tue, Mar 7, 2017 at 1:44 PM, wm4 <nfxjfg at googlemail.com> wrote:
> On Tue,  7 Mar 2017 02:47:36 +0700
> Muhammad Faiz <mfcc64 at gmail.com> wrote:
>
>> Signed-off-by: Muhammad Faiz <mfcc64 at 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.

I don't know about these.

>
> 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.

Ok, thank's for the suggestion


More information about the ffmpeg-devel mailing list