From e5d355d12ed417fbde1c707121ec8fb4070d7667 Mon Sep 17 00:00:00 2001 From: aliguori Date: Fri, 24 Apr 2009 18:03:15 +0000 Subject: qemu: mutex/thread/cond wrappers and configure tweaks (Marcelo Tosatti) Signed-off-by: Marcelo Tosatti Signed-off-by: Anthony Liguori git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@7237 c046a42c-6fe2-441c-8c8c-71466251a162 --- qemu-thread.c | 163 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 qemu-thread.c (limited to 'qemu-thread.c') diff --git a/qemu-thread.c b/qemu-thread.c new file mode 100644 index 0000000000..719cfcddd4 --- /dev/null +++ b/qemu-thread.c @@ -0,0 +1,163 @@ +/* + * Wrappers around mutex/cond/thread functions + * + * Copyright Red Hat, Inc. 2009 + * + * Author: + * Marcelo Tosatti + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + * + */ +#include +#include +#include +#include +#include +#include +#include +#include "qemu-thread.h" + +static void error_exit(int err, const char *msg) +{ + fprintf(stderr, "qemu: %s: %s\n", msg, strerror(err)); + exit(1); +} + +void qemu_mutex_init(QemuMutex *mutex) +{ + int err; + + err = pthread_mutex_init(&mutex->lock, NULL); + if (err) + error_exit(err, __func__); +} + +void qemu_mutex_lock(QemuMutex *mutex) +{ + int err; + + err = pthread_mutex_lock(&mutex->lock); + if (err) + error_exit(err, __func__); +} + +int qemu_mutex_trylock(QemuMutex *mutex) +{ + return pthread_mutex_trylock(&mutex->lock); +} + +static void timespec_add_ms(struct timespec *ts, uint64_t msecs) +{ + ts->tv_sec = ts->tv_sec + (long)(msecs / 1000); + ts->tv_nsec = (ts->tv_nsec + ((long)msecs % 1000) * 1000000); + if (ts->tv_nsec >= 1000000000) { + ts->tv_nsec -= 1000000000; + ts->tv_sec++; + } +} + +int qemu_mutex_timedlock(QemuMutex *mutex, uint64_t msecs) +{ + int err; + struct timespec ts; + + clock_gettime(CLOCK_REALTIME, &ts); + timespec_add_ms(&ts, msecs); + + err = pthread_mutex_timedlock(&mutex->lock, &ts); + if (err && err != ETIMEDOUT) + error_exit(err, __func__); + return err; +} + +void qemu_mutex_unlock(QemuMutex *mutex) +{ + int err; + + err = pthread_mutex_unlock(&mutex->lock); + if (err) + error_exit(err, __func__); +} + +void qemu_cond_init(QemuCond *cond) +{ + int err; + + err = pthread_cond_init(&cond->cond, NULL); + if (err) + error_exit(err, __func__); +} + +void qemu_cond_signal(QemuCond *cond) +{ + int err; + + err = pthread_cond_signal(&cond->cond); + if (err) + error_exit(err, __func__); +} + +void qemu_cond_broadcast(QemuCond *cond) +{ + int err; + + err = pthread_cond_broadcast(&cond->cond); + if (err) + error_exit(err, __func__); +} + +void qemu_cond_wait(QemuCond *cond, QemuMutex *mutex) +{ + int err; + + err = pthread_cond_wait(&cond->cond, &mutex->lock); + if (err) + error_exit(err, __func__); +} + +int qemu_cond_timedwait(QemuCond *cond, QemuMutex *mutex, uint64_t msecs) +{ + struct timespec ts; + int err; + + clock_gettime(CLOCK_REALTIME, &ts); + timespec_add_ms(&ts, msecs); + + err = pthread_cond_timedwait(&cond->cond, &mutex->lock, &ts); + if (err && err != ETIMEDOUT) + error_exit(err, __func__); + return err; +} + +void qemu_thread_create(QemuThread *thread, + void *(*start_routine)(void*), + void *arg) +{ + int err; + + err = pthread_create(&thread->thread, NULL, start_routine, arg); + if (err) + error_exit(err, __func__); +} + +void qemu_thread_signal(QemuThread *thread, int sig) +{ + int err; + + err = pthread_kill(thread->thread, sig); + if (err) + error_exit(err, __func__); +} + +void qemu_thread_self(QemuThread *thread) +{ + thread->thread = pthread_self(); +} + +int qemu_thread_equal(QemuThread *thread1, QemuThread *thread2) +{ + return (thread1->thread == thread2->thread); +} + -- cgit v1.2.3-55-g7522