diff mbox

[FFmpeg-devel] ffmpeg: make transcode_init_done atomic.

Message ID 1490975144-58932-1-git-send-email-rsbultje@gmail.com
State Accepted
Commit 76d8c77430e9e0110623705bfb54d922cc2ac3ea
Headers show

Commit Message

Ronald S. Bultje March 31, 2017, 3:45 p.m. UTC
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(-)

Comments

wm4 March 31, 2017, 4:24 p.m. UTC | #1
On Fri, 31 Mar 2017 11:45:44 -0400
"Ronald S. Bultje" <rsbultje@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.
diff mbox

Patch

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);
 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;
 }