Message ID | f5f77ac3-f18c-df2a-de55-a45cbcc87334@gmail.com |
---|---|
State | New |
Headers | show |
On Thu, 23 Mar 2017 00:28:15 -0300 James Almer <jamrial@gmail.com> wrote: > From 3bf230d5f611ae5d1511e4629f742fc96b379b7f Mon Sep 17 00:00:00 2001 > From: James Almer <jamrial@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. For some silly reason, we don't have pointer atomics, only atomic_intptr_t. So it'll be a bit of a pain.
On 3/23/2017 3:08 AM, wm4 wrote: > On Thu, 23 Mar 2017 00:28:15 -0300 > James Almer <jamrial@gmail.com> wrote: > >> From 3bf230d5f611ae5d1511e4629f742fc96b379b7f Mon Sep 17 00:00:00 2001 >> From: James Almer <jamrial@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.
From 3bf230d5f611ae5d1511e4629f742fc96b379b7f Mon Sep 17 00:00:00 2001 From: James Almer <jamrial@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) -- 2.12.0