From nobody Thu May 2 16:31:08 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1504271528191677.9201974418605; Fri, 1 Sep 2017 06:12:08 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 37AA08046F; Fri, 1 Sep 2017 13:12:06 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 8E84278209; Fri, 1 Sep 2017 13:12:05 +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 E623D1808873; Fri, 1 Sep 2017 13:12:03 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v81CnPOE029172 for ; Fri, 1 Sep 2017 08:49:25 -0400 Received: by smtp.corp.redhat.com (Postfix) id EE433781F2; Fri, 1 Sep 2017 12:49:25 +0000 (UTC) Received: from localhost.localdomain.com (unknown [10.42.22.189]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6E4A678202; Fri, 1 Sep 2017 12:49:23 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 37AA08046F Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com From: "Daniel P. Berrange" To: libvir-list@redhat.com Date: Fri, 1 Sep 2017 13:49:20 +0100 Message-Id: <20170901124920.12815-1-berrange@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH] event: ignore attempts to replace the event loop impl 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: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Fri, 01 Sep 2017 13:12:07 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Although not previously explicitly documented, the expectation for the libvirt event loop is that an implementation is registered early in application startup, before calling any libvirt APIs and then run forever after. Replacing a previously registered event loop is not safe & subject to races even if virConnectClose has been called on open handles, due to delayed deregistration of callbacks during conenction close. Signed-off-by: Daniel P. Berrange Reviewed-by: Andrea Bolognani --- src/util/virevent.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/util/virevent.c b/src/util/virevent.c index e0fd35e41..51d8714df 100644 --- a/src/util/virevent.c +++ b/src/util/virevent.c @@ -220,6 +220,13 @@ virEventRemoveTimeout(int timer) * existing event loop implementation, then the * virEventRegisterDefaultImpl() method can be used to setup * the generic libvirt implementation. + * + * Once registered, the event loop implementation cannot be + * changed, and must be run continuously. Note that callbacks + * may remain registered for a short time even after calling + * virConnectClose on all open connections, so it is not safe + * to stop running the event loop immediately after closing + * the connection. */ void virEventRegisterImpl(virEventAddHandleFunc addHandle, virEventUpdateHandleFunc updateHandle, @@ -233,6 +240,12 @@ void virEventRegisterImpl(virEventAddHandleFunc addHan= dle, addHandle, updateHandle, removeHandle, addTimeout, updateTimeout, removeTimeout); =20 + if (addHandleImpl || updateHandleImpl || removeHandleImpl || + addTimeoutImpl || updateTimeoutImpl || removeHandleImpl) { + VIR_WARN("Ignoring attempt to replace registered event loop"); + return; + } + addHandleImpl =3D addHandle; updateHandleImpl =3D updateHandle; removeHandleImpl =3D removeHandle; --=20 2.13.5 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list