os2threads: Add pthread_once()
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
parent
b1a32429ef
commit
6248f23859
|
@ -32,6 +32,8 @@
|
||||||
#undef __STRICT_ANSI__ /* for _beginthread() */
|
#undef __STRICT_ANSI__ /* for _beginthread() */
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <sys/fmutex.h>
|
||||||
|
|
||||||
#include "libavutil/mem.h"
|
#include "libavutil/mem.h"
|
||||||
|
|
||||||
typedef TID pthread_t;
|
typedef TID pthread_t;
|
||||||
|
@ -47,6 +49,13 @@ typedef struct {
|
||||||
|
|
||||||
typedef void pthread_condattr_t;
|
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 {
|
struct thread_arg {
|
||||||
void *(*start_routine)(void *);
|
void *(*start_routine)(void *);
|
||||||
void *arg;
|
void *arg;
|
||||||
|
@ -163,4 +172,22 @@ static av_always_inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mute
|
||||||
return 0;
|
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 */
|
#endif /* AVCODEC_OS2PTHREADS_H */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user