]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
virthread: Introduce virLockGuard
authorTim Wiederhake <twiederh@redhat.com>
Wed, 25 Aug 2021 08:25:32 +0000 (10:25 +0200)
committerTim Wiederhake <twiederh@redhat.com>
Tue, 1 Feb 2022 16:19:23 +0000 (17:19 +0100)
Locks a virMutex on creation and unlocks it in its destructor.

The VIR_LOCK_GUARD macro is used instead of "g_auto(virLockGuard)" to
work around a clang issue (see https://bugs.llvm.org/show_bug.cgi?id=3888
and https://bugs.llvm.org/show_bug.cgi?id=43482).

Typical usage:

    void function(virMutex *m)
    {
        VIR_LOCK_GUARD lock = virLockGuardLock(m);
        /* `m` is locked, and released automatically on scope exit */

        ...
        while (expression) {
            VIR_LOCK_GUARD lock2 = virLockGuardLock(...);
            /* similar */
        }
    }

Signed-off-by: Tim Wiederhake <twiederh@redhat.com>
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
src/libvirt_private.syms
src/util/virthread.c
src/util/virthread.h

index bc6fa191bf9a432fbe0bd2fa8cf32a6cd59f78ee..5da9874e17ed6c8d5ebae334d113ce74f52ae421 100644 (file)
@@ -3388,6 +3388,8 @@ virCondInit;
 virCondSignal;
 virCondWait;
 virCondWaitUntil;
+virLockGuardLock;
+virLockGuardUnlock;
 virMutexDestroy;
 virMutexInit;
 virMutexInitRecursive;
index e89c1a09fba08c20780d63634e46404a90314ace..5422bb74fdd766073538dd5fee3cb81e9357e643 100644 (file)
@@ -96,6 +96,21 @@ void virMutexUnlock(virMutex *m)
     pthread_mutex_unlock(&m->lock);
 }
 
+virLockGuard virLockGuardLock(virMutex *m)
+{
+    virLockGuard l = { m };
+    virMutexLock(m);
+    return l;
+}
+
+void virLockGuardUnlock(virLockGuard *l)
+{
+    if (!l || !l->mutex)
+        return;
+
+    virMutexUnlock(g_steal_pointer(&l->mutex));
+}
+
 
 int virRWLockInit(virRWLock *m)
 {
index 55c8263ae6443c80f665ec06a0f5c4c727a075ab..6cdaf2820e02be4aa152903da1e10f68da00707e 100644 (file)
@@ -31,6 +31,11 @@ struct virMutex {
     pthread_mutex_t lock;
 };
 
+typedef struct virLockGuard virLockGuard;
+struct virLockGuard {
+    virMutex *mutex;
+};
+
 typedef struct virRWLock virRWLock;
 struct virRWLock {
     pthread_rwlock_t lock;
@@ -121,6 +126,11 @@ void virMutexLock(virMutex *m);
 void virMutexUnlock(virMutex *m);
 
 
+virLockGuard virLockGuardLock(virMutex *m);
+void virLockGuardUnlock(virLockGuard *l);
+G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(virLockGuard, virLockGuardUnlock);
+#define VIR_LOCK_GUARD g_auto(virLockGuard) G_GNUC_UNUSED
+
 int virRWLockInit(virRWLock *m) G_GNUC_WARN_UNUSED_RESULT;
 void virRWLockDestroy(virRWLock *m);