Commit 988fcafc authored by Paolo Bonzini's avatar Paolo Bonzini
Browse files

seqlock: add QemuLockable support



A shortcut when the seqlock write is protected by a spinlock or any mutex
other than the BQL.

Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent c1ff073c
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

#include "qemu/atomic.h"
#include "qemu/thread.h"
#include "qemu/lockable.h"

typedef struct QemuSeqLock QemuSeqLock;

@@ -45,6 +46,25 @@ static inline void seqlock_write_end(QemuSeqLock *sl)
    atomic_set(&sl->sequence, sl->sequence + 1);
}

/* Lock out other writers and update the count.  */
static inline void seqlock_write_lock_impl(QemuSeqLock *sl, QemuLockable *lock)
{
    qemu_lockable_lock(lock);
    seqlock_write_begin(sl);
}
#define seqlock_write_lock(sl, lock) \
    seqlock_write_lock_impl(sl, QEMU_MAKE_LOCKABLE(lock))

/* Lock out other writers and update the count.  */
static inline void seqlock_write_unlock_impl(QemuSeqLock *sl, QemuLockable *lock)
{
    qemu_lockable_unlock(lock);
    seqlock_write_begin(sl);
}
#define seqlock_write_unlock(sl, lock) \
    seqlock_write_unlock_impl(sl, QEMU_MAKE_LOCKABLE(lock))


static inline unsigned seqlock_read_begin(const QemuSeqLock *sl)
{
    /* Always fail if a write is in progress.  */