Emilio G. Cota <c...@braap.org> writes: > From: Guillaume Delbergue <guillaume.delber...@greensocs.com> > > Signed-off-by: Guillaume Delbergue <guillaume.delber...@greensocs.com> > [Rewritten. - Paolo] > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> > --- > 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