Emilio G. Cota <[email protected]> writes:
> From: Guillaume Delbergue <[email protected]>
>
> Signed-off-by: Guillaume Delbergue <[email protected]>
> [Rewritten. - Paolo]
> Signed-off-by: Paolo Bonzini <[email protected]>
> ---
> include/qemu/thread.h | 31 +++++++++++++++++++++++++++++++
> 1 file changed, 31 insertions(+)
>
> diff --git a/include/qemu/thread.h b/include/qemu/thread.h
> index bdae6df..1aa843b 100644
> --- a/include/qemu/thread.h
> +++ b/include/qemu/thread.h
> @@ -1,6 +1,8 @@
> #ifndef __QEMU_THREAD_H
> #define __QEMU_THREAD_H 1
>
> +#include <errno.h>
> +#include "qemu/atomic.h"
>
> typedef struct QemuMutex QemuMutex;
> typedef struct QemuCond QemuCond;
> @@ -60,4 +62,33 @@ struct Notifier;
> void qemu_thread_atexit_add(struct Notifier *notifier);
> void qemu_thread_atexit_remove(struct Notifier *notifier);
>
> +typedef struct QemuSpin {
> + int value;
If we are throwing true and false around as the only two values can we
use bool here and be consistent when setting/clearing.
> +} QemuSpin;
> +
> +static inline void qemu_spin_init(QemuSpin *spin)
> +{
> + spin->value = 0;
> +}
> +
> +static inline void qemu_spin_lock(QemuSpin *spin)
> +{
> + do {
> + while (atomic_read(&spin->value));
> + } while (atomic_xchg(&spin->value, true));
> +}
> +
> +static inline int qemu_spin_trylock(QemuSpin *spin)
> +{
> + if (atomic_read(&spin->value) || atomic_xchg(&spin->value, true)) {
> + return -EBUSY;
> + }
> + return 0;
> +}
> +
> +static inline void qemu_spin_unlock(QemuSpin *spin)
> +{
> + atomic_mb_set(&spin->value, 0);
> +}
> +
> #endif
--
Alex Bennée