[FFmpeg-devel] [PATCH] ffmpeg: make transcode_init_done atomic.
wm4
nfxjfg at googlemail.com
Fri Mar 31 19:24:32 EEST 2017
On Fri, 31 Mar 2017 11:45:44 -0400
"Ronald S. Bultje" <rsbultje at gmail.com> wrote:
> Should fix tsan warnings in fate-fifo-muxer-h264/wav:
>
> WARNING: ThreadSanitizer: data race (pid=26552)
> Write of size 4 at 0x000001e0d7c0 by main thread:
> #0 transcode_init src/ffmpeg.c:3761 (ffmpeg+0x00000050ca1c)
> [..]
> Previous read of size 4 at 0x000001e0d7c0 by thread T1:
> #0 decode_interrupt_cb src/ffmpeg.c:460 (ffmpeg+0x0000004fde19)
> ---
> ffmpeg.c | 9 +++++----
> 1 file changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/ffmpeg.c b/ffmpeg.c
> index 11faf0d..ea03179 100644
> --- a/ffmpeg.c
> +++ b/ffmpeg.c
> @@ -30,6 +30,7 @@
> #include <stdlib.h>
> #include <errno.h>
> #include <limits.h>
> +#include <stdatomic.h>
> #include <stdint.h>
>
> #if HAVE_IO_H
> @@ -319,7 +320,7 @@ void term_exit(void)
>
> static volatile int received_sigterm = 0;
> static volatile int received_nb_signals = 0;
> -static volatile int transcode_init_done = 0;
> +static atomic_int transcode_init_done = ATOMIC_VAR_INIT(0);
Not needed for static vars (as determine on #ffmpeg-devel).
> static volatile int ffmpeg_exited = 0;
> static int main_return_code = 0;
>
> @@ -457,7 +458,7 @@ static int read_key(void)
>
> static int decode_interrupt_cb(void *ctx)
> {
> - return received_nb_signals > transcode_init_done;
> + return received_nb_signals > atomic_load(&transcode_init_done);
> }
>
> const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
> @@ -612,7 +613,7 @@ static void ffmpeg_cleanup(int ret)
> if (received_sigterm) {
> av_log(NULL, AV_LOG_INFO, "Exiting normally, received signal %d.\n",
> (int) received_sigterm);
> - } else if (ret && transcode_init_done) {
> + } else if (ret && atomic_load(&transcode_init_done)) {
> av_log(NULL, AV_LOG_INFO, "Conversion failed!\n");
> }
> term_exit();
> @@ -3758,7 +3759,7 @@ static int transcode_init(void)
> return ret;
> }
>
> - transcode_init_done = 1;
> + atomic_store(&transcode_init_done, 1);
>
> return 0;
> }
LGTM, I guess.
More information about the ffmpeg-devel
mailing list