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