yading@10
|
1 /*
|
yading@10
|
2 * Copyright (c) 2011 KO Myung-Hun <komh@chollian.net>
|
yading@10
|
3 *
|
yading@10
|
4 * This file is part of FFmpeg.
|
yading@10
|
5 *
|
yading@10
|
6 * FFmpeg is free software; you can redistribute it and/or
|
yading@10
|
7 * modify it under the terms of the GNU Lesser General Public
|
yading@10
|
8 * License as published by the Free Software Foundation; either
|
yading@10
|
9 * version 2.1 of the License, or (at your option) any later version.
|
yading@10
|
10 *
|
yading@10
|
11 * FFmpeg is distributed in the hope that it will be useful,
|
yading@10
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@10
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@10
|
14 * Lesser General Public License for more details.
|
yading@10
|
15 *
|
yading@10
|
16 * You should have received a copy of the GNU Lesser General Public
|
yading@10
|
17 * License along with FFmpeg; if not, write to the Free Software
|
yading@10
|
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@10
|
19 */
|
yading@10
|
20
|
yading@10
|
21 /**
|
yading@10
|
22 * @file
|
yading@10
|
23 * os2threads to pthreads wrapper
|
yading@10
|
24 */
|
yading@10
|
25
|
yading@10
|
26 #ifndef AVCODEC_OS2PTHREADS_H
|
yading@10
|
27 #define AVCODEC_OS2PTHREADS_H
|
yading@10
|
28
|
yading@10
|
29 #define INCL_DOS
|
yading@10
|
30 #include <os2.h>
|
yading@10
|
31
|
yading@10
|
32 #undef __STRICT_ANSI__ /* for _beginthread() */
|
yading@10
|
33 #include <stdlib.h>
|
yading@10
|
34
|
yading@10
|
35 typedef TID pthread_t;
|
yading@10
|
36 typedef void pthread_attr_t;
|
yading@10
|
37
|
yading@10
|
38 typedef HMTX pthread_mutex_t;
|
yading@10
|
39 typedef void pthread_mutexattr_t;
|
yading@10
|
40
|
yading@10
|
41 typedef struct {
|
yading@10
|
42 HEV event_sem;
|
yading@10
|
43 int wait_count;
|
yading@10
|
44 } pthread_cond_t;
|
yading@10
|
45
|
yading@10
|
46 typedef void pthread_condattr_t;
|
yading@10
|
47
|
yading@10
|
48 struct thread_arg {
|
yading@10
|
49 void *(*start_routine)(void *);
|
yading@10
|
50 void *arg;
|
yading@10
|
51 };
|
yading@10
|
52
|
yading@10
|
53 static void thread_entry(void *arg)
|
yading@10
|
54 {
|
yading@10
|
55 struct thread_arg *thread_arg = arg;
|
yading@10
|
56
|
yading@10
|
57 thread_arg->start_routine(thread_arg->arg);
|
yading@10
|
58
|
yading@10
|
59 av_free(thread_arg);
|
yading@10
|
60 }
|
yading@10
|
61
|
yading@10
|
62 static av_always_inline int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg)
|
yading@10
|
63 {
|
yading@10
|
64 struct thread_arg *thread_arg;
|
yading@10
|
65
|
yading@10
|
66 thread_arg = av_mallocz(sizeof(struct thread_arg));
|
yading@10
|
67
|
yading@10
|
68 thread_arg->start_routine = start_routine;
|
yading@10
|
69 thread_arg->arg = arg;
|
yading@10
|
70
|
yading@10
|
71 *thread = _beginthread(thread_entry, NULL, 256 * 1024, thread_arg);
|
yading@10
|
72
|
yading@10
|
73 return 0;
|
yading@10
|
74 }
|
yading@10
|
75
|
yading@10
|
76 static av_always_inline int pthread_join(pthread_t thread, void **value_ptr)
|
yading@10
|
77 {
|
yading@10
|
78 DosWaitThread((PTID)&thread, DCWW_WAIT);
|
yading@10
|
79
|
yading@10
|
80 return 0;
|
yading@10
|
81 }
|
yading@10
|
82
|
yading@10
|
83 static av_always_inline int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)
|
yading@10
|
84 {
|
yading@10
|
85 DosCreateMutexSem(NULL, (PHMTX)mutex, 0, FALSE);
|
yading@10
|
86
|
yading@10
|
87 return 0;
|
yading@10
|
88 }
|
yading@10
|
89
|
yading@10
|
90 static av_always_inline int pthread_mutex_destroy(pthread_mutex_t *mutex)
|
yading@10
|
91 {
|
yading@10
|
92 DosCloseMutexSem(*(PHMTX)mutex);
|
yading@10
|
93
|
yading@10
|
94 return 0;
|
yading@10
|
95 }
|
yading@10
|
96
|
yading@10
|
97 static av_always_inline int pthread_mutex_lock(pthread_mutex_t *mutex)
|
yading@10
|
98 {
|
yading@10
|
99 DosRequestMutexSem(*(PHMTX)mutex, SEM_INDEFINITE_WAIT);
|
yading@10
|
100
|
yading@10
|
101 return 0;
|
yading@10
|
102 }
|
yading@10
|
103
|
yading@10
|
104 static av_always_inline int pthread_mutex_unlock(pthread_mutex_t *mutex)
|
yading@10
|
105 {
|
yading@10
|
106 DosReleaseMutexSem(*(PHMTX)mutex);
|
yading@10
|
107
|
yading@10
|
108 return 0;
|
yading@10
|
109 }
|
yading@10
|
110
|
yading@10
|
111 static av_always_inline int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr)
|
yading@10
|
112 {
|
yading@10
|
113 DosCreateEventSem(NULL, &cond->event_sem, DCE_POSTONE, FALSE);
|
yading@10
|
114
|
yading@10
|
115 cond->wait_count = 0;
|
yading@10
|
116
|
yading@10
|
117 return 0;
|
yading@10
|
118 }
|
yading@10
|
119
|
yading@10
|
120 static av_always_inline int pthread_cond_destroy(pthread_cond_t *cond)
|
yading@10
|
121 {
|
yading@10
|
122 DosCloseEventSem(cond->event_sem);
|
yading@10
|
123
|
yading@10
|
124 return 0;
|
yading@10
|
125 }
|
yading@10
|
126
|
yading@10
|
127 static av_always_inline int pthread_cond_signal(pthread_cond_t *cond)
|
yading@10
|
128 {
|
yading@10
|
129 if (cond->wait_count > 0) {
|
yading@10
|
130 DosPostEventSem(cond->event_sem);
|
yading@10
|
131
|
yading@10
|
132 cond->wait_count--;
|
yading@10
|
133 }
|
yading@10
|
134
|
yading@10
|
135 return 0;
|
yading@10
|
136 }
|
yading@10
|
137
|
yading@10
|
138 static av_always_inline int pthread_cond_broadcast(pthread_cond_t *cond)
|
yading@10
|
139 {
|
yading@10
|
140 while (cond->wait_count > 0) {
|
yading@10
|
141 DosPostEventSem(cond->event_sem);
|
yading@10
|
142
|
yading@10
|
143 cond->wait_count--;
|
yading@10
|
144 }
|
yading@10
|
145
|
yading@10
|
146 return 0;
|
yading@10
|
147 }
|
yading@10
|
148
|
yading@10
|
149 static av_always_inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
|
yading@10
|
150 {
|
yading@10
|
151 cond->wait_count++;
|
yading@10
|
152
|
yading@10
|
153 pthread_mutex_unlock(mutex);
|
yading@10
|
154
|
yading@10
|
155 DosWaitEventSem(cond->event_sem, SEM_INDEFINITE_WAIT);
|
yading@10
|
156
|
yading@10
|
157 pthread_mutex_lock(mutex);
|
yading@10
|
158
|
yading@10
|
159 return 0;
|
yading@10
|
160 }
|
yading@10
|
161
|
yading@10
|
162 #endif /* AVCODEC_OS2PTHREADS_H */
|