qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [RFC PATCH V6 04/18] add support for spin lock on POSIX


From: Frederic Konrad
Subject: Re: [Qemu-devel] [RFC PATCH V6 04/18] add support for spin lock on POSIX systems exclusively
Date: Fri, 26 Jun 2015 17:31:19 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0

On 26/06/2015 16:55, Paolo Bonzini wrote:

On 26/06/2015 16:47, address@hidden wrote:
From: Guillaume Delbergue <address@hidden>

WARNING: spin lock is currently not implemented on WIN32
The Windows KSPIN_LOCK is a kernel data structure.  You can implement a
simple, portable test-and-test-and-set spinlock using atomics, and use
it on both POSIX and Win32.

Paolo

ok we will take a look at atomic instruction.

Fred

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));





reply via email to

[Prev in Thread] Current Thread [Next in Thread]