On Sun, Oct 11, 2015 at 4:32 AM, Dave Yeo <daver...@telus.net> wrote: > Based on code by Yuri Dario, http://svn.netlabs.org/repos/ports/pthread/trunk > > Signed-off-by: Dave Yeo <daver...@telus.net> > --- > compat/os2threads.h | 45 +++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 45 insertions(+) > > diff --git a/compat/os2threads.h b/compat/os2threads.h > index 5b6ca55..7f2c925 100644 > --- a/compat/os2threads.h > +++ b/compat/os2threads.h > @@ -31,9 +31,18 @@ > > #undef __STRICT_ANSI__ /* for _beginthread() */ > #include <stdlib.h> > +#include <sys/builtin.h> > > #include "libavutil/mem.h" > > +/* > + * Boolean values to make us independent of system includes. > + */ > +enum { > + PTW32_FALSE = 0, > + PTW32_TRUE = (! PTW32_FALSE) > +}; > + > typedef TID pthread_t; > typedef void pthread_attr_t; > > @@ -47,6 +56,19 @@ typedef struct { > > typedef void pthread_condattr_t; > > +typedef struct pthread_once_t_ pthread_once_t; > + > +#define PTHREAD_ONCE_INIT {0} > + > +struct pthread_once_t_ > +{ > + unsigned done; /* indicates if user function > has been executed */ > + pthread_mutex_t lock; > + int reserved1; > + int reserved2; > +}; > + > + > struct thread_arg { > void *(*start_routine)(void *); > void *arg; > @@ -163,4 +185,27 @@ 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 == NULL || init_routine == NULL) > + { > + return EINVAL; > + } > + > + if (__atomic_cmpxchg32((unsigned*)&once_control->done, 0, 0)) /* MBR > fence */ > + { > + pthread_mutex_lock(&once_control->lock); > + > + if (!once_control->done) > + { > + (*init_routine)(); > + once_control->done = PTW32_TRUE; > + } > + > + pthread_mutex_unlock(&once_control->lock); > + } > + > + return 0; > +} > + > #endif /* AVCODEC_OS2PTHREADS_H */
I don't think this works properly, as you don't initialize the mutexes - which I think OS/2 needs, why would we otherwise have a mutex initialization function. :) Either add atomic initialization, or use a atomic sleep loop like in the win32 code. _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel