[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC PATCH V6 04/18] add support for spin lock on POSIX sys
From: |
fred . konrad |
Subject: |
[Qemu-devel] [RFC PATCH V6 04/18] add support for spin lock on POSIX systems exclusively |
Date: |
Fri, 26 Jun 2015 16:47:19 +0200 |
From: Guillaume Delbergue <address@hidden>
WARNING: spin lock is currently not implemented on WIN32
Signed-off-by: Guillaume Delbergue <address@hidden>
---
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