From nobody Mon Feb 9 12:08:55 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) client-ip=205.139.110.120; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1586527021; cv=none; d=zohomail.com; s=zohoarc; b=CeGyyunlki2QlB6KyZWGU8XYFyrcqcVWbvAci17e0MtfTVxzhNkzBET3x4my3XrvECaeH0k/MMIcQtBYhLk0E3ypL6nO/gsWkkuiby8PEyQarfLd7+v3VXFOUomXvtqCzQL6SoBKFwtzmJPpdvOQounzfrxAbVprd3EZRJcd3K8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586527021; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=qvbLaCaW1H9Pn8huEeQjhEDfA5p5zReQYgS9UJtNFE0=; b=j///2RELu6p9n4CB58Yj8sG2WUGXfTo0eyJhwiYVRSz9ahohAiC/SAwKonZCuDvDvzoKDu/mlJ82iSaQiB7Qd/B1xwilEz2boJgKaXC8qzBXn+M8/fAGuVmAxyJsrTJNcJZ3y+1Q5WCmTXmO/wuK0/IFisvy1pFrxiTDRGfy/VU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.120 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by mx.zohomail.com with SMTPS id 1586527021383555.6964475818581; Fri, 10 Apr 2020 06:57:01 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-194-_Kd3wUZNPU2SO14gBNkzKg-1; Fri, 10 Apr 2020 09:56:57 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 746FF800D5B; Fri, 10 Apr 2020 13:56:51 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 47B861B464; Fri, 10 Apr 2020 13:56:51 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id F1FA093F4B; Fri, 10 Apr 2020 13:56:50 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 03ADuUF9023457 for ; Fri, 10 Apr 2020 09:56:30 -0400 Received: by smtp.corp.redhat.com (Postfix) id A28FA2026FFE; Fri, 10 Apr 2020 13:56:30 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast01.extmail.prod.ext.rdu2.redhat.com [10.11.55.17]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 99C412028CD4 for ; Fri, 10 Apr 2020 13:56:28 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [205.139.110.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 78D7D802D23 for ; Fri, 10 Apr 2020 13:56:28 +0000 (UTC) Received: from mail-wm1-f65.google.com (mail-wm1-f65.google.com [209.85.128.65]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-306-UEHZYbGeOsu998pnlxxO_Q-1; Fri, 10 Apr 2020 09:56:25 -0400 Received: by mail-wm1-f65.google.com with SMTP id a201so2443463wme.1 for ; Fri, 10 Apr 2020 06:56:25 -0700 (PDT) Received: from localhost.localdomain (public-gprs377075.centertel.pl. [37.47.104.52]) by smtp.gmail.com with ESMTPSA id c11sm3066319wrt.24.2020.04.10.06.56.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 10 Apr 2020 06:56:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1586527020; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=qvbLaCaW1H9Pn8huEeQjhEDfA5p5zReQYgS9UJtNFE0=; b=KHk2i+iCSDloUEO0E3fbhODB5LB8EIkcmBV1nyZJZm1Resda9Mvnvzy+q5sKEzv/UYb/Ue wrPJjJNy5vLlQyfHPRxbhr1MKZhxlV/PEIt06yFNo5/JPRaXUtrfj1OXgwmGyrKBilUWLR bhyPA5Ahhcu61A8RwvH8QwGAKYLEYoc= X-MC-Unique: _Kd3wUZNPU2SO14gBNkzKg-1 X-MC-Unique: UEHZYbGeOsu998pnlxxO_Q-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=XFjtNYB1CjiuEiwR7GTpO3oWLNIZFWB3LSZYSS6mdsc=; b=BiFLIkjq741XSdJ6bcaO5P+zqGeKwCuDylezjZkVRZSD9/8f/DLFVQRo8LN1nJrLID frC5ENS4DE3qooWqY8a0lJCIPmFgSEkZXJtd/PbBe63zz5rMSelXzuKvo7KqVhbbzd4m DOSyGbxNa1NSytkRLAvO88tFwY9/Gm3BXcpenKueTqY325+9AXcx3kGb0DpGwp8/plr2 UFb5WP1kCLZalhbXlo1ND4x8dhFRThvbuNZt4ZGGHdNC+aV4Q9PepR4xLrPsNe3TeESA knZpwHDSiE3uQU0bayVij0aNpdbObtxsm+U+oCROw9098f9Jn0IBXE1NP4cHQVpZRXGx QFMw== X-Gm-Message-State: AGi0PuZOSs/aavh8pDRIZfDKlRYe/u+FKVwwNn8kkDJ7Ct4+dV40fD82 k8tkmeTz3+zRWPMJhqO41rTlh6xWnqY= X-Google-Smtp-Source: APiQypIDOY7COhSszmXu50qBphXdp/16G28vcAoz+i4eCnLPLbGZWhQtJhgBTCSUFy+N3tsuQe+aRw== X-Received: by 2002:a7b:ce0b:: with SMTP id m11mr5382899wmc.67.1586526983101; Fri, 10 Apr 2020 06:56:23 -0700 (PDT) From: Rafael Fonseca To: libvir-list@redhat.com Subject: [PATCH 42/43] util: virObjectLockable: convert virMutex to GMutex Date: Fri, 10 Apr 2020 15:55:09 +0200 Message-Id: <20200410135510.2148319-43-r4f4rfs@gmail.com> In-Reply-To: <20200410135510.2148319-1-r4f4rfs@gmail.com> References: <20200410135510.2148319-1-r4f4rfs@gmail.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-MIME-Autoconverted: from quoted-printable to 8bit by lists01.pubmisc.prod.ext.phx2.redhat.com id 03ADuUF9023457 X-loop: libvir-list@redhat.com Cc: Rafael Fonseca X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Because virCond usage is connected to virMutex, this patch also converts virCond to GCond. An important note to make here: GMutex doesn't like when you try to clear a lock that's still locked. So I had to hunt the few cases where that happened and add an explicit virObjectUnlock call before unreffing the object. Signed-off-by: Rafael Fonseca --- src/conf/domain_conf.c | 27 ++------- src/conf/domain_conf.h | 5 +- src/libxl/libxl_domain.c | 18 ++---- src/libxl/libxl_domain.h | 2 +- src/lxc/lxc_domain.c | 18 ++---- src/lxc/lxc_domain.h | 2 +- src/node_device/node_device_udev.c | 22 +++---- src/qemu/qemu_agent.c | 50 +++++++--------- src/qemu/qemu_domain.c | 95 ++++++++++++++---------------- src/qemu/qemu_domain.h | 4 +- src/qemu/qemu_hotplug.c | 28 +++------ src/qemu/qemu_hotplug.h | 2 +- src/qemu/qemu_monitor.c | 27 ++++----- src/rpc/virnetclient.c | 25 +++----- src/util/virfdstream.c | 26 +++----- src/util/virobject.c | 13 ++-- src/util/virobject.h | 2 +- src/vz/vz_utils.c | 41 ++++--------- src/vz/vz_utils.h | 6 +- tests/qemuhotplugmock.c | 6 +- tests/qemuhotplugtest.c | 2 + tests/qemumonitortestutils.c | 5 ++ tests/qemusecuritytest.c | 10 +++- tests/qemuxml2argvtest.c | 1 + tools/virsh-console.c | 23 ++------ 25 files changed, 172 insertions(+), 288 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 639d471424..d4629a936a 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -3535,7 +3535,7 @@ static void virDomainObjDispose(void *obj) virDomainObjPtr dom =3D obj; =20 VIR_DEBUG("obj=3D%p", dom); - virCondDestroy(&dom->cond); + g_cond_clear(&dom->cond); virDomainDefFree(dom->def); virDomainDefFree(dom->newDef); =20 @@ -3557,11 +3557,7 @@ virDomainObjNew(virDomainXMLOptionPtr xmlopt) if (!(domain =3D virObjectLockableNew(virDomainObjClass))) return NULL; =20 - if (virCondInit(&domain->cond) < 0) { - virReportSystemError(errno, "%s", - _("failed to initialize domain condition")); - goto error; - } + g_cond_init(&domain->cond); =20 if (xmlopt->privateData.alloc) { domain->privateData =3D (xmlopt->privateData.alloc)(xmlopt->config= .priv); @@ -3670,18 +3666,14 @@ virDomainObjEndAPI(virDomainObjPtr *vm) void virDomainObjBroadcast(virDomainObjPtr vm) { - virCondBroadcast(&vm->cond); + g_cond_broadcast(&vm->cond); } =20 =20 int virDomainObjWait(virDomainObjPtr vm) { - if (virCondWait(&vm->cond, &vm->parent.lock) < 0) { - virReportSystemError(errno, "%s", - _("failed to wait for domain condition")); - return -1; - } + g_cond_wait(&vm->cond, &vm->parent.lock); =20 if (!virDomainObjIsActive(vm)) { virReportError(VIR_ERR_OPERATION_FAILED, "%s", @@ -3697,22 +3689,15 @@ virDomainObjWait(virDomainObjPtr vm) * Waits for domain condition to be triggered for a specific period of tim= e. * * Returns: - * -1 in case of error * 0 on success * 1 on timeout */ int virDomainObjWaitUntil(virDomainObjPtr vm, - unsigned long long whenms) + gint64 whenms) { - if (virCondWaitUntil(&vm->cond, &vm->parent.lock, whenms) < 0) { - if (errno !=3D ETIMEDOUT) { - virReportSystemError(errno, "%s", - _("failed to wait for domain condition")); - return -1; - } + if (!g_cond_wait_until(&vm->cond, &vm->parent.lock, whenms)) return 1; - } return 0; } =20 diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 9310fab169..647baf40b2 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2630,7 +2630,7 @@ struct _virDomainStateReason { =20 struct _virDomainObj { virObjectLockable parent; - virCond cond; + GCond cond; =20 pid_t pid; virDomainStateReason state; @@ -2892,8 +2892,7 @@ bool virDomainObjTaint(virDomainObjPtr obj, =20 void virDomainObjBroadcast(virDomainObjPtr vm); int virDomainObjWait(virDomainObjPtr vm); -int virDomainObjWaitUntil(virDomainObjPtr vm, - unsigned long long whenms); +int virDomainObjWaitUntil(virDomainObjPtr vm, gint64 whenms); =20 void virDomainPanicDefFree(virDomainPanicDefPtr panic); void virDomainResourceDefFree(virDomainResourceDefPtr resource); diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index cc53a765e1..671e49670b 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -69,8 +69,7 @@ libxlDomainObjInitJob(libxlDomainObjPrivatePtr priv) { memset(&priv->job, 0, sizeof(priv->job)); =20 - if (virCondInit(&priv->job.cond) < 0) - return -1; + g_cond_init(&priv->job.cond); =20 if (VIR_ALLOC(priv->job.current) < 0) return -1; @@ -90,12 +89,12 @@ libxlDomainObjResetJob(libxlDomainObjPrivatePtr priv) static void libxlDomainObjFreeJob(libxlDomainObjPrivatePtr priv) { - ignore_value(virCondDestroy(&priv->job.cond)); + g_cond_clear(&priv->job.cond); VIR_FREE(priv->job.current); } =20 /* Give up waiting for mutex after 30 seconds */ -#define LIBXL_JOB_WAIT_TIME (1000ull * 30) +#define LIBXL_JOB_WAIT_TIME (30 * G_TIME_SPAN_SECOND) =20 /* * obj must be locked before calling, libxlDriverPrivatePtr must NOT be lo= cked @@ -112,17 +111,12 @@ libxlDomainObjBeginJob(libxlDriverPrivatePtr driver G= _GNUC_UNUSED, enum libxlDomainJob job) { libxlDomainObjPrivatePtr priv =3D obj->privateData; - unsigned long long now; - unsigned long long then; - - if (virTimeMillisNow(&now) < 0) - return -1; - then =3D now + LIBXL_JOB_WAIT_TIME; + gint64 then =3D g_get_monotonic_time() + LIBXL_JOB_WAIT_TIME; =20 while (priv->job.active) { VIR_DEBUG("Wait normal job condition for starting job: %s", libxlDomainJobTypeToString(job)); - if (virCondWaitUntil(&priv->job.cond, &obj->parent.lock, then) < 0) + if (!g_cond_wait_until(&priv->job.cond, &obj->parent.lock, then)) goto error; } =20 @@ -175,7 +169,7 @@ libxlDomainObjEndJob(libxlDriverPrivatePtr driver G_GNU= C_UNUSED, libxlDomainJobTypeToString(job)); =20 libxlDomainObjResetJob(priv); - virCondSignal(&priv->job.cond); + g_cond_signal(&priv->job.cond); } =20 int diff --git a/src/libxl/libxl_domain.h b/src/libxl/libxl_domain.h index 7e28093722..5f04f3aacb 100644 --- a/src/libxl/libxl_domain.h +++ b/src/libxl/libxl_domain.h @@ -47,7 +47,7 @@ VIR_ENUM_DECL(libxlDomainJob); =20 =20 struct libxlDomainJobObj { - virCond cond; /* Use to coordinate jobs */ + GCond cond; /* Use to coordinate jobs */ enum libxlDomainJob active; /* Currently running job */ int owner; /* Thread which set current job */ unsigned long long started; /* When the job started */ diff --git a/src/lxc/lxc_domain.c b/src/lxc/lxc_domain.c index 59f803837a..a09788dd12 100644 --- a/src/lxc/lxc_domain.c +++ b/src/lxc/lxc_domain.c @@ -50,8 +50,7 @@ virLXCDomainObjInitJob(virLXCDomainObjPrivatePtr priv) { memset(&priv->job, 0, sizeof(priv->job)); =20 - if (virCondInit(&priv->job.cond) < 0) - return -1; + g_cond_init(&priv->job.cond); =20 return 0; } @@ -68,11 +67,11 @@ virLXCDomainObjResetJob(virLXCDomainObjPrivatePtr priv) static void virLXCDomainObjFreeJob(virLXCDomainObjPrivatePtr priv) { - ignore_value(virCondDestroy(&priv->job.cond)); + g_cond_clear(&priv->job.cond); } =20 /* Give up waiting for mutex after 30 seconds */ -#define LXC_JOB_WAIT_TIME (1000ull * 30) +#define LXC_JOB_WAIT_TIME (30 * G_TIME_SPAN_SECOND) =20 /* * obj must be locked before calling, virLXCDriverPtr must NOT be locked @@ -89,17 +88,12 @@ virLXCDomainObjBeginJob(virLXCDriverPtr driver G_GNUC_U= NUSED, enum virLXCDomainJob job) { virLXCDomainObjPrivatePtr priv =3D obj->privateData; - unsigned long long now; - unsigned long long then; - - if (virTimeMillisNow(&now) < 0) - return -1; - then =3D now + LXC_JOB_WAIT_TIME; + gint64 then =3D g_get_monotonic_time() + LXC_JOB_WAIT_TIME; =20 while (priv->job.active) { VIR_DEBUG("Wait normal job condition for starting job: %s", virLXCDomainJobTypeToString(job)); - if (virCondWaitUntil(&priv->job.cond, &obj->parent.lock, then) < 0) + if (!g_cond_wait_until(&priv->job.cond, &obj->parent.lock, then)) goto error; } =20 @@ -146,7 +140,7 @@ virLXCDomainObjEndJob(virLXCDriverPtr driver G_GNUC_UNU= SED, virLXCDomainJobTypeToString(job)); =20 virLXCDomainObjResetJob(priv); - virCondSignal(&priv->job.cond); + g_cond_signal(&priv->job.cond); } =20 =20 diff --git a/src/lxc/lxc_domain.h b/src/lxc/lxc_domain.h index 319f83338f..dfc16fae2b 100644 --- a/src/lxc/lxc_domain.h +++ b/src/lxc/lxc_domain.h @@ -69,7 +69,7 @@ VIR_ENUM_DECL(virLXCDomainJob); =20 =20 struct virLXCDomainJobObj { - virCond cond; /* Use to coordinate jobs */ + GCond cond; /* Use to coordinate jobs */ enum virLXCDomainJob active; /* Currently running job */ int owner; /* Thread which set current job */ }; diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_devi= ce_udev.c index 433de0aae0..22106c3f30 100644 --- a/src/node_device/node_device_udev.c +++ b/src/node_device/node_device_udev.c @@ -63,7 +63,7 @@ struct _udevEventData { =20 /* Thread data */ virThread th; - virCond threadCond; + GCond threadCond; bool threadQuit; bool dataReady; }; @@ -86,7 +86,7 @@ udevEventDataDispose(void *obj) udev_monitor_unref(priv->udev_monitor); udev_unref(udev); =20 - virCondDestroy(&priv->threadCond); + g_cond_clear(&priv->threadCond); } =20 =20 @@ -112,10 +112,7 @@ udevEventDataNew(void) if (!(ret =3D virObjectLockableNew(udevEventDataClass))) return NULL; =20 - if (virCondInit(&ret->threadCond) < 0) { - virObjectUnref(ret); - return NULL; - } + g_cond_init(&ret->threadCond); =20 ret->watch =3D -1; return ret; @@ -1463,7 +1460,7 @@ nodeStateCleanup(void) if (priv) { virObjectLock(priv); priv->threadQuit =3D true; - virCondSignal(&priv->threadCond); + g_cond_signal(&priv->threadCond); virObjectUnlock(priv); virThreadJoin(&priv->th); } @@ -1563,12 +1560,7 @@ udevEventHandleThread(void *opaque G_GNUC_UNUSED) while (1) { virObjectLock(priv); while (!priv->dataReady && !priv->threadQuit) { - if (virCondWait(&priv->threadCond, &priv->parent.lock)) { - virReportSystemError(errno, "%s", - _("handler failed to wait on conditio= n")); - virObjectUnlock(priv); - return; - } + g_cond_wait(&priv->threadCond, &priv->parent.lock); } =20 if (priv->threadQuit) { @@ -1635,7 +1627,7 @@ udevEventHandleCallback(int watch G_GNUC_UNUSED, else priv->dataReady =3D true; =20 - virCondSignal(&priv->threadCond); + g_cond_signal(&priv->threadCond); virObjectUnlock(priv); } =20 @@ -1757,7 +1749,7 @@ nodeStateInitializeEnumerate(void *opaque) ignore_value(virEventRemoveHandle(priv->watch)); priv->watch =3D -1; priv->threadQuit =3D true; - virCondSignal(&priv->threadCond); + g_cond_signal(&priv->threadCond); virObjectUnlock(priv); } =20 diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c index d7fcc869c6..597df38752 100644 --- a/src/qemu/qemu_agent.c +++ b/src/qemu/qemu_agent.c @@ -99,7 +99,7 @@ struct _qemuAgentMessage { struct _qemuAgent { virObjectLockable parent; =20 - virCond notify; + GCond notify; =20 int fd; =20 @@ -176,7 +176,7 @@ static void qemuAgentDispose(void *obj) VIR_DEBUG("agent=3D%p", agent); if (agent->cb && agent->cb->destroy) (agent->cb->destroy)(agent, agent->vm); - virCondDestroy(&agent->notify); + g_cond_clear(&agent->notify); VIR_FREE(agent->buffer); g_main_context_unref(agent->context); virResetError(&agent->lastError); @@ -403,7 +403,7 @@ qemuAgentIOProcess(qemuAgentPtr agent) VIR_DEBUG("Process done %zu used %d", agent->bufferOffset, len); #endif if (msg && msg->finished) - virCondBroadcast(&agent->notify); + g_cond_broadcast(&agent->notify); return len; } =20 @@ -628,7 +628,7 @@ qemuAgentIO(GSocket *socket G_GNUC_UNUSED, * then wakeup that waiter */ if (agent->msg && !agent->msg->finished) { agent->msg->finished =3D 1; - virCondSignal(&agent->notify); + g_cond_signal(&agent->notify); } } =20 @@ -643,7 +643,7 @@ qemuAgentIO(GSocket *socket G_GNUC_UNUSED, virDomainObjPtr vm =3D agent->vm; =20 /* Make sure anyone waiting wakes up now */ - virCondSignal(&agent->notify); + g_cond_signal(&agent->notify); virObjectUnlock(agent); virObjectUnref(agent); VIR_DEBUG("Triggering EOF callback"); @@ -654,7 +654,7 @@ qemuAgentIO(GSocket *socket G_GNUC_UNUSED, virDomainObjPtr vm =3D agent->vm; =20 /* Make sure anyone waiting wakes up now */ - virCondSignal(&agent->notify); + g_cond_signal(&agent->notify); virObjectUnlock(agent); virObjectUnref(agent); VIR_DEBUG("Triggering error callback"); @@ -692,12 +692,8 @@ qemuAgentOpen(virDomainObjPtr vm, =20 agent->timeout =3D QEMU_DOMAIN_PRIVATE(vm)->agentTimeout; agent->fd =3D -1; - if (virCondInit(&agent->notify) < 0) { - virReportSystemError(errno, "%s", - _("cannot initialize agent condition")); - virObjectUnref(agent); - return NULL; - } + g_cond_init(&agent->notify); + agent->vm =3D vm; agent->cb =3D cb; agent->singleSync =3D singleSync; @@ -752,7 +748,7 @@ qemuAgentNotifyCloseLocked(qemuAgentPtr agent) * wake him up. No message will arrive anyway. */ if (agent->msg && !agent->msg->finished) { agent->msg->finished =3D 1; - virCondSignal(&agent->notify); + g_cond_signal(&agent->notify); } } } @@ -820,7 +816,7 @@ static int qemuAgentSend(qemuAgentPtr agent, int seconds) { int ret =3D -1; - unsigned long long then =3D 0; + gint64 then =3D 0; =20 /* Check whether qemu quit unexpectedly */ if (agent->lastError.code !=3D VIR_ERR_OK) { @@ -831,29 +827,23 @@ static int qemuAgentSend(qemuAgentPtr agent, } =20 if (seconds > VIR_DOMAIN_QEMU_AGENT_COMMAND_BLOCK) { - unsigned long long now; - if (virTimeMillisNow(&now) < 0) - return -1; if (seconds =3D=3D VIR_DOMAIN_QEMU_AGENT_COMMAND_DEFAULT) seconds =3D QEMU_AGENT_WAIT_TIME; - then =3D now + seconds * 1000ull; + then =3D g_get_monotonic_time() + seconds * G_TIME_SPAN_SECOND; } =20 agent->msg =3D msg; qemuAgentUpdateWatch(agent); =20 while (!agent->msg->finished) { - if ((then && virCondWaitUntil(&agent->notify, &agent->parent.lock,= then) < 0) || - (!then && virCondWait(&agent->notify, &agent->parent.lock) < 0= )) { - if (errno =3D=3D ETIMEDOUT) { - virReportError(VIR_ERR_AGENT_UNRESPONSIVE, "%s", - _("Guest agent not available for now")); - ret =3D -2; - } else { - virReportSystemError(errno, "%s", - _("Unable to wait on agent socket " - "condition")); - } + if (!then) { + g_cond_wait(&agent->notify, &agent->parent.lock); + } else if (!g_cond_wait_until(&agent->notify, + &agent->parent.lock, + then)) { + virReportError(VIR_ERR_AGENT_UNRESPONSIVE, "%s", + _("Guest agent not available for now")); + ret =3D -2; agent->inSync =3D false; goto cleanup; } @@ -1210,7 +1200,7 @@ void qemuAgentNotifyEvent(qemuAgentPtr agent, /* somebody waiting for this event, wake him up. */ if (agent->msg && !agent->msg->finished) { agent->msg->finished =3D 1; - virCondSignal(&agent->notify); + g_cond_signal(&agent->notify); } } =20 diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 91e234d644..ac02f54cb8 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -334,13 +334,8 @@ qemuDomainObjInitJob(qemuDomainObjPrivatePtr priv) { memset(&priv->job, 0, sizeof(priv->job)); =20 - if (virCondInit(&priv->job.cond) < 0) - return -1; - - if (virCondInit(&priv->job.asyncCond) < 0) { - virCondDestroy(&priv->job.cond); - return -1; - } + g_cond_init(&priv->job.cond); + g_cond_init(&priv->job.asyncCond); =20 return 0; } @@ -417,8 +412,8 @@ qemuDomainObjFreeJob(qemuDomainObjPrivatePtr priv) qemuDomainObjResetAsyncJob(priv); VIR_FREE(priv->job.current); VIR_FREE(priv->job.completed); - virCondDestroy(&priv->job.cond); - virCondDestroy(&priv->job.asyncCond); + g_cond_clear(&priv->job.cond); + g_cond_clear(&priv->job.asyncCond); } =20 static bool @@ -6181,7 +6176,7 @@ qemuDomainObjCanSetJob(qemuDomainObjPrivatePtr priv, } =20 /* Give up waiting for mutex after 30 seconds */ -#define QEMU_JOB_WAIT_TIME (1000ull * 30) +#define QEMU_JOB_WAIT_TIME (30 * G_TIME_SPAN_SECOND) =20 /** * qemuDomainObjBeginJobInternal: @@ -6214,17 +6209,16 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driv= er, bool nowait) { qemuDomainObjPrivatePtr priv =3D obj->privateData; - unsigned long long now; - unsigned long long then; + gint64 now, then =3D 0; bool nested =3D job =3D=3D QEMU_JOB_ASYNC_NESTED; bool async =3D job =3D=3D QEMU_JOB_ASYNC; g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); const char *blocker =3D NULL; const char *agentBlocker =3D NULL; int ret =3D -1; - unsigned long long duration =3D 0; - unsigned long long agentDuration =3D 0; - unsigned long long asyncDuration =3D 0; + gint64 duration =3D 0; + gint64 agentDuration =3D 0; + gint64 asyncDuration =3D 0; =20 VIR_DEBUG("Starting job: job=3D%s agentJob=3D%s asyncJob=3D%s " "(vm=3D%p name=3D%s, current job=3D%s agentJob=3D%s async=3D= %s)", @@ -6236,11 +6230,8 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr drive= r, qemuDomainAgentJobTypeToString(priv->job.agentActive), qemuDomainAsyncJobTypeToString(priv->job.asyncJob)); =20 - if (virTimeMillisNow(&now) < 0) - return -1; - priv->jobs_queued++; - then =3D now + QEMU_JOB_WAIT_TIME; + then =3D g_get_monotonic_time() + QEMU_JOB_WAIT_TIME; =20 retry: if ((!async && job !=3D QEMU_JOB_DESTROY) && @@ -6254,7 +6245,7 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver, goto cleanup; =20 VIR_DEBUG("Waiting for async job (vm=3D%p name=3D%s)", obj, obj->d= ef->name); - if (virCondWaitUntil(&priv->job.asyncCond, &obj->parent.lock, then= ) < 0) + if (!g_cond_wait_until(&priv->job.asyncCond, &obj->parent.lock, th= en)) goto error; } =20 @@ -6263,7 +6254,7 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver, goto cleanup; =20 VIR_DEBUG("Waiting for job (vm=3D%p name=3D%s)", obj, obj->def->na= me); - if (virCondWaitUntil(&priv->job.cond, &obj->parent.lock, then) < 0) + if (!g_cond_wait_until(&priv->job.cond, &obj->parent.lock, then)) goto error; } =20 @@ -6272,7 +6263,7 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver, if (!nested && !qemuDomainNestedJobAllowed(priv, job)) goto retry; =20 - ignore_value(virTimeMillisNow(&now)); + now =3D g_get_monotonic_time(); =20 if (job) { qemuDomainObjResetJob(priv); @@ -6322,7 +6313,7 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver, return 0; =20 error: - ignore_value(virTimeMillisNow(&now)); + now =3D g_get_monotonic_time(); if (priv->job.active && priv->job.started) duration =3D now - priv->job.started; if (priv->job.agentActive && priv->job.agentStarted) @@ -6333,7 +6324,7 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver, VIR_WARN("Cannot start job (%s, %s, %s) for domain %s; " "current job is (%s, %s, %s) " "owned by (%llu %s, %llu %s, %llu %s (flags=3D0x%lx)) " - "for (%llus, %llus, %llus)", + "for (%"G_GINT64_FORMAT"s, %"G_GINT64_FORMAT"s, %"G_GINT64_FO= RMAT"s)", qemuDomainJobTypeToString(job), qemuDomainAgentJobTypeToString(agentJob), qemuDomainAsyncJobTypeToString(asyncJob), @@ -6345,7 +6336,9 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver, priv->job.agentOwner, NULLSTR(priv->job.agentOwnerAPI), priv->job.asyncOwner, NULLSTR(priv->job.asyncOwnerAPI), priv->job.apiFlags, - duration / 1000, agentDuration / 1000, asyncDuration / 1000); + duration / G_TIME_SPAN_MILLISECOND, + agentDuration / G_TIME_SPAN_MILLISECOND, + asyncDuration / G_TIME_SPAN_MILLISECOND); =20 if (job) { if (nested || qemuDomainNestedJobAllowed(priv, job)) @@ -6357,29 +6350,8 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr drive= r, if (agentJob) agentBlocker =3D priv->job.agentOwnerAPI; =20 - if (errno =3D=3D ETIMEDOUT) { - if (blocker && agentBlocker) { - virReportError(VIR_ERR_OPERATION_TIMEOUT, - _("cannot acquire state change " - "lock (held by monitor=3D%s agent=3D%s)"), - blocker, agentBlocker); - } else if (blocker) { - virReportError(VIR_ERR_OPERATION_TIMEOUT, - _("cannot acquire state change " - "lock (held by monitor=3D%s)"), - blocker); - } else if (agentBlocker) { - virReportError(VIR_ERR_OPERATION_TIMEOUT, - _("cannot acquire state change " - "lock (held by agent=3D%s)"), - agentBlocker); - } else { - virReportError(VIR_ERR_OPERATION_TIMEOUT, "%s", - _("cannot acquire state change lock")); - } - ret =3D -2; - } else if (cfg->maxQueuedJobs && - priv->jobs_queued > cfg->maxQueuedJobs) { + if (cfg->maxQueuedJobs && + priv->jobs_queued > cfg->maxQueuedJobs) { if (blocker && agentBlocker) { virReportError(VIR_ERR_OPERATION_FAILED, _("cannot acquire state change " @@ -6405,7 +6377,26 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr drive= r, } ret =3D -2; } else { - virReportSystemError(errno, "%s", _("cannot acquire job mutex")); + if (blocker && agentBlocker) { + virReportError(VIR_ERR_OPERATION_TIMEOUT, + _("cannot acquire state change " + "lock (held by monitor=3D%s agent=3D%s)"), + blocker, agentBlocker); + } else if (blocker) { + virReportError(VIR_ERR_OPERATION_TIMEOUT, + _("cannot acquire state change " + "lock (held by monitor=3D%s)"), + blocker); + } else if (agentBlocker) { + virReportError(VIR_ERR_OPERATION_TIMEOUT, + _("cannot acquire state change " + "lock (held by agent=3D%s)"), + agentBlocker); + } else { + virReportError(VIR_ERR_OPERATION_TIMEOUT, "%s", + _("cannot acquire state change lock")); + } + ret =3D -2; } =20 cleanup: @@ -6542,7 +6533,7 @@ qemuDomainObjEndJob(virQEMUDriverPtr driver, virDomai= nObjPtr obj) qemuDomainObjSaveStatus(driver, obj); /* We indeed need to wake up ALL threads waiting because * grabbing a job requires checking more variables. */ - virCondBroadcast(&priv->job.cond); + g_cond_broadcast(&priv->job.cond); } =20 void @@ -6561,7 +6552,7 @@ qemuDomainObjEndAgentJob(virDomainObjPtr obj) qemuDomainObjResetAgentJob(priv); /* We indeed need to wake up ALL threads waiting because * grabbing a job requires checking more variables. */ - virCondBroadcast(&priv->job.cond); + g_cond_broadcast(&priv->job.cond); } =20 void @@ -6577,7 +6568,7 @@ qemuDomainObjEndAsyncJob(virQEMUDriverPtr driver, vir= DomainObjPtr obj) =20 qemuDomainObjResetAsyncJob(priv); qemuDomainObjSaveStatus(driver, obj); - virCondBroadcast(&priv->job.asyncCond); + g_cond_broadcast(&priv->job.asyncCond); } =20 void diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index cf19f4d101..0d1bafac94 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -180,7 +180,7 @@ struct _qemuDomainJobInfo { typedef struct _qemuDomainJobObj qemuDomainJobObj; typedef qemuDomainJobObj *qemuDomainJobObjPtr; struct _qemuDomainJobObj { - virCond cond; /* Use to coordinate jobs */ + GCond cond; /* Use to coordinate jobs */ =20 /* The following members are for QEMU_JOB_* */ qemuDomainJob active; /* Currently running job */ @@ -195,7 +195,7 @@ struct _qemuDomainJobObj { unsigned long long agentStarted; /* When the current agent job star= ted */ =20 /* The following members are for QEMU_ASYNC_JOB_* */ - virCond asyncCond; /* Use to coordinate with async jo= bs */ + GCond asyncCond; /* Use to coordinate with async jo= bs */ qemuDomainAsyncJob asyncJob; /* Currently active async job */ unsigned long long asyncOwner; /* Thread which set current async = job */ const char *asyncOwnerAPI; /* The API which owns the async jo= b */ diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 14654a17d7..0e677bdce9 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -59,14 +59,14 @@ =20 VIR_LOG_INIT("qemu.qemu_hotplug"); =20 -#define CHANGE_MEDIA_TIMEOUT 5000 +#define CHANGE_MEDIA_TIMEOUT (5 * G_TIME_SPAN_MILLISECOND) =20 /* Timeout in miliseconds for device removal. PPC64 domains * can experience a bigger delay in unplug operations during * heavy guest activity (vcpu being the most notable case), thus * the timeout for PPC64 is also bigger. */ -#define QEMU_UNPLUG_TIMEOUT 1000ull * 5 -#define QEMU_UNPLUG_TIMEOUT_PPC64 1000ull * 10 +#define QEMU_UNPLUG_TIMEOUT (5 * G_TIME_SPAN_MILLISECOND) +#define QEMU_UNPLUG_TIMEOUT_PPC64 (10 * G_TIME_SPAN_MILLISECOND) =20 =20 static void @@ -201,15 +201,11 @@ static int qemuHotplugWaitForTrayEject(virDomainObjPtr vm, virDomainDiskDefPtr disk) { - unsigned long long now; + gint64 now =3D g_get_monotonic_time(); int rc; =20 - if (virTimeMillisNow(&now) < 0) - return -1; - while (disk->tray_status !=3D VIR_DOMAIN_DISK_TRAY_OPEN) { - if ((rc =3D virDomainObjWaitUntil(vm, now + CHANGE_MEDIA_TIMEOUT))= < 0) - return -1; + rc =3D virDomainObjWaitUntil(vm, now + CHANGE_MEDIA_TIMEOUT); =20 if (rc > 0) { /* the caller called qemuMonitorEjectMedia which usually repor= ts an @@ -5122,7 +5118,7 @@ qemuDomainResetDeviceRemoval(virDomainObjPtr vm) } =20 =20 -unsigned long long +gint64 qemuDomainGetUnplugTimeout(virDomainObjPtr vm) { if (qemuDomainIsPSeries(vm->def)) @@ -5145,22 +5141,14 @@ static int qemuDomainWaitForDeviceRemoval(virDomainObjPtr vm) { qemuDomainObjPrivatePtr priv =3D vm->privateData; - unsigned long long until; + gint64 until; int rc; =20 - if (virTimeMillisNow(&until) < 0) - return 1; - until +=3D qemuDomainGetUnplugTimeout(vm); + until =3D g_get_monotonic_time() + qemuDomainGetUnplugTimeout(vm); =20 while (priv->unplug.alias) { if ((rc =3D virDomainObjWaitUntil(vm, until)) =3D=3D 1) return 0; - - if (rc < 0) { - VIR_WARN("Failed to wait on unplug condition for domain '%s' " - "device '%s'", vm->def->name, priv->unplug.alias); - return 1; - } } =20 if (priv->unplug.status =3D=3D QEMU_DOMAIN_UNPLUGGING_DEVICE_STATUS_GU= EST_REJECTED) { diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h index 4a49e04a15..f610d7c70f 100644 --- a/src/qemu/qemu_hotplug.h +++ b/src/qemu/qemu_hotplug.h @@ -151,7 +151,7 @@ int qemuDomainSetVcpuInternal(virQEMUDriverPtr driver, virBitmapPtr vcpus, bool state); =20 -unsigned long long qemuDomainGetUnplugTimeout(virDomainObjPtr vm); +gint64 qemuDomainGetUnplugTimeout(virDomainObjPtr vm); =20 int qemuHotplugAttachDBusVMState(virQEMUDriverPtr driver, virDomainObjPtr vm, diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index a62fed845e..4537b3e562 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -70,7 +70,7 @@ VIR_LOG_INIT("qemu.qemu_monitor"); struct _qemuMonitor { virObjectLockable parent; =20 - virCond notify; + GCond notify; =20 int fd; =20 @@ -228,7 +228,7 @@ qemuMonitorDispose(void *obj) =20 g_main_context_unref(mon->context); virResetError(&mon->lastError); - virCondDestroy(&mon->notify); + g_cond_clear(&mon->notify); VIR_FREE(mon->buffer); virJSONValueFree(mon->options); VIR_FREE(mon->balloonpath); @@ -357,7 +357,7 @@ qemuMonitorIOProcess(qemuMonitorPtr mon) * while dealing with qemu event, mon->msg could be changed which * means the above 'msg' may be invalid, thus we use 'mon->msg' here */ if (mon->msg && mon->msg->finished) - virCondBroadcast(&mon->notify); + g_cond_broadcast(&mon->notify); return len; } =20 @@ -618,7 +618,7 @@ qemuMonitorIO(GSocket *socket G_GNUC_UNUSED, * then wakeup that waiter */ if (mon->msg && !mon->msg->finished) { mon->msg->finished =3D 1; - virCondSignal(&mon->notify); + g_cond_signal(&mon->notify); } } =20 @@ -632,7 +632,7 @@ qemuMonitorIO(GSocket *socket G_GNUC_UNUSED, virDomainObjPtr vm =3D mon->vm; =20 /* Make sure anyone waiting wakes up now */ - virCondSignal(&mon->notify); + g_cond_signal(&mon->notify); virObjectUnlock(mon); VIR_DEBUG("Triggering EOF callback"); (eofNotify)(mon, vm, mon->callbackOpaque); @@ -642,7 +642,7 @@ qemuMonitorIO(GSocket *socket G_GNUC_UNUSED, virDomainObjPtr vm =3D mon->vm; =20 /* Make sure anyone waiting wakes up now */ - virCondSignal(&mon->notify); + g_cond_signal(&mon->notify); virObjectUnlock(mon); VIR_DEBUG("Triggering error callback"); (errorNotify)(mon, vm, mon->callbackOpaque); @@ -683,11 +683,8 @@ qemuMonitorOpenInternal(virDomainObjPtr vm, if (!(mon =3D virObjectLockableNew(qemuMonitorClass))) return NULL; =20 - if (virCondInit(&mon->notify) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("cannot initialize monitor condition")); - goto cleanup; - } + g_cond_init(&mon->notify); + mon->fd =3D fd; mon->context =3D g_main_context_ref(context); mon->vm =3D virObjectRef(vm); @@ -881,7 +878,7 @@ qemuMonitorClose(qemuMonitorPtr mon) virResetLastError(); } mon->msg->finished =3D 1; - virCondSignal(&mon->notify); + g_cond_signal(&mon->notify); } =20 /* Propagate existing monitor error in case the current thread has no @@ -935,11 +932,7 @@ qemuMonitorSend(qemuMonitorPtr mon, mon, mon->msg->txBuffer, mon->msg->txFD); =20 while (!mon->msg->finished) { - if (virCondWait(&mon->notify, &mon->parent.lock) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Unable to wait on monitor condition")); - goto cleanup; - } + g_cond_wait(&mon->notify, &mon->parent.lock); } =20 if (mon->lastError.code !=3D VIR_ERR_OK) { diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c index 1c5bef86a1..28192c7046 100644 --- a/src/rpc/virnetclient.c +++ b/src/rpc/virnetclient.c @@ -58,7 +58,7 @@ struct _virNetClientCall { bool nonBlock; bool haveThread; =20 - virCond cond; + GCond cond; =20 virNetClientCallPtr next; }; @@ -1513,12 +1513,12 @@ static bool virNetClientIOEventLoopRemoveDone(virNe= tClientCallPtr call, */ if (call->haveThread) { VIR_DEBUG("Waking up sleep %p", call); - virCondSignal(&call->cond); + g_cond_signal(&call->cond); } else { VIR_DEBUG("Removing completed call %p", call); if (call->expectReply) VIR_WARN("Got a call expecting a reply but without a waiting t= hread"); - virCondDestroy(&call->cond); + g_cond_clear(&call->cond); VIR_FREE(call->msg); VIR_FREE(call); } @@ -1545,7 +1545,7 @@ virNetClientIOEventLoopRemoveAll(virNetClientCallPtr = call, return false; =20 VIR_DEBUG("Removing call %p", call); - virCondDestroy(&call->cond); + g_cond_clear(&call->cond); VIR_FREE(call->msg); VIR_FREE(call); return true; @@ -1563,7 +1563,7 @@ virNetClientIOEventLoopPassTheBuck(virNetClientPtr cl= ient, while (tmp) { if (tmp !=3D thiscall && tmp->haveThread) { VIR_DEBUG("Passing the buck to %p", tmp); - virCondSignal(&tmp->cond); + g_cond_signal(&tmp->cond); return; } tmp =3D tmp->next; @@ -1897,12 +1897,7 @@ static int virNetClientIO(virNetClientPtr client, VIR_DEBUG("Going to sleep head=3D%p call=3D%p", client->waitDispatch, thiscall); /* Go to sleep while other thread is working... */ - if (virCondWait(&thiscall->cond, &client->parent.lock) < 0) { - virNetClientCallRemove(&client->waitDispatch, thiscall); - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("failed to wait on condition")); - return -1; - } + g_cond_wait(&thiscall->cond, &client->parent.lock); =20 VIR_DEBUG("Woken up from sleep head=3D%p call=3D%p", client->waitDispatch, thiscall); @@ -2042,11 +2037,7 @@ virNetClientCallNew(virNetMessagePtr msg, if (VIR_ALLOC(call) < 0) goto error; =20 - if (virCondInit(&call->cond) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("cannot initialize condition variable")); - goto error; - } + g_cond_init(&call->cond); =20 msg->donefds =3D 0; if (msg->bufferLength) @@ -2124,7 +2115,7 @@ static int virNetClientSendInternal(virNetClientPtr c= lient, if (ret =3D=3D 1) return 1; =20 - virCondDestroy(&call->cond); + g_cond_clear(&call->cond); VIR_FREE(call); return ret; } diff --git a/src/util/virfdstream.c b/src/util/virfdstream.c index 111e451f8c..26619472da 100644 --- a/src/util/virfdstream.c +++ b/src/util/virfdstream.c @@ -103,7 +103,7 @@ struct virFDStreamData { =20 /* Thread data */ virThreadPtr thread; - virCond threadCond; + GCond threadCond; virErrorPtr threadErr; bool threadQuit; bool threadAbort; @@ -149,7 +149,7 @@ virFDStreamMsgQueuePush(virFDStreamDataPtr fdst, tmp =3D &(*tmp)->next; =20 *tmp =3D msg; - virCondSignal(&fdst->threadCond); + g_cond_signal(&fdst->threadCond); =20 if (safewrite(fd, &c, sizeof(c)) !=3D sizeof(c)) { virReportSystemError(errno, @@ -175,7 +175,7 @@ virFDStreamMsgQueuePop(virFDStreamDataPtr fdst, tmp->next =3D NULL; } =20 - virCondSignal(&fdst->threadCond); + g_cond_signal(&fdst->threadCond); =20 if (saferead(fd, &c, sizeof(c)) !=3D sizeof(c)) { virReportSystemError(errno, @@ -591,11 +591,7 @@ virFDStreamThread(void *opaque) =20 while (doRead =3D=3D (fdst->msg !=3D NULL) && !fdst->threadQuit) { - if (virCondWait(&fdst->threadCond, &fdst->parent.lock)) { - virReportSystemError(errno, "%s", - _("failed to wait on condition")); - goto error; - } + g_cond_wait(&fdst->threadCond, &fdst->parent.lock); } =20 if (fdst->threadQuit) { @@ -654,7 +650,7 @@ virFDStreamJoinWorker(virFDStreamDataPtr fdst, =20 fdst->threadAbort =3D streamAbort; fdst->threadQuit =3D true; - virCondSignal(&fdst->threadCond); + g_cond_signal(&fdst->threadCond); =20 /* Give the thread a chance to lock the FD stream object. */ virObjectUnlock(fdst); @@ -669,7 +665,7 @@ virFDStreamJoinWorker(virFDStreamDataPtr fdst, ret =3D 0; cleanup: VIR_FREE(fdst->thread); - virCondDestroy(&fdst->threadCond); + g_cond_clear(&fdst->threadCond); return ret; } =20 @@ -891,7 +887,7 @@ static int virFDStreamRead(virStreamPtr st, char *bytes= , size_t nbytes) goto cleanup; } else { virObjectUnlock(fdst); - virCondSignal(&fdst->threadCond); + g_cond_signal(&fdst->threadCond); virObjectLock(fdst); } } @@ -1057,7 +1053,7 @@ virFDStreamInData(virStreamPtr st, goto cleanup; } else { virObjectUnlock(fdst); - virCondSignal(&fdst->threadCond); + g_cond_signal(&fdst->threadCond); virObjectLock(fdst); } } @@ -1128,11 +1124,7 @@ static int virFDStreamOpenInternal(virStreamPtr st, if (VIR_ALLOC(fdst->thread) < 0) goto error; =20 - if (virCondInit(&fdst->threadCond) < 0) { - virReportSystemError(errno, "%s", - _("cannot initialize condition variable")= ); - goto error; - } + g_cond_init(&fdst->threadCond); =20 if (virThreadCreateFull(fdst->thread, true, diff --git a/src/util/virobject.c b/src/util/virobject.c index aee1bb4af6..5bf4706f79 100644 --- a/src/util/virobject.c +++ b/src/util/virobject.c @@ -268,12 +268,7 @@ virObjectLockableNew(virClassPtr klass) if (!(obj =3D virObjectNew(klass))) return NULL; =20 - if (virMutexInit(&obj->lock) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Unable to initialize mutex")); - virObjectUnref(obj); - return NULL; - } + g_mutex_init(&obj->lock); =20 return obj; } @@ -305,7 +300,7 @@ virObjectLockableDispose(void *anyobj) { virObjectLockablePtr obj =3D anyobj; =20 - virMutexDestroy(&obj->lock); + g_mutex_clear(&obj->lock); } =20 =20 @@ -424,7 +419,7 @@ virObjectLock(void *anyobj) if (!obj) return; =20 - virMutexLock(&obj->lock); + g_mutex_lock(&obj->lock); } =20 =20 @@ -501,7 +496,7 @@ virObjectUnlock(void *anyobj) if (!obj) return; =20 - virMutexUnlock(&obj->lock); + g_mutex_unlock(&obj->lock); } =20 =20 diff --git a/src/util/virobject.h b/src/util/virobject.h index fcfe77578b..1f6f581e28 100644 --- a/src/util/virobject.h +++ b/src/util/virobject.h @@ -58,7 +58,7 @@ struct _virObject { =20 struct _virObjectLockable { virObject parent; - virMutex lock; + GMutex lock; }; =20 struct _virObjectRWLockable { diff --git a/src/vz/vz_utils.c b/src/vz/vz_utils.c index c31ff53cfb..73dec18515 100644 --- a/src/vz/vz_utils.c +++ b/src/vz/vz_utils.c @@ -559,17 +559,11 @@ vzDomObjAlloc(void *opaque G_GNUC_UNUSED) if (VIR_ALLOC(pdom) < 0) return NULL; =20 - if (virCondInit(&pdom->job.cond) < 0) - goto error; + g_cond_init(&pdom->job.cond); =20 pdom->stats =3D PRL_INVALID_HANDLE; =20 return pdom; - - error: - VIR_FREE(pdom); - - return NULL; } =20 void @@ -582,45 +576,33 @@ vzDomObjFree(void* p) =20 PrlHandle_Free(pdom->sdkdom); PrlHandle_Free(pdom->stats); - virCondDestroy(&pdom->job.cond); + g_cond_clear(&pdom->job.cond); VIR_FREE(pdom); }; =20 -#define VZ_JOB_WAIT_TIME (1000 * 30) +#define VZ_JOB_WAIT_TIME (30 * G_TIME_SPAN_SECOND) =20 int vzDomainObjBeginJob(virDomainObjPtr dom) { vzDomObjPtr pdom =3D dom->privateData; - unsigned long long now; - unsigned long long then; - - if (virTimeMillisNow(&now) < 0) - return -1; - then =3D now + VZ_JOB_WAIT_TIME; + gint64 then =3D g_get_monotonic_time() + VZ_JOB_WAIT_TIME; =20 while (pdom->job.active) { - if (virCondWaitUntil(&pdom->job.cond, &dom->parent.lock, then) < 0) + if (!g_cond_wait_until(&pdom->job.cond, &dom->parent.lock, then)) goto error; } =20 - if (virTimeMillisNow(&now) < 0) - return -1; - pdom->job.active =3D true; - pdom->job.started =3D now; + pdom->job.started =3D g_get_monotonic_time(); pdom->job.elapsed =3D 0; pdom->job.progress =3D 0; pdom->job.hasProgress =3D false; return 0; =20 error: - if (errno =3D=3D ETIMEDOUT) - virReportError(VIR_ERR_OPERATION_TIMEOUT, - "%s", _("cannot acquire state change lock")); - else - virReportSystemError(errno, - "%s", _("cannot acquire job mutex")); + virReportError(VIR_ERR_OPERATION_TIMEOUT, + "%s", _("cannot acquire state change lock")); return -1; } =20 @@ -631,19 +613,18 @@ vzDomainObjEndJob(virDomainObjPtr dom) =20 pdom->job.active =3D false; pdom->job.cancelled =3D false; - virCondSignal(&pdom->job.cond); + g_cond_signal(&pdom->job.cond); } =20 int vzDomainJobUpdateTime(vzDomainJobObjPtr job) { - unsigned long long now; + gint64 now; =20 if (!job->started) return 0; =20 - if (virTimeMillisNow(&now) < 0) - return -1; + now =3D g_get_monotonic_time(); =20 if (now < job->started) { VIR_WARN("Async job starts in the future"); diff --git a/src/vz/vz_utils.h b/src/vz/vz_utils.h index 7ebb34bb11..6497e5530f 100644 --- a/src/vz/vz_utils.h +++ b/src/vz/vz_utils.h @@ -93,11 +93,11 @@ typedef struct _vzConn vzConn; typedef struct _vzConn *vzConnPtr; =20 struct _vzDomainJobObj { - virCond cond; + GCond cond; bool active; /* when the job started, zeroed on time discontinuities */ - unsigned long long started; - unsigned long long elapsed; + gint64 started; + gint64 elapsed; bool hasProgress; int progress; /* percents */ PRL_HANDLE sdkJob; diff --git a/tests/qemuhotplugmock.c b/tests/qemuhotplugmock.c index 8e5b07788d..71fe2db88c 100644 --- a/tests/qemuhotplugmock.c +++ b/tests/qemuhotplugmock.c @@ -38,15 +38,15 @@ init_syms(void) VIR_MOCK_REAL_INIT(virFileExists); } =20 -unsigned long long +gint64 qemuDomainGetUnplugTimeout(virDomainObjPtr vm G_GNUC_UNUSED) { /* Wait only 100ms for DEVICE_DELETED event. Give a greater * timeout in case of PSeries guest to be consistent with the * original logic. */ if (qemuDomainIsPSeries(vm->def)) - return 200; - return 100; + return 200 * G_TIME_SPAN_MILLISECOND; + return 100 * G_TIME_SPAN_MILLISECOND; } =20 =20 diff --git a/tests/qemuhotplugtest.c b/tests/qemuhotplugtest.c index d9244dca44..581a09d204 100644 --- a/tests/qemuhotplugtest.c +++ b/tests/qemuhotplugtest.c @@ -352,6 +352,7 @@ testQemuHotplug(const void *data) if (keep) { test->vm =3D vm; } else { + virObjectUnlock(vm); virObjectUnref(vm); test->vm =3D NULL; } @@ -396,6 +397,7 @@ testQemuHotplugCpuDataFree(struct testQemuHotplugCpuDat= a *data) priv =3D data->vm->privateData; priv->mon =3D NULL; =20 + virObjectUnlock(data->vm); virObjectUnref(data->vm); } =20 diff --git a/tests/qemumonitortestutils.c b/tests/qemumonitortestutils.c index 78fc94e710..9c5a7249ae 100644 --- a/tests/qemumonitortestutils.c +++ b/tests/qemumonitortestutils.c @@ -79,6 +79,8 @@ struct _qemuMonitorTest { =20 virDomainObjPtr vm; virHashTablePtr qapischema; + + bool vmCreated; }; =20 =20 @@ -392,6 +394,8 @@ qemuMonitorTestFree(qemuMonitorTestPtr test) =20 g_object_unref(test->eventThread); =20 + if (test->vmCreated) + virObjectUnlock(test->vm); virObjectUnref(test->vm); =20 if (test->started) @@ -1062,6 +1066,7 @@ qemuMonitorCommonTestNew(virDomainXMLOptionPtr xmlopt, test->vm =3D virDomainObjNew(xmlopt); if (!test->vm) goto error; + test->vmCreated =3D true; if (!(test->vm->def =3D virDomainDefNew())) goto error; } diff --git a/tests/qemusecuritytest.c b/tests/qemusecuritytest.c index a1ef9d8802..65322ae29e 100644 --- a/tests/qemusecuritytest.c +++ b/tests/qemusecuritytest.c @@ -100,19 +100,19 @@ testDomain(const void *opaque) if (virStorageSourceIsLocalStorage(src) && src->path && (src->shared || src->readonly) && virStringListAdd(¬Restored, src->path) < 0) - return -1; + goto unlock; =20 for (n =3D src->backingStore; virStorageSourceIsBacking(n); n =3D = n->backingStore) { if (virStorageSourceIsLocalStorage(n) && n->path && virStringListAdd(¬Restored, n->path) < 0) - return -1; + goto unlock; } } =20 /* Mocking is enabled only when this env variable is set. * See mock code for explanation. */ if (g_setenv(ENVVAR, "1", FALSE) =3D=3D FALSE) - return -1; + goto unlock; =20 if (qemuSecuritySetAllLabel(data->driver, vm, NULL, false) < 0) goto cleanup; @@ -124,9 +124,13 @@ testDomain(const void *opaque) =20 ret =3D 0; cleanup: + virObjectUnlock(vm); g_unsetenv(ENVVAR); freePaths(); return ret; +unlock: + virObjectUnlock(vm); + return -1; } =20 =20 diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 405227fdf6..180201f74e 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -592,6 +592,7 @@ testCompareXMLToArgv(const void *data) VIR_FREE(actualargv); virDomainChrSourceDefClear(&monitor_chr); virCommandFree(cmd); + virObjectUnlock(vm); virObjectUnref(vm); virSetConnectSecret(NULL); virSetConnectStorage(NULL); diff --git a/tools/virsh-console.c b/tools/virsh-console.c index 2e498a6903..ac4d65cb0e 100644 --- a/tools/virsh-console.c +++ b/tools/virsh-console.c @@ -63,7 +63,7 @@ struct virConsole { =20 virStreamPtr st; bool quit; - virCond cond; + GCond cond; =20 int stdinWatch; int stdoutWatch; @@ -130,7 +130,7 @@ virConsoleShutdown(virConsolePtr con, con->stdoutWatch =3D -1; if (!con->quit) { con->quit =3D true; - virCondSignal(&con->cond); + g_cond_signal(&con->cond); } } =20 @@ -143,7 +143,7 @@ virConsoleDispose(void *obj) if (con->st) virStreamFree(con->st); =20 - virCondDestroy(&con->cond); + g_cond_clear(&con->cond); virResetError(&con->error); } =20 @@ -376,21 +376,12 @@ virConsoleNew(void) if (!(con =3D virObjectLockableNew(virConsoleClass))) return NULL; =20 - if (virCondInit(&con->cond) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("cannot initialize console condition")); - - goto error; - } + g_cond_init(&con->cond); =20 con->stdinWatch =3D -1; con->stdoutWatch =3D -1; =20 return con; - - error: - virObjectUnref(con); - return NULL; } =20 =20 @@ -484,11 +475,7 @@ virshRunConsole(vshControl *ctl, } =20 while (!con->quit) { - if (virCondWait(&con->cond, &con->parent.lock) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("unable to wait on console condition")); - goto cleanup; - } + g_cond_wait(&con->cond, &con->parent.lock); } =20 if (con->error.code =3D=3D VIR_ERR_OK) --=20 2.25.2