Relax some over-zealous constification that gave some lhash-based code no
authorGeoff Thorpe <geoff@openssl.org>
Wed, 29 Oct 2003 04:57:05 +0000 (04:57 +0000)
committerGeoff Thorpe <geoff@openssl.org>
Wed, 29 Oct 2003 04:57:05 +0000 (04:57 +0000)
choice but to have to cast away "const" qualifiers from their prototypes.
This does not remove constification restrictions from hash/compare
callbacks, but allows destructor commands to be run over a tables' elements
without bad casts.

CHANGES
crypto/ex_data.c
crypto/lhash/lhash.c
crypto/lhash/lhash.h

diff --git a/CHANGES b/CHANGES
index a75374b3ff0a07e27ebf0ea98fbd99f2c795881b..c206df30ff18362c86d9e3867d6713395991def0 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,17 @@
 
  Changes between 0.9.7c and 0.9.8  [xx XXX xxxx]
 
+  *) Because of the callback-based approach for implementing LHASH as a
+     template type, lh_insert() adds opaque objects to hash-tables and
+     lh_doall() or lh_doall_arg() are typically used with a destructor callback
+     to clean up those corresponding objects before destroying the hash table
+     (and losing the object pointers). So some over-zealous constifications in
+     LHASH have been relaxed so that lh_insert() does not take (nor store) the
+     objects as "const" and the lh_doall[_arg] callback wrappers are not
+     prototyped to have "const" restrictions on the object pointers they are
+     given (and so aren't required to cast them away any more).
+     [Geoff Thorpe]
+
   *) The tmdiff.h API was so ugly and minimal that our own timing utility
      (speed) prefers to use its own implementation. The two implementations
      haven't been consolidated as yet (volunteers?) but the tmdiff API has had
index 5b2e345c27b7b7e4f7f3997a9c89d806526cad7e..f68cf84525951e44097e88a8a1d56710972771c3 100644 (file)
@@ -287,7 +287,7 @@ static void def_cleanup_util_cb(CRYPTO_EX_DATA_FUNCS *funcs)
 /* This callback is used in lh_doall to destroy all EX_CLASS_ITEM values from
  * "ex_data" prior to the ex_data hash table being itself destroyed. Doesn't do
  * any locking. */
-static void def_cleanup_cb(const void *a_void)
+static void def_cleanup_cb(void *a_void)
        {
        EX_CLASS_ITEM *item = (EX_CLASS_ITEM *)a_void;
        sk_CRYPTO_EX_DATA_FUNCS_pop_free(item->meth, def_cleanup_util_cb);
index 0a16fcf27d58904b26a556e044c92b453d13d87e..9856c26d433e024d7c7c198f090e22ec58bf11f4 100644 (file)
@@ -176,7 +176,7 @@ void lh_free(LHASH *lh)
        OPENSSL_free(lh);
        }
 
-void *lh_insert(LHASH *lh, const void *data)
+void *lh_insert(LHASH *lh, void *data)
        {
        unsigned long hash;
        LHASH_NODE *nn,**rn;
index 7c1d4864253498749fccf2ee8fac98eedb28ab8a..d392d0cd80d7fc89a0061353f0faf2f334d55666 100644 (file)
@@ -78,7 +78,7 @@ extern "C" {
 
 typedef struct lhash_node_st
        {
-       const void *data;
+       void *data;
        struct lhash_node_st *next;
 #ifndef OPENSSL_NO_HASH_COMP
        unsigned long hash;
@@ -87,8 +87,8 @@ typedef struct lhash_node_st
 
 typedef int (*LHASH_COMP_FN_TYPE)(const void *, const void *);
 typedef unsigned long (*LHASH_HASH_FN_TYPE)(const void *);
-typedef void (*LHASH_DOALL_FN_TYPE)(const void *);
-typedef void (*LHASH_DOALL_ARG_FN_TYPE)(const void *, void *);
+typedef void (*LHASH_DOALL_FN_TYPE)(void *);
+typedef void (*LHASH_DOALL_ARG_FN_TYPE)(void *, void *);
 
 /* Macros for declaring and implementing type-safe wrappers for LHASH callbacks.
  * This way, callbacks can be provided to LHASH structures without function
@@ -118,18 +118,18 @@ typedef void (*LHASH_DOALL_ARG_FN_TYPE)(const void *, void *);
 
 /* Third: "doall" functions */
 #define DECLARE_LHASH_DOALL_FN(f_name,o_type) \
-       void f_name##_LHASH_DOALL(const void *);
+       void f_name##_LHASH_DOALL(void *);
 #define IMPLEMENT_LHASH_DOALL_FN(f_name,o_type) \
-       void f_name##_LHASH_DOALL(const void *arg) { \
+       void f_name##_LHASH_DOALL(void *arg) { \
                o_type a = (o_type)arg; \
                f_name(a); }
 #define LHASH_DOALL_FN(f_name) f_name##_LHASH_DOALL
 
 /* Fourth: "doall_arg" functions */
 #define DECLARE_LHASH_DOALL_ARG_FN(f_name,o_type,a_type) \
-       void f_name##_LHASH_DOALL_ARG(const void *, void *);
+       void f_name##_LHASH_DOALL_ARG(void *, void *);
 #define IMPLEMENT_LHASH_DOALL_ARG_FN(f_name,o_type,a_type) \
-       void f_name##_LHASH_DOALL_ARG(const void *arg1, void *arg2) { \
+       void f_name##_LHASH_DOALL_ARG(void *arg1, void *arg2) { \
                o_type a = (o_type)arg1; \
                a_type b = (a_type)arg2; \
                f_name(a,b); }
@@ -173,7 +173,7 @@ typedef struct lhash_st
 
 LHASH *lh_new(LHASH_HASH_FN_TYPE h, LHASH_COMP_FN_TYPE c);
 void lh_free(LHASH *lh);
-void *lh_insert(LHASH *lh, const void *data);
+void *lh_insert(LHASH *lh, void *data);
 void *lh_delete(LHASH *lh, const void *data);
 void *lh_retrieve(LHASH *lh, const void *data);
 void lh_doall(LHASH *lh, LHASH_DOALL_FN_TYPE func);