Richard Henderson <richard.hender...@linaro.org> writes:
> Create a wrapper for locking/unlocking the iothread lock. > > Signed-off-by: Richard Henderson <richard.hender...@linaro.org> > --- > Cc: Paolo Bonzini <pbonz...@redhat.com> (maintainer:Main loop) You might want to review Paolo's comments from: Subject: [RFC PATCH] main-loop: introduce WITH_QEMU_IOTHREAD_LOCK Date: Mon, 24 Oct 2022 18:19:09 +0100 Message-Id: <20221024171909.434818-1-alex.ben...@linaro.org> So it would be worth having the WITH_QEMU_IOTHREAD_LOCK() and MAYBE_WITH_QEMU_IOTHREAD_LOCK() helpers for completeness. And of course the name cleanup. > --- > include/qemu/main-loop.h | 29 +++++++++++++++++++++++++++++ > 1 file changed, 29 insertions(+) > > diff --git a/include/qemu/main-loop.h b/include/qemu/main-loop.h > index 3c9a9a982d..c25f390696 100644 > --- a/include/qemu/main-loop.h > +++ b/include/qemu/main-loop.h > @@ -343,6 +343,35 @@ void qemu_mutex_lock_iothread_impl(const char *file, int > line); > */ > void qemu_mutex_unlock_iothread(void); > > +/** > + * QEMU_IOTHREAD_LOCK_GUARD > + * > + * Wrap a block of code in a conditional qemu_mutex_{lock,unlock}_iothread. > + */ > +typedef struct IOThreadLockAuto IOThreadLockAuto; > + > +static inline IOThreadLockAuto *qemu_iothread_auto_lock(const char *file, > + int line) > +{ > + if (qemu_mutex_iothread_locked()) { > + return NULL; > + } > + qemu_mutex_lock_iothread_impl(file, line); > + /* Anything non-NULL causes the cleanup function to be called */ > + return (IOThreadLockAuto *)(uintptr_t)1; > +} > + > +static inline void qemu_iothread_auto_unlock(IOThreadLockAuto *l) > +{ > + qemu_mutex_unlock_iothread(); > +} > + > +G_DEFINE_AUTOPTR_CLEANUP_FUNC(IOThreadLockAuto, qemu_iothread_auto_unlock) > + > +#define QEMU_IOTHREAD_LOCK_GUARD() \ > + g_autoptr(IOThreadLockAuto) _iothread_lock_auto __attribute__((unused)) \ > + = qemu_iothread_auto_lock(__FILE__, __LINE__) > + > /* > * qemu_cond_wait_iothread: Wait on condition for the main loop mutex > * -- Alex Bennée