From: Guillaume Delbergue <guillaume.delber...@greensocs.com> WARNING: spin lock is currently not implemented on WIN32
Signed-off-by: Guillaume Delbergue <guillaume.delber...@greensocs.com> --- include/qemu/thread-posix.h | 4 ++++ include/qemu/thread-win32.h | 4 ++++ include/qemu/thread.h | 7 +++++++ util/qemu-thread-posix.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ util/qemu-thread-win32.c | 30 ++++++++++++++++++++++++++++++ 5 files changed, 90 insertions(+) diff --git a/include/qemu/thread-posix.h b/include/qemu/thread-posix.h index eb5c7a1..8ce8f01 100644 --- a/include/qemu/thread-posix.h +++ b/include/qemu/thread-posix.h @@ -7,6 +7,10 @@ struct QemuMutex { pthread_mutex_t lock; }; +struct QemuSpin { + pthread_spinlock_t lock; +}; + struct QemuCond { pthread_cond_t cond; }; diff --git a/include/qemu/thread-win32.h b/include/qemu/thread-win32.h index 3d58081..310c8bd 100644 --- a/include/qemu/thread-win32.h +++ b/include/qemu/thread-win32.h @@ -7,6 +7,10 @@ struct QemuMutex { LONG owner; }; +struct QemuSpin { + PKSPIN_LOCK lock; +}; + struct QemuCond { LONG waiters, target; HANDLE sema; diff --git a/include/qemu/thread.h b/include/qemu/thread.h index 5114ec8..f5d1259 100644 --- a/include/qemu/thread.h +++ b/include/qemu/thread.h @@ -5,6 +5,7 @@ #include <stdbool.h> typedef struct QemuMutex QemuMutex; +typedef struct QemuSpin QemuSpin; typedef struct QemuCond QemuCond; typedef struct QemuSemaphore QemuSemaphore; typedef struct QemuEvent QemuEvent; @@ -25,6 +26,12 @@ void qemu_mutex_lock(QemuMutex *mutex); int qemu_mutex_trylock(QemuMutex *mutex); void qemu_mutex_unlock(QemuMutex *mutex); +void qemu_spin_init(QemuSpin *spin); +void qemu_spin_destroy(QemuSpin *spin); +void qemu_spin_lock(QemuSpin *spin); +int qemu_spin_trylock(QemuSpin *spin); +void qemu_spin_unlock(QemuSpin *spin); + void qemu_cond_init(QemuCond *cond); void qemu_cond_destroy(QemuCond *cond); diff --git a/util/qemu-thread-posix.c b/util/qemu-thread-posix.c index ba67cec..224bacc 100644 --- a/util/qemu-thread-posix.c +++ b/util/qemu-thread-posix.c @@ -89,6 +89,51 @@ void qemu_mutex_unlock(QemuMutex *mutex) error_exit(err, __func__); } +void qemu_spin_init(QemuSpin *spin) +{ + int err; + + err = pthread_spin_init(&spin->lock, 0); + if (err) { + error_exit(err, __func__); + } +} + +void qemu_spin_destroy(QemuSpin *spin) +{ + int err; + + err = pthread_spin_destroy(&spin->lock); + if (err) { + error_exit(err, __func__); + } +} + +void qemu_spin_lock(QemuSpin *spin) +{ + int err; + + err = pthread_spin_lock(&spin->lock); + if (err) { + error_exit(err, __func__); + } +} + +int qemu_spin_trylock(QemuSpin *spin) +{ + return pthread_spin_trylock(&spin->lock); +} + +void qemu_spin_unlock(QemuSpin *spin) +{ + int err; + + err = pthread_spin_unlock(&spin->lock); + if (err) { + error_exit(err, __func__); + } +} + void qemu_cond_init(QemuCond *cond) { int err; diff --git a/util/qemu-thread-win32.c b/util/qemu-thread-win32.c index 406b52f..6fbe6a8 100644 --- a/util/qemu-thread-win32.c +++ b/util/qemu-thread-win32.c @@ -80,6 +80,36 @@ void qemu_mutex_unlock(QemuMutex *mutex) LeaveCriticalSection(&mutex->lock); } +void qemu_spin_init(QemuSpin *spin) +{ + printf("spinlock not implemented"); + abort(); +} + +void qemu_spin_destroy(QemuSpin *spin) +{ + printf("spinlock not implemented"); + abort(); +} + +void qemu_spin_lock(QemuSpin *spin) +{ + printf("spinlock not implemented"); + abort(); +} + +int qemu_spin_trylock(QemuSpin *spin) +{ + printf("spinlock not implemented"); + abort(); +} + +void qemu_spin_unlock(QemuSpin *spin) +{ + printf("spinlock not implemented"); + abort(); +} + void qemu_cond_init(QemuCond *cond) { memset(cond, 0, sizeof(*cond)); -- 1.9.0