2 * Copyright (c) 2011 KO Myung-Hun <komh@chollian.net>
4 * This file is part of FFmpeg.
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 * os2threads to pthreads wrapper
26 #ifndef AVCODEC_OS2PTHREADS_H
27 #define AVCODEC_OS2PTHREADS_H
32 #undef __STRICT_ANSI__ /* for _beginthread() */
35 #include "libavutil/mem.h"
37 typedef TID pthread_t
;
38 typedef void pthread_attr_t
;
40 typedef HMTX pthread_mutex_t
;
41 typedef void pthread_mutexattr_t
;
48 typedef void pthread_condattr_t
;
51 void *(*start_routine
)(void *);
55 static void thread_entry(void *arg
)
57 struct thread_arg
*thread_arg
= arg
;
59 thread_arg
->start_routine(thread_arg
->arg
);
64 static av_always_inline
int pthread_create(pthread_t
*thread
, const pthread_attr_t
*attr
, void *(*start_routine
)(void*), void *arg
)
66 struct thread_arg
*thread_arg
;
68 thread_arg
= av_mallocz(sizeof(struct thread_arg
));
70 thread_arg
->start_routine
= start_routine
;
71 thread_arg
->arg
= arg
;
73 *thread
= _beginthread(thread_entry
, NULL
, 256 * 1024, thread_arg
);
78 static av_always_inline
int pthread_join(pthread_t thread
, void **value_ptr
)
80 DosWaitThread((PTID
)&thread
, DCWW_WAIT
);
85 static av_always_inline
int pthread_mutex_init(pthread_mutex_t
*mutex
, const pthread_mutexattr_t
*attr
)
87 DosCreateMutexSem(NULL
, (PHMTX
)mutex
, 0, FALSE
);
92 static av_always_inline
int pthread_mutex_destroy(pthread_mutex_t
*mutex
)
94 DosCloseMutexSem(*(PHMTX
)mutex
);
99 static av_always_inline
int pthread_mutex_lock(pthread_mutex_t
*mutex
)
101 DosRequestMutexSem(*(PHMTX
)mutex
, SEM_INDEFINITE_WAIT
);
106 static av_always_inline
int pthread_mutex_unlock(pthread_mutex_t
*mutex
)
108 DosReleaseMutexSem(*(PHMTX
)mutex
);
113 static av_always_inline
int pthread_cond_init(pthread_cond_t
*cond
, const pthread_condattr_t
*attr
)
115 DosCreateEventSem(NULL
, &cond
->event_sem
, DCE_POSTONE
, FALSE
);
117 cond
->wait_count
= 0;
122 static av_always_inline
int pthread_cond_destroy(pthread_cond_t
*cond
)
124 DosCloseEventSem(cond
->event_sem
);
129 static av_always_inline
int pthread_cond_signal(pthread_cond_t
*cond
)
131 if (cond
->wait_count
> 0) {
132 DosPostEventSem(cond
->event_sem
);
140 static av_always_inline
int pthread_cond_broadcast(pthread_cond_t
*cond
)
142 while (cond
->wait_count
> 0) {
143 DosPostEventSem(cond
->event_sem
);
151 static av_always_inline
int pthread_cond_wait(pthread_cond_t
*cond
, pthread_mutex_t
*mutex
)
155 pthread_mutex_unlock(mutex
);
157 DosWaitEventSem(cond
->event_sem
, SEM_INDEFINITE_WAIT
);
159 pthread_mutex_lock(mutex
);
164 #endif /* AVCODEC_OS2PTHREADS_H */