From nobody Sun Feb 8 14:57:27 2026 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.zoho.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 1492682663417542.4283150080933; Thu, 20 Apr 2017 03:04:23 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8846E3DBF9; Thu, 20 Apr 2017 10:04:21 +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 580B98FF7F; Thu, 20 Apr 2017 10:04:21 +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 033DC18523CD; Thu, 20 Apr 2017 10:04:03 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v3KA2G3i001297 for ; Thu, 20 Apr 2017 06:02:16 -0400 Received: by smtp.corp.redhat.com (Postfix) id 539FD7F6BA; Thu, 20 Apr 2017 10:02:16 +0000 (UTC) Received: from moe.brq.redhat.com (dhcp129-131.brq.redhat.com [10.34.129.131]) by smtp.corp.redhat.com (Postfix) with ESMTP id C56137F6AC for ; Thu, 20 Apr 2017 10:02:15 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 8846E3DBF9 Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=libvir-list-bounces@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 8846E3DBF9 From: Michal Privoznik To: libvir-list@redhat.com Date: Thu, 20 Apr 2017 12:01:33 +0200 Message-Id: <42b9258c3f2d98e8eedce356f4f1ff0ff1def456.1492682033.git.mprivozn@redhat.com> In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 04/38] virFDStreamData: Turn into virObjectLockable 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.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Thu, 20 Apr 2017 10:04:22 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" While this is no functional change, it makes the code look a bit nicer. Moreover, it prepares ground for future work. Signed-off-by: Michal Privoznik --- src/util/virfdstream.c | 97 +++++++++++++++++++++++++++++-----------------= ---- 1 file changed, 57 insertions(+), 40 deletions(-) diff --git a/src/util/virfdstream.c b/src/util/virfdstream.c index e6670c5..9a4a7ff 100644 --- a/src/util/virfdstream.c +++ b/src/util/virfdstream.c @@ -53,6 +53,8 @@ VIR_LOG_INIT("fdstream"); typedef struct virFDStreamData virFDStreamData; typedef virFDStreamData *virFDStreamDataPtr; struct virFDStreamData { + virObjectLockable parent; + int fd; int errfd; virCommandPtr cmd; @@ -77,10 +79,31 @@ struct virFDStreamData { virFDStreamInternalCloseCb icbCb; virFDStreamInternalCloseCbFreeOpaque icbFreeOpaque; void *icbOpaque; - - virMutex lock; }; =20 +static virClassPtr virFDStreamDataClass; + +static void +virFDStreamDataDispose(void *obj) +{ + virFDStreamDataPtr fdst =3D obj; + + VIR_DEBUG("obj=3D%p", fdst); +} + +static int virFDStreamDataOnceInit(void) +{ + if (!(virFDStreamDataClass =3D virClassNew(virClassForObjectLockable(), + "virFDStreamData", + sizeof(virFDStreamData), + virFDStreamDataDispose))) + return -1; + + return 0; +} + +VIR_ONCE_GLOBAL_INIT(virFDStreamData) + =20 static int virFDStreamRemoveCallback(virStreamPtr stream) { @@ -93,7 +116,7 @@ static int virFDStreamRemoveCallback(virStreamPtr stream) return -1; } =20 - virMutexLock(&fdst->lock); + virObjectLock(fdst); if (fdst->watch =3D=3D 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("stream does not have a callback registered= ")); @@ -115,7 +138,7 @@ static int virFDStreamRemoveCallback(virStreamPtr strea= m) ret =3D 0; =20 cleanup: - virMutexUnlock(&fdst->lock); + virObjectUnlock(fdst); return ret; } =20 @@ -130,7 +153,7 @@ static int virFDStreamUpdateCallback(virStreamPtr strea= m, int events) return -1; } =20 - virMutexLock(&fdst->lock); + virObjectLock(fdst); if (fdst->watch =3D=3D 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("stream does not have a callback registered= ")); @@ -143,7 +166,7 @@ static int virFDStreamUpdateCallback(virStreamPtr strea= m, int events) ret =3D 0; =20 cleanup: - virMutexUnlock(&fdst->lock); + virObjectUnlock(fdst); return ret; } =20 @@ -162,9 +185,9 @@ static void virFDStreamEvent(int watch ATTRIBUTE_UNUSED, if (!fdst) return; =20 - virMutexLock(&fdst->lock); + virObjectLock(fdst); if (!fdst->cb) { - virMutexUnlock(&fdst->lock); + virObjectUnlock(fdst); return; } =20 @@ -172,21 +195,19 @@ static void virFDStreamEvent(int watch ATTRIBUTE_UNUS= ED, cbopaque =3D fdst->opaque; ff =3D fdst->ff; fdst->dispatching =3D true; - virMutexUnlock(&fdst->lock); + virObjectUnlock(fdst); =20 cb(stream, events, cbopaque); =20 - virMutexLock(&fdst->lock); + virObjectLock(fdst); fdst->dispatching =3D false; if (fdst->cbRemoved && ff) (ff)(cbopaque); closed =3D fdst->closed; - virMutexUnlock(&fdst->lock); + virObjectUnlock(fdst); =20 - if (closed) { - virMutexDestroy(&fdst->lock); - VIR_FREE(fdst); - } + if (closed) + virObjectUnref(fdst); } =20 static void virFDStreamCallbackFree(void *opaque) @@ -211,7 +232,7 @@ virFDStreamAddCallback(virStreamPtr st, return -1; } =20 - virMutexLock(&fdst->lock); + virObjectLock(fdst); if (fdst->watch !=3D 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("stream already has a callback registered")= ); @@ -239,7 +260,7 @@ virFDStreamAddCallback(virStreamPtr st, ret =3D 0; =20 cleanup: - virMutexUnlock(&fdst->lock); + virObjectUnlock(fdst); return ret; } =20 @@ -307,7 +328,7 @@ virFDStreamCloseInt(virStreamPtr st, bool streamAbort) if (!st || !(fdst =3D st->privateData) || fdst->abortCallbackDispatchi= ng) return 0; =20 - virMutexLock(&fdst->lock); + virObjectLock(fdst); =20 /* aborting the stream, ensure the callback is called if it's * registered for stream error event */ @@ -317,7 +338,7 @@ virFDStreamCloseInt(virStreamPtr st, bool streamAbort) VIR_STREAM_EVENT_WRITABLE))) { /* don't enter this function accidentally from the callback again = */ if (fdst->abortCallbackCalled) { - virMutexUnlock(&fdst->lock); + virObjectUnlock(fdst); return 0; } =20 @@ -327,12 +348,12 @@ virFDStreamCloseInt(virStreamPtr st, bool streamAbort) /* cache the pointers */ cb =3D fdst->cb; opaque =3D fdst->opaque; - virMutexUnlock(&fdst->lock); + virObjectUnlock(fdst); =20 /* call failure callback, poll reports nothing on closed fd */ (cb)(st, VIR_STREAM_EVENT_ERROR, opaque); =20 - virMutexLock(&fdst->lock); + virObjectLock(fdst); fdst->abortCallbackDispatching =3D false; } =20 @@ -356,11 +377,10 @@ virFDStreamCloseInt(virStreamPtr st, bool streamAbort) =20 if (fdst->dispatching) { fdst->closed =3D true; - virMutexUnlock(&fdst->lock); + virObjectUnlock(fdst); } else { - virMutexUnlock(&fdst->lock); - virMutexDestroy(&fdst->lock); - VIR_FREE(fdst); + virObjectUnlock(fdst); + virObjectUnref(fdst); } =20 return ret; @@ -395,13 +415,13 @@ static int virFDStreamWrite(virStreamPtr st, const ch= ar *bytes, size_t nbytes) return -1; } =20 - virMutexLock(&fdst->lock); + virObjectLock(fdst); =20 if (fdst->length) { if (fdst->length =3D=3D fdst->offset) { virReportSystemError(ENOSPC, "%s", _("cannot write to stream")); - virMutexUnlock(&fdst->lock); + virObjectUnlock(fdst); return -1; } =20 @@ -427,7 +447,7 @@ static int virFDStreamWrite(virStreamPtr st, const char= *bytes, size_t nbytes) fdst->offset +=3D ret; } =20 - virMutexUnlock(&fdst->lock); + virObjectUnlock(fdst); return ret; } =20 @@ -449,11 +469,11 @@ static int virFDStreamRead(virStreamPtr st, char *byt= es, size_t nbytes) return -1; } =20 - virMutexLock(&fdst->lock); + virObjectLock(fdst); =20 if (fdst->length) { if (fdst->length =3D=3D fdst->offset) { - virMutexUnlock(&fdst->lock); + virObjectUnlock(fdst); return 0; } =20 @@ -479,7 +499,7 @@ static int virFDStreamRead(virStreamPtr st, char *bytes= , size_t nbytes) fdst->offset +=3D ret; } =20 - virMutexUnlock(&fdst->lock); + virObjectUnlock(fdst); return ret; } =20 @@ -505,25 +525,22 @@ static int virFDStreamOpenInternal(virStreamPtr st, VIR_DEBUG("st=3D%p fd=3D%d cmd=3D%p errfd=3D%d length=3D%llu", st, fd, cmd, errfd, length); =20 + if (virFDStreamDataInitialize() < 0) + return -1; + if ((st->flags & VIR_STREAM_NONBLOCK) && virSetNonBlock(fd) < 0) { virReportSystemError(errno, "%s", _("Unable to set non-blocking mo= de")); return -1; } =20 - if (VIR_ALLOC(fdst) < 0) + if (!(fdst =3D virObjectLockableNew(virFDStreamDataClass))) return -1; =20 fdst->fd =3D fd; fdst->cmd =3D cmd; fdst->errfd =3D errfd; fdst->length =3D length; - if (virMutexInit(&fdst->lock) < 0) { - VIR_FREE(fdst); - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Unable to initialize mutex")); - return -1; - } =20 st->driver =3D &virFDStreamDrv; st->privateData =3D fdst; @@ -821,7 +838,7 @@ int virFDStreamSetInternalCloseCb(virStreamPtr st, { virFDStreamDataPtr fdst =3D st->privateData; =20 - virMutexLock(&fdst->lock); + virObjectLock(fdst); =20 if (fdst->icbFreeOpaque) (fdst->icbFreeOpaque)(fdst->icbOpaque); @@ -830,6 +847,6 @@ int virFDStreamSetInternalCloseCb(virStreamPtr st, fdst->icbOpaque =3D opaque; fdst->icbFreeOpaque =3D fcb; =20 - virMutexUnlock(&fdst->lock); + virObjectUnlock(fdst); return 0; } --=20 2.10.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list