[FFmpeg-devel] [PATCH 0/7] convert most of the remaining files to stdatomic
James Almer
jamrial at gmail.com
Thu Mar 23 16:57:53 EET 2017
On 3/23/2017 3:08 AM, wm4 wrote:
> On Thu, 23 Mar 2017 00:28:15 -0300
> James Almer <jamrial at gmail.com> wrote:
>
>> From 3bf230d5f611ae5d1511e4629f742fc96b379b7f Mon Sep 17 00:00:00 2001
>> From: James Almer <jamrial at gmail.com>
>> Date: Wed, 22 Mar 2017 23:43:54 -0300
>> Subject: [PATCH] avformat/format: convert to stdatomic
>>
>> ---
>> libavformat/format.c | 9 ++++++---
>> 1 file changed, 6 insertions(+), 3 deletions(-)
>>
>> diff --git a/libavformat/format.c b/libavformat/format.c
>> index 38ca2a3465..781f341936 100644
>> --- a/libavformat/format.c
>> +++ b/libavformat/format.c
>> @@ -19,7 +19,8 @@
>> * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
>> */
>>
>> -#include "libavutil/atomic.h"
>> +#include <stdatomic.h>
>> +
>> #include "libavutil/avstring.h"
>> #include "libavutil/bprint.h"
>> #include "libavutil/opt.h"
>> @@ -61,9 +62,10 @@ AVOutputFormat *av_oformat_next(const AVOutputFormat *f)
>> void av_register_input_format(AVInputFormat *format)
>> {
>> AVInputFormat **p = last_iformat;
>> + const AVInputFormat *cmp = NULL;
>>
>> // Note, format could be added after the first 2 checks but that implies that *p is no longer NULL
>> - while(p != &format->next && !format->next && avpriv_atomic_ptr_cas((void * volatile *)p, NULL, format))
>> + while(p != &format->next && !format->next && !atomic_compare_exchange_strong((atomic_intptr_t *)p, (intptr_t *)&cmp, (intptr_t)format))
>> p = &(*p)->next;
>>
>> if (!format->next)
>> @@ -73,9 +75,10 @@ void av_register_input_format(AVInputFormat *format)
>> void av_register_output_format(AVOutputFormat *format)
>> {
>> AVOutputFormat **p = last_oformat;
>> + const AVOutputFormat *cmp = NULL;
>>
>> // Note, format could be added after the first 2 checks but that implies that *p is no longer NULL
>> - while(p != &format->next && !format->next && avpriv_atomic_ptr_cas((void * volatile *)p, NULL, format))
>> + while(p != &format->next && !format->next && !atomic_compare_exchange_strong((atomic_intptr_t *)p, (intptr_t *)&cmp, (intptr_t)format))
>> p = &(*p)->next;
>>
>> if (!format->next)
>
> Looks like undefined behavior. Atomic variables must be, well, atomic.
> You can't just cast them. Declare them as atomic in the first place.
GCC seems lax and accepts non atomic variables as first argument, but
Clang evidently doesn't.
>
> For some silly reason, we don't have pointer atomics, only
> atomic_intptr_t. So it'll be a bit of a pain.
I already dealt with the different kind of return value for
atomic_compare_exchange_strong vs the one from avpriv_atomic_ptr_cas
and adapted the add_and_fetch calls to work with fetch_add/sub, so
I'll leave solving this to someone else.
It's getting really annoying and i can only test with one compiler
that doesn't even warn me if i do things wrong.
More information about the ffmpeg-devel
mailing list