[PATCH 05/15] conf: domain_addr: Refactor hash usage in zpci reservation code

Peter Krempa pkrempa at redhat.com
Thu Oct 22 09:34:56 UTC 2020


Rewrite using GHashTable which already has interfaces for using a number
as hash key.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/conf/domain_addr.c | 123 +++++++++--------------------------------
 src/conf/domain_addr.h |   4 +-
 2 files changed, 27 insertions(+), 100 deletions(-)

diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c
index c7419916aa..4e47c2547c 100644
--- a/src/conf/domain_addr.c
+++ b/src/conf/domain_addr.c
@@ -25,17 +25,18 @@
 #include "virlog.h"
 #include "virstring.h"
 #include "domain_addr.h"
-#include "virhashcode.h"

 #define VIR_FROM_THIS VIR_FROM_DOMAIN

 VIR_LOG_INIT("conf.domain_addr");

 static int
-virDomainZPCIAddressReserveId(virHashTablePtr set,
+virDomainZPCIAddressReserveId(GHashTable *set,
                               virZPCIDeviceAddressID *id,
                               const char *name)
 {
+    int *idval;
+
     if (!id->isSet) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("No zPCI %s to reserve"),
@@ -43,26 +44,24 @@ virDomainZPCIAddressReserveId(virHashTablePtr set,
         return -1;
     }

-    if (virHashLookup(set, &id->value)) {
+    if (g_hash_table_lookup(set, &id->value)) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("zPCI %s %o is already reserved"),
                        name, id->value);
         return -1;
     }

-    if (virHashAddEntry(set, &id->value, (void*)1) < 0) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("Failed to reserve %s %o"),
-                       name, id->value);
-        return -1;
-    }
+    idval = g_new0(int, 1);
+    *idval = (int) id->value;
+
+    g_hash_table_add(set, idval);

     return 0;
 }


 static int
-virDomainZPCIAddressReserveUid(virHashTablePtr set,
+virDomainZPCIAddressReserveUid(GHashTable *set,
                                virZPCIDeviceAddressPtr addr)
 {
     return virDomainZPCIAddressReserveId(set, &addr->uid, "uid");
@@ -70,7 +69,7 @@ virDomainZPCIAddressReserveUid(virHashTablePtr set,


 static int
-virDomainZPCIAddressReserveFid(virHashTablePtr set,
+virDomainZPCIAddressReserveFid(GHashTable *set,
                                virZPCIDeviceAddressPtr addr)
 {
     return virDomainZPCIAddressReserveId(set, &addr->fid, "fid");
@@ -78,7 +77,7 @@ virDomainZPCIAddressReserveFid(virHashTablePtr set,


 static int
-virDomainZPCIAddressAssignId(virHashTablePtr set,
+virDomainZPCIAddressAssignId(GHashTable *set,
                              virZPCIDeviceAddressID *id,
                              unsigned int min,
                              unsigned int max,
@@ -87,7 +86,7 @@ virDomainZPCIAddressAssignId(virHashTablePtr set,
     if (id->isSet)
         return 0;

-    while (virHashLookup(set, &min)) {
+    while (g_hash_table_lookup(set, &min)) {
         if (min == max) {
             virReportError(VIR_ERR_INTERNAL_ERROR,
                            _("There is no more free %s."),
@@ -105,7 +104,7 @@ virDomainZPCIAddressAssignId(virHashTablePtr set,


 static int
-virDomainZPCIAddressAssignUid(virHashTablePtr set,
+virDomainZPCIAddressAssignUid(GHashTable *set,
                               virZPCIDeviceAddressPtr addr)
 {
     return virDomainZPCIAddressAssignId(set, &addr->uid, 1,
@@ -114,7 +113,7 @@ virDomainZPCIAddressAssignUid(virHashTablePtr set,


 static int
-virDomainZPCIAddressAssignFid(virHashTablePtr set,
+virDomainZPCIAddressAssignFid(GHashTable *set,
                               virZPCIDeviceAddressPtr addr)
 {
     return virDomainZPCIAddressAssignId(set, &addr->fid, 0,
@@ -123,40 +122,19 @@ virDomainZPCIAddressAssignFid(virHashTablePtr set,


 static void
-virDomainZPCIAddressReleaseId(virHashTablePtr set,
-                              virZPCIDeviceAddressID *id,
-                              const char *name)
+virDomainZPCIAddressReleaseId(GHashTable *set,
+                              virZPCIDeviceAddressID *id)
 {
     if (!id->isSet)
         return;

-    if (virHashRemoveEntry(set, &id->value) < 0) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("Release %s %o failed"),
-                       name, id->value);
-    }
+    g_hash_table_remove(set, &id->value);

     id->value = 0;
     id->isSet = false;
 }


-static void
-virDomainZPCIAddressReleaseUid(virHashTablePtr set,
-                               virZPCIDeviceAddressPtr addr)
-{
-    virDomainZPCIAddressReleaseId(set, &addr->uid, "uid");
-}
-
-
-static void
-virDomainZPCIAddressReleaseFid(virHashTablePtr set,
-                               virZPCIDeviceAddressPtr addr)
-{
-    virDomainZPCIAddressReleaseId(set, &addr->fid, "fid");
-}
-
-
 static void
 virDomainZPCIAddressReleaseIds(virDomainZPCIAddressIdsPtr zpciIds,
                                virZPCIDeviceAddressPtr addr)
@@ -164,8 +142,8 @@ virDomainZPCIAddressReleaseIds(virDomainZPCIAddressIdsPtr zpciIds,
     if (!zpciIds)
         return;

-    virDomainZPCIAddressReleaseUid(zpciIds->uids, addr);
-    virDomainZPCIAddressReleaseFid(zpciIds->fids, addr);
+    virDomainZPCIAddressReleaseId(zpciIds->uids, &addr->uid);
+    virDomainZPCIAddressReleaseId(zpciIds->fids, &addr->fid);
 }


@@ -183,7 +161,7 @@ virDomainZPCIAddressEnsureAddr(virDomainZPCIAddressIdsPtr zpciIds,
         return -1;

     if (virDomainZPCIAddressReserveFid(zpciIds->fids, addr) < 0) {
-        virDomainZPCIAddressReleaseUid(zpciIds->uids, addr);
+        virDomainZPCIAddressReleaseId(zpciIds->uids, &addr->uid);
         return -1;
     }

@@ -965,55 +943,15 @@ virDomainPCIAddressReleaseAddr(virDomainPCIAddressSetPtr addrs,
 }


-static uint32_t
-virZPCIAddrKeyCode(const void *name,
-                   uint32_t seed)
-{
-    unsigned int value = *((unsigned int *)name);
-    return virHashCodeGen(&value, sizeof(value), seed);
-}
-
-
-static bool
-virZPCIAddrKeyEqual(const void *namea,
-                    const void *nameb)
-{
-    return *((unsigned int *)namea) == *((unsigned int *)nameb);
-}
-
-
-static void *
-virZPCIAddrKeyCopy(const void *name)
-{
-    unsigned int *copy = g_new0(unsigned int, 1);
-
-    *copy = *((unsigned int *)name);
-    return (void *)copy;
-}
-
-
-static char *
-virZPCIAddrKeyPrintHuman(const void *name)
-{
-    return g_strdup_printf("%u", *((unsigned int *)name));
-}
-
-
-static void
-virZPCIAddrKeyFree(void *name)
-{
-    VIR_FREE(name);
-}
-
-
 static void
 virDomainPCIAddressSetExtensionFree(virDomainPCIAddressSetPtr addrs)
 {
     if (!addrs || !addrs->zpciIds)
         return;

-    virHashFree(addrs->zpciIds->uids);
-    virHashFree(addrs->zpciIds->fids);
+    g_clear_pointer(&addrs->zpciIds->uids, g_hash_table_unref);
+    g_clear_pointer(&addrs->zpciIds->fids, g_hash_table_unref);
+
     VIR_FREE(addrs->zpciIds);
 }

@@ -1028,19 +966,8 @@ virDomainPCIAddressSetExtensionAlloc(virDomainPCIAddressSetPtr addrs,

         addrs->zpciIds = g_new0(virDomainZPCIAddressIds, 1);

-        addrs->zpciIds->uids = virHashCreateFull(10, NULL,
-                                                 virZPCIAddrKeyCode,
-                                                 virZPCIAddrKeyEqual,
-                                                 virZPCIAddrKeyCopy,
-                                                 virZPCIAddrKeyPrintHuman,
-                                                 virZPCIAddrKeyFree);
-
-        addrs->zpciIds->fids = virHashCreateFull(10, NULL,
-                                                 virZPCIAddrKeyCode,
-                                                 virZPCIAddrKeyEqual,
-                                                 virZPCIAddrKeyCopy,
-                                                 virZPCIAddrKeyPrintHuman,
-                                                 virZPCIAddrKeyFree);
+        addrs->zpciIds->uids = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, NULL);
+        addrs->zpciIds->fids = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, NULL);
     }

     return 0;
diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h
index a0460b4030..77dd091fd3 100644
--- a/src/conf/domain_addr.h
+++ b/src/conf/domain_addr.h
@@ -115,8 +115,8 @@ typedef struct {
 typedef virDomainPCIAddressBus *virDomainPCIAddressBusPtr;

 typedef struct {
-    virHashTablePtr uids;
-    virHashTablePtr fids;
+    GHashTable *uids;
+    GHashTable *fids;
 } virDomainZPCIAddressIds;
 typedef virDomainZPCIAddressIds *virDomainZPCIAddressIdsPtr;

-- 
2.26.2




More information about the libvir-list mailing list