From 2075195d707e2f69acb48a35ea2b770f2a4a1c8b Mon Sep 17 00:00:00 2001 From: Tim Wiederhake Date: Wed, 25 Aug 2021 10:25:32 +0200 Subject: [PATCH] virthread: Introduce VIR_WITH_MUTEX_LOCK_GUARD MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modeled after "WITH_QEMU_LOCK_GUARD" (see qemu's include/qemu/lockable.h). See comment for typical usage. Signed-off-by: Tim Wiederhake Reviewed-by: Martin Kletzander Reviewed-by: Daniel P. Berrangé --- src/util/virthread.h | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/util/virthread.h b/src/util/virthread.h index 6cdaf2820e..23abe0b6c9 100644 --- a/src/util/virthread.h +++ b/src/util/virthread.h @@ -209,3 +209,24 @@ int virThreadLocalSet(virThreadLocal *l, void*) G_GNUC_WARN_UNUSED_RESULT; return 0; \ } \ struct classname ## EatSemicolon + +#define VIR_WITH_MUTEX_LOCK_GUARD_(m, name) \ + for (g_auto(virLockGuard) name = virLockGuardLock(m); name.mutex; \ + name.mutex = (virLockGuardUnlock(&name), NULL)) +/** + * VIR_WITH_MUTEX_LOCK_GUARD: + * + * This macro defines a lock scope such that entering the scope takes the lock + * and leaving the scope releases the lock. Return statements are allowed + * within the scope and release the lock. Break and continue statements leave + * the scope early and release the lock. + * + * virMutex *mutex = ...; + * + * VIR_WITH_MUTEX_LOCK_GUARD(mutex) { + * // `mutex` is locked, and released automatically on scope exit + * ... + * } + */ +#define VIR_WITH_MUTEX_LOCK_GUARD(m) \ + VIR_WITH_MUTEX_LOCK_GUARD_(m, CONCAT(var, __COUNTER__))