Browse code

avdevice/alldevices: make avdevice_register_all thread safe

use ff_thread_once

Suggested-by: wm4 <nfxjfg@googlemail.com>
Signed-off-by: Muhammad Faiz <mfcc64@gmail.com>

Muhammad Faiz authored on 2017/03/07 17:55:38
Showing 2 changed files
... ...
@@ -19,6 +19,7 @@
19 19
  */
20 20
 
21 21
 #include "config.h"
22
+#include "libavutil/thread.h"
22 23
 #include "avdevice.h"
23 24
 
24 25
 #define REGISTER_OUTDEV(X, x)                                           \
... ...
@@ -37,14 +38,8 @@
37 37
 
38 38
 #define REGISTER_INOUTDEV(X, x) REGISTER_OUTDEV(X, x); REGISTER_INDEV(X, x)
39 39
 
40
-void avdevice_register_all(void)
40
+static void register_all(void)
41 41
 {
42
-    static int initialized;
43
-
44
-    if (initialized)
45
-        return;
46
-    initialized = 1;
47
-
48 42
     /* devices */
49 43
     REGISTER_INOUTDEV(ALSA,             alsa);
50 44
     REGISTER_INDEV   (AVFOUNDATION,     avfoundation);
... ...
@@ -76,3 +71,10 @@ void avdevice_register_all(void)
76 76
     REGISTER_INDEV   (LIBCDIO,          libcdio);
77 77
     REGISTER_INDEV   (LIBDC1394,        libdc1394);
78 78
 }
79
+
80
+void avdevice_register_all(void)
81
+{
82
+    AVOnce control = AV_ONCE_INIT;
83
+
84
+    ff_thread_once(&control, register_all);
85
+}
... ...
@@ -67,7 +67,6 @@ const char *avdevice_license(void);
67 67
 
68 68
 /**
69 69
  * Initialize libavdevice and register all the input and output devices.
70
- * @warning This function is not thread safe.
71 70
  */
72 71
 void avdevice_register_all(void);
73 72