Revision 38b14db3 qemu-thread-posix.c
b/qemu-thread-posix.c | ||
---|---|---|
17 | 17 |
#include <signal.h> |
18 | 18 |
#include <stdint.h> |
19 | 19 |
#include <string.h> |
20 |
#include <limits.h> |
|
21 |
#include <unistd.h> |
|
22 |
#include <sys/time.h> |
|
20 | 23 |
#include "qemu-thread.h" |
21 | 24 |
|
22 | 25 |
static void error_exit(int err, const char *msg) |
... | ... | |
115 | 118 |
error_exit(err, __func__); |
116 | 119 |
} |
117 | 120 |
|
121 |
void qemu_sem_init(QemuSemaphore *sem, int init) |
|
122 |
{ |
|
123 |
int rc; |
|
124 |
|
|
125 |
rc = sem_init(&sem->sem, 0, init); |
|
126 |
if (rc < 0) { |
|
127 |
error_exit(errno, __func__); |
|
128 |
} |
|
129 |
} |
|
130 |
|
|
131 |
void qemu_sem_destroy(QemuSemaphore *sem) |
|
132 |
{ |
|
133 |
int rc; |
|
134 |
|
|
135 |
rc = sem_destroy(&sem->sem); |
|
136 |
if (rc < 0) { |
|
137 |
error_exit(errno, __func__); |
|
138 |
} |
|
139 |
} |
|
140 |
|
|
141 |
void qemu_sem_post(QemuSemaphore *sem) |
|
142 |
{ |
|
143 |
int rc; |
|
144 |
|
|
145 |
rc = sem_post(&sem->sem); |
|
146 |
if (rc < 0) { |
|
147 |
error_exit(errno, __func__); |
|
148 |
} |
|
149 |
} |
|
150 |
|
|
151 |
int qemu_sem_timedwait(QemuSemaphore *sem, int ms) |
|
152 |
{ |
|
153 |
int rc; |
|
154 |
|
|
155 |
if (ms <= 0) { |
|
156 |
/* This is cheaper than sem_timedwait. */ |
|
157 |
do { |
|
158 |
rc = sem_trywait(&sem->sem); |
|
159 |
} while (rc == -1 && errno == EINTR); |
|
160 |
if (rc == -1 && errno == EAGAIN) { |
|
161 |
return -1; |
|
162 |
} |
|
163 |
} else { |
|
164 |
struct timeval tv; |
|
165 |
struct timespec ts; |
|
166 |
gettimeofday(&tv, NULL); |
|
167 |
ts.tv_nsec = tv.tv_usec * 1000 + (ms % 1000) * 1000000; |
|
168 |
ts.tv_sec = tv.tv_sec + ms / 1000; |
|
169 |
if (ts.tv_nsec >= 1000000000) { |
|
170 |
ts.tv_sec++; |
|
171 |
ts.tv_nsec -= 1000000000; |
|
172 |
} |
|
173 |
do { |
|
174 |
rc = sem_timedwait(&sem->sem, &ts); |
|
175 |
} while (rc == -1 && errno == EINTR); |
|
176 |
if (rc == -1 && errno == ETIMEDOUT) { |
|
177 |
return -1; |
|
178 |
} |
|
179 |
} |
|
180 |
if (rc < 0) { |
|
181 |
error_exit(errno, __func__); |
|
182 |
} |
|
183 |
return 0; |
|
184 |
} |
|
185 |
|
|
186 |
void qemu_sem_wait(QemuSemaphore *sem) |
|
187 |
{ |
|
188 |
int rc; |
|
189 |
|
|
190 |
do { |
|
191 |
rc = sem_wait(&sem->sem); |
|
192 |
} while (rc == -1 && errno == EINTR); |
|
193 |
if (rc < 0) { |
|
194 |
error_exit(errno, __func__); |
|
195 |
} |
|
196 |
} |
|
197 |
|
|
118 | 198 |
void qemu_thread_create(QemuThread *thread, |
119 | 199 |
void *(*start_routine)(void*), |
120 | 200 |
void *arg, int mode) |
Also available in: Unified diff