]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: domain_addr: Refactor hash usage in zpci reservation code
authorPeter Krempa <pkrempa@redhat.com>
Tue, 20 Oct 2020 15:31:23 +0000 (17:31 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 22 Oct 2020 13:02:46 +0000 (15:02 +0200)
Rewrite using GHashTable which already has interfaces for using a number
as hash key.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Bjoern Walk <bwalk@linux.ibm.com>
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
src/conf/domain_addr.c
src/conf/domain_addr.h

index c7419916aa3f7a27dadb2c5cd9c859284446a965..4e47c2547c08fc9cf96e7e1b00810eaa26c87bf8 100644 (file)
 #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;
index a0460b4030dcd96844af827aee5dbc13b471ae02..77dd091fd3db414f6e64ecb2642b07a7567e7da2 100644 (file)
@@ -115,8 +115,8 @@ typedef struct {
 typedef virDomainPCIAddressBus *virDomainPCIAddressBusPtr;
 
 typedef struct {
-    virHashTablePtr uids;
-    virHashTablePtr fids;
+    GHashTable *uids;
+    GHashTable *fids;
 } virDomainZPCIAddressIds;
 typedef virDomainZPCIAddressIds *virDomainZPCIAddressIdsPtr;