[libvirt] [PATCH 02/15] maint: avoid 'const fooPtr' in hashes

Eric Blake eblake at redhat.com
Tue Oct 8 17:24:59 UTC 2013


'const fooPtr' is the same as 'foo * const' (the pointer won't
change, but it's contents can).  But in general, if an interface
is trying to be const-correct, it should be using 'const foo *'
(the pointer is to data that can't be changed).

Fix up virhash to provide a const-correct interface: all actions
that don't modify the table take a const table.  Note that in
one case (virHashSearch), we actually strip const away - we aren't
modifying the contents of the table, so much as associated data
for ensuring that the code uses the table correctly (if this were
C++, it would be a case for the 'mutable' keyword).

* src/util/virhash.h (virHashKeyComparator, virHashEqual): Use
intended type.
(virHashSize, virHashTableSize, virHashLookup, virHashSearch):
Make const-correct.
* src/util/virhash.c (virHashEqualData, virHashEqual)
(virHashLookup, virHashSize, virHashTableSize, virHashSearch)
(virHashComputeKey): Fix fallout.
* src/conf/nwfilter_params.c
(virNWFilterFormatParameterNameSorter): Likewise.
* src/nwfilter/nwfilter_ebiptables_driver.c
(ebiptablesFilterOrderSort): Likewise.
* tests/virhashtest.c (testHashGetItemsCompKey)
(testHashGetItemsCompValue): Likewise.

Signed-off-by: Eric Blake <eblake at redhat.com>
---
 src/conf/nwfilter_params.c                |  8 ++++----
 src/nwfilter/nwfilter_ebiptables_driver.c |  6 +++---
 src/util/virhash.c                        | 21 ++++++++++++---------
 src/util/virhash.h                        | 19 ++++++++++---------
 tests/virhashtest.c                       |  8 ++++----
 5 files changed, 33 insertions(+), 29 deletions(-)

diff --git a/src/conf/nwfilter_params.c b/src/conf/nwfilter_params.c
index 7ae4a44..c23de65 100644
--- a/src/conf/nwfilter_params.c
+++ b/src/conf/nwfilter_params.c
@@ -1,7 +1,7 @@
 /*
  * nwfilter_params.c: parsing and data maintenance of filter parameters
  *
- * Copyright (C) 2011-2012 Red Hat, Inc.
+ * Copyright (C) 2011-2013 Red Hat, Inc.
  * Copyright (C) 2010 IBM Corporation
  *
  * This library is free software; you can redistribute it and/or
@@ -877,10 +877,10 @@ err_exit:


 static int
-virNWFilterFormatParameterNameSorter(const virHashKeyValuePairPtr a,
-                                     const virHashKeyValuePairPtr b)
+virNWFilterFormatParameterNameSorter(const virHashKeyValuePair *a,
+                                     const virHashKeyValuePair *b)
 {
-    return strcmp((const char *)a->key, (const char *)b->key);
+    return strcmp(a->key, b->key);
 }

 int
diff --git a/src/nwfilter/nwfilter_ebiptables_driver.c b/src/nwfilter/nwfilter_ebiptables_driver.c
index 56c962b..2fd8afb 100644
--- a/src/nwfilter/nwfilter_ebiptables_driver.c
+++ b/src/nwfilter/nwfilter_ebiptables_driver.c
@@ -1,7 +1,7 @@
 /*
  * nwfilter_ebiptables_driver.c: driver for ebtables/iptables on tap devices
  *
- * Copyright (C) 2011-2012 Red Hat, Inc.
+ * Copyright (C) 2011-2013 Red Hat, Inc.
  * Copyright (C) 2010-2012 IBM Corp.
  * Copyright (C) 2010-2012 Stefan Berger
  *
@@ -3596,8 +3596,8 @@ ebiptablesRuleOrderSortPtr(const void *a, const void *b)
 }

 static int
-ebiptablesFilterOrderSort(const virHashKeyValuePairPtr a,
-                          const virHashKeyValuePairPtr b)
+ebiptablesFilterOrderSort(const virHashKeyValuePair *a,
+                          const virHashKeyValuePair *b)
 {
     /* elements' values has been limited to range [-1000, 1000] */
     return *(virNWFilterChainPriority *)a->value -
diff --git a/src/util/virhash.c b/src/util/virhash.c
index 41c5920..0857805 100644
--- a/src/util/virhash.c
+++ b/src/util/virhash.c
@@ -3,7 +3,7 @@
  *
  * Reference: Your favorite introductory book on algorithms
  *
- * Copyright (C) 2005-2012 Red Hat, Inc.
+ * Copyright (C) 2005-2013 Red Hat, Inc.
  * Copyright (C) 2000 Bjorn Reese and Daniel Veillard.
  *
  * Permission to use, copy, modify, and distribute this software for any
@@ -98,7 +98,7 @@ static void virHashStrFree(void *name)


 static size_t
-virHashComputeKey(virHashTablePtr table, const void *name)
+virHashComputeKey(const virHashTable *table, const void *name)
 {
     uint32_t value = table->keyCode(name, table->seed);
     return value % table->size;
@@ -361,7 +361,7 @@ virHashUpdateEntry(virHashTablePtr table, const void *name,
  * Returns a pointer to the userdata
  */
 void *
-virHashLookup(virHashTablePtr table, const void *name)
+virHashLookup(const virHashTable *table, const void *name)
 {
     size_t key;
     virHashEntryPtr entry;
@@ -411,7 +411,7 @@ void *virHashSteal(virHashTablePtr table, const void *name)
  * -1 in case of error
  */
 ssize_t
-virHashSize(virHashTablePtr table)
+virHashSize(const virHashTable *table)
 {
     if (table == NULL)
         return -1;
@@ -428,7 +428,7 @@ virHashSize(virHashTablePtr table)
  * -1 in case of error
  */
 ssize_t
-virHashTableSize(virHashTablePtr table)
+virHashTableSize(const virHashTable *table)
 {
     if (table == NULL)
         return -1;
@@ -609,12 +609,15 @@ virHashRemoveAll(virHashTablePtr table)
  * returns non-zero will be returned by this function.
  * The elements are processed in a undefined order
  */
-void *virHashSearch(virHashTablePtr table,
+void *virHashSearch(const virHashTable *ctable,
                     virHashSearcher iter,
                     const void *data)
 {
     size_t i;

+    /* Cast away const for internal detection of misuse.  */
+    virHashTablePtr table = (virHashTablePtr)ctable;
+
     if (table == NULL || iter == NULL)
         return NULL;

@@ -683,7 +686,7 @@ virHashKeyValuePairPtr virHashGetItems(virHashTablePtr table,
 struct virHashEqualData
 {
     bool equal;
-    const virHashTablePtr table2;
+    const virHashTable *table2;
     virHashValueComparator compar;
 };

@@ -704,8 +707,8 @@ static int virHashEqualSearcher(const void *payload, const void *name,
     return 0;
 }

-bool virHashEqual(const virHashTablePtr table1,
-                  const virHashTablePtr table2,
+bool virHashEqual(const virHashTable *table1,
+                  const virHashTable *table2,
                   virHashValueComparator compar)
 {
     struct virHashEqualData data = {
diff --git a/src/util/virhash.h b/src/util/virhash.h
index 2c04f81..4de9a14 100644
--- a/src/util/virhash.h
+++ b/src/util/virhash.h
@@ -3,7 +3,7 @@
  * Description: This module implements the hash table and allocation and
  *              deallocation of domains and connections
  *
- * Copyright (C) 2005-2012 Red Hat, Inc.
+ * Copyright (C) 2005-2013 Red Hat, Inc.
  * Copyright (C) 2000 Bjorn Reese and Daniel Veillard.
  *
  * Author: Bjorn Reese <bjorn.reese at systematic.dk>
@@ -108,8 +108,8 @@ virHashTablePtr virHashCreateFull(ssize_t size,
                                   virHashKeyCopy keyCopy,
                                   virHashKeyFree keyFree);
 void virHashFree(virHashTablePtr table);
-ssize_t virHashSize(virHashTablePtr table);
-ssize_t virHashTableSize(virHashTablePtr table);
+ssize_t virHashSize(const virHashTable *table);
+ssize_t virHashTableSize(const virHashTable *table);

 /*
  * Add a new entry to the hash table.
@@ -134,7 +134,7 @@ ssize_t virHashRemoveAll(virHashTablePtr table);
 /*
  * Retrieve the userdata.
  */
-void *virHashLookup(virHashTablePtr table, const void *name);
+void *virHashLookup(const virHashTable *table, const void *name);

 /*
  * Retrieve & remove the userdata.
@@ -159,8 +159,8 @@ struct _virHashKeyValuePair {
     const void *key;
     const void *value;
 };
-typedef int (*virHashKeyComparator)(const virHashKeyValuePairPtr,
-                                    const virHashKeyValuePairPtr);
+typedef int (*virHashKeyComparator)(const virHashKeyValuePair *,
+                                    const virHashKeyValuePair *);
 virHashKeyValuePairPtr virHashGetItems(virHashTablePtr table,
                                        virHashKeyComparator compar);

@@ -171,8 +171,8 @@ virHashKeyValuePairPtr virHashGetItems(virHashTablePtr table,
  * of two keys.
  */
 typedef int (*virHashValueComparator)(const void *value1, const void *value2);
-bool virHashEqual(const virHashTablePtr table1,
-                  const virHashTablePtr table2,
+bool virHashEqual(const virHashTable *table1,
+                  const virHashTable *table2,
                   virHashValueComparator compar);


@@ -181,6 +181,7 @@ bool virHashEqual(const virHashTablePtr table1,
  */
 ssize_t virHashForEach(virHashTablePtr table, virHashIterator iter, void *data);
 ssize_t virHashRemoveSet(virHashTablePtr table, virHashSearcher iter, const void *data);
-void *virHashSearch(virHashTablePtr table, virHashSearcher iter, const void *data);
+void *virHashSearch(const virHashTable *table, virHashSearcher iter,
+                    const void *data);

 #endif                          /* ! __VIR_HASH_H__ */
diff --git a/tests/virhashtest.c b/tests/virhashtest.c
index 5119781..dbc0dba 100644
--- a/tests/virhashtest.c
+++ b/tests/virhashtest.c
@@ -499,15 +499,15 @@ cleanup:


 static int
-testHashGetItemsCompKey(const virHashKeyValuePairPtr a,
-                        const virHashKeyValuePairPtr b)
+testHashGetItemsCompKey(const virHashKeyValuePair *a,
+                        const virHashKeyValuePair *b)
 {
     return strcmp(a->key, b->key);
 }

 static int
-testHashGetItemsCompValue(const virHashKeyValuePairPtr a,
-                          const virHashKeyValuePairPtr b)
+testHashGetItemsCompValue(const virHashKeyValuePair *a,
+                          const virHashKeyValuePair *b)
 {
     return strcmp(a->value, b->value);
 }
-- 
1.8.3.1




More information about the libvir-list mailing list