]> xenbits.xensource.com Git - libvirt.git/commitdiff
lxc: Use automatic mutex management
authorTim Wiederhake <twiederh@redhat.com>
Fri, 4 Feb 2022 15:38:10 +0000 (16:38 +0100)
committerTim Wiederhake <twiederh@redhat.com>
Fri, 11 Feb 2022 10:03:54 +0000 (11:03 +0100)
Signed-off-by: Tim Wiederhake <twiederh@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/lxc/lxc_conf.c
src/lxc/lxc_conf.h
src/lxc/lxc_controller.c
src/lxc/lxc_fuse.c

index cf6679711aa75590c44808c92d1381a80a0f77fe..3ab4d61fe3ed5966cb62f713b9f59d182db10d20 100644 (file)
@@ -159,24 +159,24 @@ virCaps *virLXCDriverGetCapabilities(virLXCDriver *driver,
     virCaps *ret = NULL;
     virCaps *caps = NULL;
 
-    lxcDriverLock(driver);
-    if (!refresh && !driver->caps) {
-        VIR_DEBUG("Capabilities didn't detect any guests. Forcing a refresh.");
-        refresh = true;
+    VIR_WITH_MUTEX_LOCK_GUARD(&driver->lock) {
+        if (!refresh && !driver->caps) {
+            VIR_DEBUG("Capabilities didn't detect any guests. Forcing a refresh.");
+            refresh = true;
+        }
     }
-    lxcDriverUnlock(driver);
 
     if (refresh && !(caps = virLXCDriverCapsInit(driver)))
         return NULL;
 
-    lxcDriverLock(driver);
-    if (refresh) {
-        virObjectUnref(driver->caps);
-        driver->caps = caps;
-    }
+    VIR_WITH_MUTEX_LOCK_GUARD(&driver->lock) {
+        if (refresh) {
+            virObjectUnref(driver->caps);
+            driver->caps = caps;
+        }
 
-    ret = virObjectRef(driver->caps);
-    lxcDriverUnlock(driver);
+        ret = virObjectRef(driver->caps);
+    }
 
     return ret;
 }
@@ -248,11 +248,8 @@ virLXCLoadDriverConfig(virLXCDriverConfig *cfg,
 
 virLXCDriverConfig *virLXCDriverGetConfig(virLXCDriver *driver)
 {
-    virLXCDriverConfig *cfg;
-    lxcDriverLock(driver);
-    cfg = virObjectRef(driver->config);
-    lxcDriverUnlock(driver);
-    return cfg;
+    VIR_LOCK_GUARD lock = virLockGuardLock(&driver->lock);
+    return virObjectRef(driver->config);
 }
 
 static void
index 5a1351bd63792a6cc030ef942e8026f2c42a00ca..04e51aa954e1fedd4a88c8fd300d3aa3b42faa6d 100644 (file)
@@ -113,12 +113,3 @@ virCaps *virLXCDriverGetCapabilities(virLXCDriver *driver,
                                        bool refresh);
 virDomainXMLOption *lxcDomainXMLConfInit(virLXCDriver *driver,
                                            const char *defsecmodel);
-
-static inline void lxcDriverLock(virLXCDriver *driver)
-{
-    virMutexLock(&driver->lock);
-}
-static inline void lxcDriverUnlock(virLXCDriver *driver)
-{
-    virMutexUnlock(&driver->lock);
-}
index 8cce06cd2be9c0eaa66ffd68098c8325361e5f53..7e798f7b3f30bb1bdf63b5ba88810a5b27e41ce7 100644 (file)
@@ -992,7 +992,7 @@ static int lxcControllerClearCapabilities(void)
 }
 
 static bool wantReboot;
-static virMutex lock = VIR_MUTEX_INITIALIZER;
+static virMutex mutex = VIR_MUTEX_INITIALIZER;
 
 static int
 virLXCControllerEventSendExit(virLXCController *ctrl,
@@ -1009,13 +1009,13 @@ static void virLXCControllerSignalChildIO(virNetDaemon *dmn G_GNUC_UNUSED,
     ret = waitpid(-1, &status, WNOHANG);
     VIR_DEBUG("Got sig child %d vs %lld", ret, (long long)ctrl->initpid);
     if (ret == ctrl->initpid) {
-        virMutexLock(&lock);
-        if (WIFSIGNALED(status) &&
-            WTERMSIG(status) == SIGHUP) {
-            VIR_DEBUG("Status indicates reboot");
-            wantReboot = true;
+        VIR_WITH_MUTEX_LOCK_GUARD(&mutex) {
+            if (WIFSIGNALED(status) &&
+                WTERMSIG(status) == SIGHUP) {
+                VIR_DEBUG("Status indicates reboot");
+                wantReboot = true;
+            }
         }
-        virMutexUnlock(&lock);
         virLXCControllerEventSendExit(ctrl, wantReboot ? 1 : 0);
     }
 }
@@ -1129,8 +1129,8 @@ static void virLXCControllerConsoleUpdateWatch(virLXCControllerConsole *console)
 static void virLXCControllerConsoleEPoll(int watch, int fd, int events, void *opaque)
 {
     virLXCControllerConsole *console = opaque;
+    VIR_LOCK_GUARD lock = virLockGuardLock(&mutex);
 
-    virMutexLock(&lock);
     VIR_DEBUG("IO event watch=%d fd=%d events=%d fromHost=%zu fromcont=%zu",
               watch, fd, events,
               console->fromHostLen,
@@ -1146,7 +1146,7 @@ static void virLXCControllerConsoleEPoll(int watch, int fd, int events, void *op
             virReportSystemError(errno, "%s",
                                  _("Unable to wait on epoll"));
             virNetDaemonQuit(console->daemon);
-            goto cleanup;
+            return;
         }
 
         if (ret == 0)
@@ -1168,16 +1168,13 @@ static void virLXCControllerConsoleEPoll(int watch, int fd, int events, void *op
             break;
         }
     }
-
- cleanup:
-    virMutexUnlock(&lock);
 }
 
 static void virLXCControllerConsoleIO(int watch, int fd, int events, void *opaque)
 {
     virLXCControllerConsole *console = opaque;
+    VIR_LOCK_GUARD lock = virLockGuardLock(&mutex);
 
-    virMutexLock(&lock);
     VIR_DEBUG("IO event watch=%d fd=%d events=%d fromHost=%zu fromcont=%zu",
               watch, fd, events,
               console->fromHostLen,
@@ -1251,7 +1248,6 @@ static void virLXCControllerConsoleIO(int watch, int fd, int events, void *opaqu
     }
 
     virLXCControllerConsoleUpdateWatch(console);
-    virMutexUnlock(&lock);
     return;
 
  error:
@@ -1259,7 +1255,6 @@ static void virLXCControllerConsoleIO(int watch, int fd, int events, void *opaqu
     virEventRemoveHandle(console->hostWatch);
     console->contWatch = console->hostWatch = -1;
     virNetDaemonQuit(console->daemon);
-    virMutexUnlock(&lock);
 }
 
 
index 098f57d77690447118c8c3bf40630fdef16b037c..e75a533c701099be0953dee68dd36879f7f9c225 100644 (file)
@@ -260,10 +260,10 @@ static struct fuse_operations lxcProcOper = {
 
 static void lxcFuseDestroy(struct virLXCFuse *fuse)
 {
-    virMutexLock(&fuse->lock);
+    VIR_LOCK_GUARD lock = virLockGuardLock(&fuse->lock);
+
     fuse_unmount(fuse->mountpoint, fuse->ch);
     g_clear_pointer(&fuse->fuse, fuse_destroy);
-    virMutexUnlock(&fuse->lock);
 }
 
 static void lxcFuseRun(void *opaque)
@@ -345,10 +345,10 @@ void lxcFreeFuse(struct virLXCFuse **f)
     if (fuse) {
         /* exit fuse_loop, lxcFuseRun thread may try to destroy
          * fuse->fuse at the same time,so add a lock here. */
-        virMutexLock(&fuse->lock);
-        if (fuse->fuse)
-            fuse_exit(fuse->fuse);
-        virMutexUnlock(&fuse->lock);
+        VIR_WITH_MUTEX_LOCK_GUARD(&fuse->lock) {
+            if (fuse->fuse)
+                fuse_exit(fuse->fuse);
+        }
 
         g_free(fuse->mountpoint);
         g_free(*f);