[FFmpeg-cvslog] os2threads: Add pthread_once()

KO Myung-Hun git at videolan.org
Thu Nov 12 22:46:37 CET 2015


ffmpeg | branch: master | KO Myung-Hun <komh78 at gmail.com> | Thu Nov 12 12:31:51 2015 +0900| [6248f23859eb610079b1964e5f081ff0e9c62281] | committer: Michael Niedermayer

os2threads: Add pthread_once()

Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=6248f23859eb610079b1964e5f081ff0e9c62281
---

 compat/os2threads.h |   27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/compat/os2threads.h b/compat/os2threads.h
index 5b6ca55..f8fb2c8 100644
--- a/compat/os2threads.h
+++ b/compat/os2threads.h
@@ -32,6 +32,8 @@
 #undef __STRICT_ANSI__          /* for _beginthread() */
 #include <stdlib.h>
 
+#include <sys/fmutex.h>
+
 #include "libavutil/mem.h"
 
 typedef TID  pthread_t;
@@ -47,6 +49,13 @@ typedef struct {
 
 typedef void pthread_condattr_t;
 
+typedef struct {
+    volatile int done;
+    _fmutex mtx;
+} pthread_once_t;
+
+#define PTHREAD_ONCE_INIT {0, _FMUTEX_INITIALIZER}
+
 struct thread_arg {
     void *(*start_routine)(void *);
     void *arg;
@@ -163,4 +172,22 @@ static av_always_inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mute
     return 0;
 }
 
+static av_always_inline int pthread_once(pthread_once_t *once_control, void (*init_routine)(void))
+{
+    if (!once_control->done)
+    {
+        _fmutex_request(&once_control->mtx, 0);
+
+        if (!once_control->done)
+        {
+            init_routine();
+
+            once_control->done = 1;
+        }
+
+        _fmutex_release(&once_control->mtx);
+    }
+
+    return 0;
+}
 #endif /* AVCODEC_OS2PTHREADS_H */



More information about the ffmpeg-cvslog mailing list