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 a75374b..c206df3 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 5b2e345..f68cf84 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 0a16fcf..9856c26 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 7c1d486..d392d0c 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);