From nobody Sun Feb 8 18:28:24 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 1491480677708536.1717015536518; Thu, 6 Apr 2017 05:11:17 -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 3AB39C04B951; Thu, 6 Apr 2017 12:11:16 +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 0DC6CA482E; Thu, 6 Apr 2017 12:11:16 +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 ACBDD18523C7; Thu, 6 Apr 2017 12:11:15 +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 v36CAxBo002320 for ; Thu, 6 Apr 2017 08:10:59 -0400 Received: by smtp.corp.redhat.com (Postfix) id 19AC7171D0; Thu, 6 Apr 2017 12:10:59 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-116-19.phx2.redhat.com [10.3.116.19]) by smtp.corp.redhat.com (Postfix) with ESMTP id CD1BD1719F for ; Thu, 6 Apr 2017 12:10:58 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 3AB39C04B951 Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.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 3AB39C04B951 From: John Ferlan To: libvir-list@redhat.com Date: Thu, 6 Apr 2017 08:10:51 -0400 Message-Id: <20170406121052.5815-8-jferlan@redhat.com> In-Reply-To: <20170406121052.5815-1-jferlan@redhat.com> References: <20170406121052.5815-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [RFC PATCH 7/8] util: Introduce virObjectPoolableHashElement 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.31]); Thu, 06 Apr 2017 12:11:17 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Add a new virObjectLockable child which will be used to describe elements that would be inserted into the virObjectPoolableHashTable. Each virObjectPoolableHashElement will have a primaryKey and a secondaryKey which can be used to insert the same object into both of the hash tables that are part of the virObjectPoolableHashTable. This allows for lookup of the object by more than one means. Signed-off-by: John Ferlan --- src/libvirt_private.syms | 2 ++ src/util/virobject.c | 77 ++++++++++++++++++++++++++++++++++++++++++++= ++-- src/util/virobject.h | 17 +++++++++++ 3 files changed, 94 insertions(+), 2 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 9b3345a..74d4bf8 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2223,6 +2223,7 @@ virNumaSetupMemoryPolicy; # util/virobject.h virClassForObject; virClassForObjectLockable; +virClassForObjectPoolableHashElement; virClassForObjectPoolableHashTable; virClassIsDerivedFrom; virClassName; @@ -2235,6 +2236,7 @@ virObjectListFreeCount; virObjectLock; virObjectLockableNew; virObjectNew; +virObjectPoolableHashElementNew; virObjectPoolableHashTableGetPrimary; virObjectPoolableHashTableGetSecondary; virObjectPoolableHashTableNew; diff --git a/src/util/virobject.c b/src/util/virobject.c index 625bf90..c9e631c 100644 --- a/src/util/virobject.c +++ b/src/util/virobject.c @@ -62,10 +62,11 @@ struct _virClass { static virClassPtr virObjectClass; static virClassPtr virObjectLockableClass; static virClassPtr virObjectPoolableHashTableClass; +static virClassPtr virObjectPoolableHashElementClass; =20 static void virObjectLockableDispose(void *anyobj); static void virObjectPoolableHashTableDispose(void *anyobj); - +static void virObjectPoolableHashElementDispose(void *anyobj); =20 static int virObjectOnceInit(void) @@ -89,6 +90,13 @@ virObjectOnceInit(void) virObjectPoolableHashTableDispose))) return -1; =20 + if (!(virObjectPoolableHashElementClass =3D + virClassNew(virObjectLockableClass, + "virObjectPoolableHashElement", + sizeof(virObjectPoolableHashElement), + virObjectPoolableHashElementDispose))) + return -1; + return 0; } =20 @@ -145,6 +153,23 @@ virClassForObjectPoolableHashTable(void) =20 =20 /** + * virClassForObjectPoolableHashElement: + * + * Returns the class instance for the virObjectPoolableHashElement type + */ +virClassPtr +virClassForObjectPoolableHashElement(void) +{ + if (virObjectInitialize() < 0) + return NULL; + + VIR_DEBUG("virObjectPoolableHashElementClass=3D%p", + virObjectPoolableHashElementClass); + return virObjectPoolableHashElementClass; +} + + +/** * virClassNew: * @parent: the parent class * @name: the class name @@ -349,6 +374,53 @@ virObjectPoolableHashTableDispose(void *anyobj) } =20 =20 +void * +virObjectPoolableHashElementNew(virClassPtr klass, + const char *primaryKey, + const char *secondaryKey) +{ + virObjectPoolableHashElementPtr obj; + + if (!virClassIsDerivedFrom(klass, virClassForObjectPoolableHashElement= ())) { + virReportInvalidArg(klass, + _("Class %s must derive from " + "virObjectPoolableHashElement"), + virClassName(klass)); + return NULL; + } + + if (!(obj =3D virObjectLockableNew(klass))) + return NULL; + + if (VIR_STRDUP(obj->primaryKey, primaryKey) < 0) + goto error; + + if (secondaryKey && VIR_STRDUP(obj->secondaryKey, secondaryKey) < 0) + goto error; + + VIR_DEBUG("obj=3D%p, primary=3D%s secondary=3D%s", + obj, obj->primaryKey, NULLSTR(obj->secondaryKey)); + + return obj; + + error: + virObjectUnref(obj); + return NULL; + +} + +static void +virObjectPoolableHashElementDispose(void *anyobj) +{ + virObjectPoolableHashElementPtr obj =3D anyobj; + + VIR_DEBUG("dispose obj=3D%p", obj); + + VIR_FREE(obj->primaryKey); + VIR_FREE(obj->secondaryKey); +} + + /** * virObjectUnref: * @anyobj: any instance of virObjectPtr @@ -417,7 +489,8 @@ static virObjectLockablePtr virObjectGetLockableObj(void *anyobj) { if (virObjectIsClass(anyobj, virObjectLockableClass) || - virObjectIsClass(anyobj, virObjectPoolableHashTableClass)) + virObjectIsClass(anyobj, virObjectPoolableHashTableClass) || + virObjectIsClass(anyobj, virObjectPoolableHashElementClass)) return anyobj; =20 VIR_OBJECT_USAGE_PRINT_WARNING(anyobj, virObjectLockableClass); diff --git a/src/util/virobject.h b/src/util/virobject.h index ac21190..36fd842 100644 --- a/src/util/virobject.h +++ b/src/util/virobject.h @@ -38,6 +38,9 @@ typedef virObjectLockable *virObjectLockablePtr; typedef struct _virObjectPoolableHashTable virObjectPoolableHashTable; typedef virObjectPoolableHashTable *virObjectPoolableHashTablePtr; =20 +typedef struct _virObjectPoolableHashElement virObjectPoolableHashElement; +typedef virObjectPoolableHashElement *virObjectPoolableHashElementPtr; + typedef void (*virObjectDisposeCallback)(void *obj); =20 /* Most code should not play with the contents of this struct; however, @@ -96,9 +99,17 @@ struct _virObjectPoolableHashTable { }; =20 =20 +struct _virObjectPoolableHashElement { + virObjectLockable parent; + + char *primaryKey; + char *secondaryKey; +}; + virClassPtr virClassForObject(void); virClassPtr virClassForObjectLockable(void); virClassPtr virClassForObjectPoolableHashTable(void); +virClassPtr virClassForObjectPoolableHashElement(void); =20 # ifndef VIR_PARENT_REQUIRED # define VIR_PARENT_REQUIRED ATTRIBUTE_NONNULL(1) @@ -152,6 +163,12 @@ virObjectPoolableHashTableNew(virClassPtr klass, bool primaryOnly) ATTRIBUTE_NONNULL(1); =20 +void * +virObjectPoolableHashElementNew(virClassPtr klass, + const char *primaryKey, + const char *secondaryKey) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); + void virObjectLock(void *lockableobj) ATTRIBUTE_NONNULL(1); --=20 2.9.3 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list