virobject: Introduce VIR_WITH_OBJECT_LOCK_GUARD

Modeled after "WITH_QEMU_LOCK_GUARD" (see qemu's include/qemu/lockable.h).

See comment for typical usage.

Signed-off-by: Tim Wiederhake <twiederh@redhat.com>
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
Tim Wiederhake 2021-08-23 14:47:25 +02:00
parent 8935c8397c
commit 6373a87315

View File

@ -148,3 +148,25 @@ virObjectListFree(void *list);
void void
virObjectListFreeCount(void *list, virObjectListFreeCount(void *list,
size_t count); size_t count);
#define VIR_WITH_OBJECT_LOCK_GUARD_(o, name) \
for (g_auto(virLockGuard) name = virObjectLockGuard(o); name.mutex; \
name.mutex = (virLockGuardUnlock(&name), NULL))
/**
* VIR_WITH_OBJECT_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.
*
* virObjectLockable *lockable = ...;
*
* VIR_WITH_OBJECT_LOCK_GUARD(lockable) {
* // `lockable` is locked, and released automatically on scope exit
* ...
* }
*/
#define VIR_WITH_OBJECT_LOCK_GUARD(o) \
VIR_WITH_OBJECT_LOCK_GUARD_(o, CONCAT(var, __COUNTER__))