From nobody Thu May 15 19:18:58 2025 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 1503523391443146.54429128964534; Wed, 23 Aug 2017 14:23:11 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B07F861486; Wed, 23 Aug 2017 21:23:09 +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 8E2C668B32; Wed, 23 Aug 2017 21:23:09 +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 5A11A3FC74; Wed, 23 Aug 2017 21:23:09 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v7NLN7AH024035 for ; Wed, 23 Aug 2017 17:23:07 -0400 Received: by smtp.corp.redhat.com (Postfix) id 4C96980DA7; Wed, 23 Aug 2017 21:23:07 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-123-165.rdu2.redhat.com [10.10.123.165]) by smtp.corp.redhat.com (Postfix) with ESMTP id D6D7866D36 for ; Wed, 23 Aug 2017 21:23:02 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com B07F861486 Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com From: John Ferlan To: libvir-list@redhat.com Date: Wed, 23 Aug 2017 17:22:02 -0400 Message-Id: <20170823212211.4693-7-jferlan@redhat.com> In-Reply-To: <20170823212211.4693-1-jferlan@redhat.com> References: <20170823212211.4693-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v5 06/15] util: Introduce virObjectLookupHashSearch{UUID|Name}[Locked] 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.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Wed, 23 Aug 2017 21:23:10 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Add common object API wrappers to use the virHashSearch API to search the LookupHash for specific data defined in the @opaque parameter. Once data is found, the search would end and the object that is represented is returned locked with it's reference 's reference count incremented. The virObjectLookupHashSearch{UUID|Name}Locked is the workhorse, but similar to the virObjectLookupFind* APIs may be required an Add or AssignDef caller has the Write lock already to ensure no other thread will grab the lock and add the same or competing object. It is up to the caller to unlock and lower the refcnt once done with the object and of course handle a NULL return indicating no object found. Signed-off-by: John Ferlan --- src/libvirt_private.syms | 4 ++ src/util/virobject.c | 131 +++++++++++++++++++++++++++++++++++++++++++= ++++ src/util/virobject.h | 24 +++++++++ 3 files changed, 159 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 4d0883c..b32004e 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2337,6 +2337,10 @@ virObjectLookupHashForEachName; virObjectLookupHashForEachUUID; virObjectLookupHashNew; virObjectLookupHashRemove; +virObjectLookupHashSearchName; +virObjectLookupHashSearchNameLocked; +virObjectLookupHashSearchUUID; +virObjectLookupHashSearchUUIDLocked; virObjectNew; virObjectRef; virObjectRWLockableNew; diff --git a/src/util/virobject.c b/src/util/virobject.c index dfd0bec..b20e938 100644 --- a/src/util/virobject.c +++ b/src/util/virobject.c @@ -1048,3 +1048,134 @@ virObjectLookupHashForEachName(void *anyobj, =20 return ret; } + + +static void * +virObjectLookupHashSearchInternal(virHashTablePtr objsTable, + virHashSearcher iter, + void *opaque) +{ + virObjectLockablePtr obj; + + obj =3D virHashSearch(objsTable, iter, opaque, NULL); + virObjectRef(obj); + + if (obj) + virObjectLock(obj); + + return obj; +} + + +/** + * virObjectLookupHashSearch{UUID|Name}Locked + * @anyobj: LookupHash object + * @iter: callback function to handle the object specific checks + * @opaque: callback data + * + * Search the hash table UUID or Name table calling the specified @iter + * routine with an object and @opaque data in order to determine whether + * the object is represented by the @opaque data. + * + * NB: Caller assumes the responsibility for locking LookupHash + * + * Returns locked/refcnt incremented object on success, NULL on failure + */ +void * +virObjectLookupHashSearchUUIDLocked(void *anyobj, + virHashSearcher iter, + void *opaque) +{ + virObjectLookupHashPtr hashObj =3D virObjectGetLookupHashObj(anyobj); + + if (!hashObj) + return NULL; + + if (!hashObj->objsUUID) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("no objsUUID for hashObj=3D%p"), hashObj); + return NULL; + } + + return virObjectLookupHashSearchInternal(hashObj->objsUUID, iter, opaq= ue); +} + + +void * +virObjectLookupHashSearchNameLocked(void *anyobj, + virHashSearcher iter, + void *opaque) +{ + virObjectLookupHashPtr hashObj =3D virObjectGetLookupHashObj(anyobj); + + if (!hashObj) + return NULL; + + if (!hashObj->objsName) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("no objsName for hashObj=3D%p"), hashObj); + return NULL; + } + + return virObjectLookupHashSearchInternal(hashObj->objsName, iter, opaq= ue); +} + + +/** + * virObjectLookupHashSearch{UUID|Name} + * @anyobj: LookupHash object + * @iter: callback function to handle the object specific checks + * @opaque: callback data + * + * Call virObjectLookupHashSearchLocked with a locked hash table + * + * Returns @obj from virObjectLookupHashSearchLocked + */ +void * +virObjectLookupHashSearchUUID(void *anyobj, + virHashSearcher iter, + void *opaque) +{ + virObjectLookupHashPtr hashObj =3D virObjectGetLookupHashObj(anyobj); + virObjectLockablePtr obj; + + if (!hashObj) + return NULL; + + if (!hashObj->objsUUID) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("no objsUUID for hashObj=3D%p"), hashObj); + return NULL; + } + + virObjectRWLockRead(hashObj); + obj =3D virObjectLookupHashSearchInternal(hashObj->objsUUID, iter, opa= que); + virObjectRWUnlock(hashObj); + + return obj; +} + + +void * +virObjectLookupHashSearchName(void *anyobj, + virHashSearcher iter, + void *opaque) +{ + virObjectLookupHashPtr hashObj =3D virObjectGetLookupHashObj(anyobj); + virObjectLockablePtr obj; + + if (!hashObj) + return NULL; + + if (!hashObj->objsName) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("no objsName for hashObj=3D%p"), hashObj); + return NULL; + } + + virObjectRWLockRead(hashObj); + obj =3D virObjectLookupHashSearchInternal(hashObj->objsName, iter, opa= que); + virObjectRWUnlock(hashObj); + + return obj; +} diff --git a/src/util/virobject.h b/src/util/virobject.h index a35cf3c..03a23e0 100644 --- a/src/util/virobject.h +++ b/src/util/virobject.h @@ -232,4 +232,28 @@ virObjectLookupHashForEachName(void *anyobj, virObjectLookupHashForEachDataPtr data) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3); =20 +void * +virObjectLookupHashSearchUUIDLocked(void *anyobj, + virHashSearcher iter, + void *opaque) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); + +void * +virObjectLookupHashSearchNameLocked(void *anyobj, + virHashSearcher iter, + void *opaque) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); + +void * +virObjectLookupHashSearchUUID(void *anyobj, + virHashSearcher iter, + void *opaque) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); + +void * +virObjectLookupHashSearchName(void *anyobj, + virHashSearcher iter, + void *opaque) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); + #endif /* __VIR_OBJECT_H */ --=20 2.9.5 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list