[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: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [RFC PATCH V6 04/18] add support for spin lock on POSIX systems exclusively |
Date: |
Fri, 26 Jun 2015 16:55:22 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.0.1 |
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
> 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));
>