[FFmpeg-devel] [PATCH] os2threads: Add pthread_once emulation

Hendrik Leppkes h.leppkes at gmail.com
Sun Oct 11 10:35:22 CEST 2015


On Sun, Oct 11, 2015 at 4:32 AM, Dave Yeo <daveryeo at telus.net> wrote:
> Based on code by Yuri Dario, http://svn.netlabs.org/repos/ports/pthread/trunk
>
> Signed-off-by: Dave Yeo <daveryeo at 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.


More information about the ffmpeg-devel mailing list