Re: [FFmpeg-devel] [PATCH] avutil/atomics: replace avpriv atomics with stdatomics
On Sat, Dec 16, 2017 at 12:04 AM, Michael Niedermayer wrote: > On Fri, Dec 15, 2017 at 06:11:34PM +, Josh de Kock wrote: >> On Fri, 15 Dec 2017 18:08:02 + >> Josh de Kock wrote: >> >> > [...] >> >> Attached again with the correct mime... >> >> -- >> Josh de Kock > >> b/libavcodec/error_resilience.c |1 >> b/libavcodec/parser.c |4 - >> b/libavcodec/utils.c| 13 ++-- >> b/libavfilter/avfilter.c|5 + >> b/libavformat/format.c |9 +-- >> b/libavutil/Makefile|6 -- >> b/tests/fate/libavutil.mak |5 - >> libavutil/atomic.c | 109 >> >> libavutil/atomic.h | 79 >> libavutil/atomic_gcc.h | 61 -- >> libavutil/atomic_suncc.h| 54 --- >> libavutil/atomic_win32.h| 54 --- >> libavutil/tests/atomic.c| 38 - >> 13 files changed, 17 insertions(+), 421 deletions(-) >> 6c235f1bdd516f693810c7edaa8eded3e01f1405 >> 0001-avutil-atomics-replace-avpriv-atomics-with-stdatomics.patch >> From 2c4771a24510adfb3f6346c3fbed0554034eab3b Mon Sep 17 00:00:00 2001 >> From: Josh de Kock >> Date: Fri, 15 Dec 2017 09:29:55 -0800 >> Subject: [PATCH] avutil/atomics: replace avpriv atomics with stdatomics > > This fails to build with gcc (Ubuntu 4.8.5-2ubuntu1~14.04.1) 4.8.5 > > make > CC libavfilter/avfilter.o > libavfilter/avfilter.c: In function ‘avfilter_register’: > libavfilter/avfilter.c:603:43: error: expected ‘)’ before ‘_Atomic’ > while(*f || !atomic_compare_exchange_weak((AVFilter* _Atomic*) f, > &filter->next, filter)) >^ > libavfilter/avfilter.c:603:63: warning: initialization from incompatible > pointer type [enabled by default] > while(*f || !atomic_compare_exchange_weak((AVFilter* _Atomic*) f, > &filter->next, filter)) >^ > libavfilter/avfilter.c:603:103: error: expected ‘)’ before ‘_Atomic’ > while(*f || !atomic_compare_exchange_weak((AVFilter* _Atomic*) f, > &filter->next, filter)) > > ^ > libavfilter/avfilter.c:603:178: error: expected ‘)’ before ‘_Atomic’ > while(*f || !atomic_compare_exchange_weak((AVFilter* _Atomic*) f, > &filter->next, filter)) > > > ^ > libavfilter/avfilter.c:603:178: error: incompatible type for argument 1 of > ‘__sync_val_compare_and_swap’ > libavfilter/avfilter.c:603:215: error: invalid operands to binary == (have > ‘AVFilter’ and ‘AVFilter’) > while(*f || !atomic_compare_exchange_weak((AVFilter* _Atomic*) f, > &filter->next, filter)) > > >^ > make: *** [libavfilter/avfilter.o] Error 1 > _Atomic should probably be defined to "volatile" in both the gcc and the msvc fallback. Still not sure the casting is really "safe" though. - Hendrik ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH] avutil/atomics: replace avpriv atomics with stdatomics
On Fri, Dec 15, 2017 at 06:11:34PM +, Josh de Kock wrote: > On Fri, 15 Dec 2017 18:08:02 + > Josh de Kock wrote: > > > [...] > > Attached again with the correct mime... > > -- > Josh de Kock > b/libavcodec/error_resilience.c |1 > b/libavcodec/parser.c |4 - > b/libavcodec/utils.c| 13 ++-- > b/libavfilter/avfilter.c|5 + > b/libavformat/format.c |9 +-- > b/libavutil/Makefile|6 -- > b/tests/fate/libavutil.mak |5 - > libavutil/atomic.c | 109 > > libavutil/atomic.h | 79 > libavutil/atomic_gcc.h | 61 -- > libavutil/atomic_suncc.h| 54 --- > libavutil/atomic_win32.h| 54 --- > libavutil/tests/atomic.c| 38 - > 13 files changed, 17 insertions(+), 421 deletions(-) > 6c235f1bdd516f693810c7edaa8eded3e01f1405 > 0001-avutil-atomics-replace-avpriv-atomics-with-stdatomics.patch > From 2c4771a24510adfb3f6346c3fbed0554034eab3b Mon Sep 17 00:00:00 2001 > From: Josh de Kock > Date: Fri, 15 Dec 2017 09:29:55 -0800 > Subject: [PATCH] avutil/atomics: replace avpriv atomics with stdatomics This fails to build with gcc (Ubuntu 4.8.5-2ubuntu1~14.04.1) 4.8.5 make CC libavfilter/avfilter.o libavfilter/avfilter.c: In function ‘avfilter_register’: libavfilter/avfilter.c:603:43: error: expected ‘)’ before ‘_Atomic’ while(*f || !atomic_compare_exchange_weak((AVFilter* _Atomic*) f, &filter->next, filter)) ^ libavfilter/avfilter.c:603:63: warning: initialization from incompatible pointer type [enabled by default] while(*f || !atomic_compare_exchange_weak((AVFilter* _Atomic*) f, &filter->next, filter)) ^ libavfilter/avfilter.c:603:103: error: expected ‘)’ before ‘_Atomic’ while(*f || !atomic_compare_exchange_weak((AVFilter* _Atomic*) f, &filter->next, filter)) ^ libavfilter/avfilter.c:603:178: error: expected ‘)’ before ‘_Atomic’ while(*f || !atomic_compare_exchange_weak((AVFilter* _Atomic*) f, &filter->next, filter)) ^ libavfilter/avfilter.c:603:178: error: incompatible type for argument 1 of ‘__sync_val_compare_and_swap’ libavfilter/avfilter.c:603:215: error: invalid operands to binary == (have ‘AVFilter’ and ‘AVFilter’) while(*f || !atomic_compare_exchange_weak((AVFilter* _Atomic*) f, &filter->next, filter)) ^ make: *** [libavfilter/avfilter.o] Error 1 [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB I know you won't believe me, but the highest form of Human Excellence is to question oneself and others. -- Socrates signature.asc Description: PGP signature ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH] avutil/atomics: replace avpriv atomics with stdatomics
On Fri, 15 Dec 2017 18:11:34 + Josh de Kock wrote: > On Fri, 15 Dec 2017 18:08:02 + > Josh de Kock wrote: > > > [...] > > Attached again with the correct mime... > This looks like it's break with the win32 stdatomic wrapper for all cas calls. ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH] avutil/atomics: replace avpriv atomics with stdatomics
On Fri, 15 Dec 2017 18:08:02 + Josh de Kock wrote: > [...] Attached again with the correct mime... -- Josh de Kock >From 2c4771a24510adfb3f6346c3fbed0554034eab3b Mon Sep 17 00:00:00 2001 From: Josh de Kock Date: Fri, 15 Dec 2017 09:29:55 -0800 Subject: [PATCH] avutil/atomics: replace avpriv atomics with stdatomics --- libavcodec/error_resilience.c | 1 - libavcodec/parser.c | 4 +- libavcodec/utils.c| 13 +++-- libavfilter/avfilter.c| 5 +- libavformat/format.c | 9 ++-- libavutil/Makefile| 6 --- libavutil/atomic.c| 109 -- libavutil/atomic.h| 79 -- libavutil/atomic_gcc.h| 61 --- libavutil/atomic_suncc.h | 54 - libavutil/atomic_win32.h | 54 - libavutil/tests/atomic.c | 38 --- tests/fate/libavutil.mak | 5 -- 13 files changed, 17 insertions(+), 421 deletions(-) delete mode 100644 libavutil/atomic.c delete mode 100644 libavutil/atomic.h delete mode 100644 libavutil/atomic_gcc.h delete mode 100644 libavutil/atomic_suncc.h delete mode 100644 libavutil/atomic_win32.h delete mode 100644 libavutil/tests/atomic.c diff --git a/libavcodec/error_resilience.c b/libavcodec/error_resilience.c index 8f172be..55f7796 100644 --- a/libavcodec/error_resilience.c +++ b/libavcodec/error_resilience.c @@ -27,7 +27,6 @@ #include -#include "libavutil/atomic.h" #include "libavutil/internal.h" #include "avcodec.h" #include "error_resilience.h" diff --git a/libavcodec/parser.c b/libavcodec/parser.c index 670680e..0866eef 100644 --- a/libavcodec/parser.c +++ b/libavcodec/parser.c @@ -23,9 +23,9 @@ #include #include #include +#include #include "libavutil/avassert.h" -#include "libavutil/atomic.h" #include "libavutil/internal.h" #include "libavutil/mem.h" @@ -46,7 +46,7 @@ void av_register_codec_parser(AVCodecParser *parser) { do { parser->next = av_first_parser; -} while (parser->next != avpriv_atomic_ptr_cas((void * volatile *)&av_first_parser, parser->next, parser)); +} while (!atomic_compare_exchange_weak((AVCodecParser * _Atomic *)&av_first_parser, &parser->next, parser)); } AVCodecParserContext *av_parser_init(int codec_id) diff --git a/libavcodec/utils.c b/libavcodec/utils.c index 873f39f..ad3d79e 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -25,8 +25,9 @@ * utils. */ +#include + #include "config.h" -#include "libavutil/atomic.h" #include "libavutil/attributes.h" #include "libavutil/avassert.h" #include "libavutil/avstring.h" @@ -70,7 +71,8 @@ const char av_codec_ffversion[] = "FFmpeg version " FFMPEG_VERSION; #if HAVE_PTHREADS || HAVE_W32THREADS || HAVE_OS2THREADS static int default_lockmgr_cb(void **arg, enum AVLockOp op) { -void * volatile * mutex = arg; +void * _Atomic * mutex = (void * _Atomic *)arg; +void *null_mutex = NULL; int err; switch (op) { @@ -85,7 +87,7 @@ static int default_lockmgr_cb(void **arg, enum AVLockOp op) av_free(tmp); return AVERROR(err); } -if (avpriv_atomic_ptr_cas(mutex, NULL, tmp)) { +if (!atomic_compare_exchange_weak(mutex, &null_mutex, tmp)) { pthread_mutex_destroy(tmp); av_free(tmp); } @@ -104,7 +106,7 @@ static int default_lockmgr_cb(void **arg, enum AVLockOp op) if (*mutex) pthread_mutex_destroy(*mutex); av_free(*mutex); -avpriv_atomic_ptr_cas(mutex, *mutex, NULL); +atomic_compare_exchange_weak(mutex, mutex, NULL); return 0; } return 1; @@ -185,8 +187,9 @@ av_cold void avcodec_register(AVCodec *codec) p = last_avcodec; codec->next = NULL; -while(*p || avpriv_atomic_ptr_cas((void * volatile *)p, NULL, codec)) +while(*p || !atomic_compare_exchange_weak((AVCodec *_Atomic *)p, &codec->next, codec)) p = &(*p)->next; + last_avcodec = &codec->next; if (codec->init_static_data) diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c index b98b32b..c0dc054 100644 --- a/libavfilter/avfilter.c +++ b/libavfilter/avfilter.c @@ -19,7 +19,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "libavutil/atomic.h" +#include + #include "libavutil/avassert.h" #include "libavutil/avstring.h" #include "libavutil/buffer.h" @@ -599,7 +600,7 @@ int avfilter_register(AVFilter *filter) filter->next = NULL; -while(*f || avpriv_atomic_ptr_cas((void * volatile *)f, NULL, filter)) +while(*f || !atomic_compare_exchange_weak((AVFilter* _Atomic*) f, &filter->next, filter)) f = &(*f)->next; last_filter = &filter->next; diff --git a/libavformat/format.c b/libavformat/format.c index 38ca2a3..9acfecd 100644 --- a/libavformat/format.c
[FFmpeg-devel] [PATCH] avutil/atomics: replace avpriv atomics with stdatomics
Hi, Sorry for sending this patch as an attachment, struggling to get email working properly on new setup. This patch replaces the current avpriv atomics with stdatomics. It passes fate on the latest macOS and the lastest LTS Ubuntu Linux. I haven't tested it on Windows as I don't know too much about development on the platform, but I've been told that _Atomic may not be available on it. -- Josh de Kock 0001-avutil-atomics-replace-avpriv-atomics-with-stdatomics.patch Description: plain/text ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel