From: Dr. Stephen Henson Date: Thu, 24 Dec 2015 15:51:23 +0000 (+0000) Subject: Add lh_new() inlining X-Git-Tag: OpenSSL_1_1_0-pre2~70 X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff_plain;h=62d0577e0d5e3703436d0fba362d516481291810;hp=e6b5c341b94d357b0158ad74b12edd51399a4b87 Add lh_new() inlining Reviewed-by: Rich Salz --- diff --git a/apps/openssl.c b/apps/openssl.c index 539de761f0..6bd14ffce8 100644 --- a/apps/openssl.c +++ b/apps/openssl.c @@ -700,15 +700,11 @@ static int function_cmp(const FUNCTION * a, const FUNCTION * b) return strncmp(a->name, b->name, 8); } -static IMPLEMENT_LHASH_COMP_FN(function, FUNCTION) - static unsigned long function_hash(const FUNCTION * a) { return lh_strhash(a->name); } -static IMPLEMENT_LHASH_HASH_FN(function, FUNCTION) - static int SortFnByName(const void *_f1, const void *_f2) { const FUNCTION *f1 = _f1; @@ -860,7 +856,7 @@ static LHASH_OF(FUNCTION) *prog_init(void) for (i = 0, f = functions; f->name != NULL; ++f, ++i) ; qsort(functions, i, sizeof(*functions), SortFnByName); - if ((ret = lh_FUNCTION_new()) == NULL) + if ((ret = lh_FUNCTION_new(function_hash, function_cmp)) == NULL) return (NULL); for (f = functions; f->name != NULL; f++) diff --git a/crypto/conf/conf_api.c b/crypto/conf/conf_api.c index 3421ee3d00..408e49725c 100644 --- a/crypto/conf/conf_api.c +++ b/crypto/conf/conf_api.c @@ -162,8 +162,6 @@ static unsigned long conf_value_hash(const CONF_VALUE *v) return (lh_strhash(v->section) << 2) ^ lh_strhash(v->name); } -static IMPLEMENT_LHASH_HASH_FN(conf_value, CONF_VALUE) - static int conf_value_cmp(const CONF_VALUE *a, const CONF_VALUE *b) { int i; @@ -183,17 +181,16 @@ static int conf_value_cmp(const CONF_VALUE *a, const CONF_VALUE *b) return ((a->name == NULL) ? -1 : 1); } -static IMPLEMENT_LHASH_COMP_FN(conf_value, CONF_VALUE) - int _CONF_new_data(CONF *conf) { if (conf == NULL) { return 0; } - if (conf->data == NULL) - if ((conf->data = lh_CONF_VALUE_new()) == NULL) { + if (conf->data == NULL) { + conf->data = lh_CONF_VALUE_new(conf_value_hash, conf_value_cmp); + if (conf->data == NULL) return 0; - } + } return 1; } diff --git a/crypto/engine/eng_table.c b/crypto/engine/eng_table.c index 73e72fe3d3..220d632bda 100644 --- a/crypto/engine/eng_table.c +++ b/crypto/engine/eng_table.c @@ -106,9 +106,6 @@ static int engine_pile_cmp(const ENGINE_PILE *a, const ENGINE_PILE *b) return a->nid - b->nid; } -static IMPLEMENT_LHASH_HASH_FN(engine_pile, ENGINE_PILE) -static IMPLEMENT_LHASH_COMP_FN(engine_pile, ENGINE_PILE) - static int int_table_check(ENGINE_TABLE **t, int create) { LHASH_OF(ENGINE_PILE) *lh; @@ -117,7 +114,7 @@ static int int_table_check(ENGINE_TABLE **t, int create) return 1; if (!create) return 0; - if ((lh = lh_ENGINE_PILE_new()) == NULL) + if ((lh = lh_ENGINE_PILE_new(engine_pile_hash, engine_pile_cmp)) == NULL) return 0; *t = (ENGINE_TABLE *)lh; return 1; diff --git a/crypto/err/err.c b/crypto/err/err.c index 5ad5487b8f..c78e810cdf 100644 --- a/crypto/err/err.c +++ b/crypto/err/err.c @@ -240,11 +240,6 @@ static LHASH_OF(ERR_STATE) *int_thread_hash = NULL; static int int_thread_hash_references = 0; static int int_err_library_number = ERR_LIB_USER; -/* - * These are the callbacks provided to "lh_new()" when creating the LHASH - * tables internal to the "err_defaults" implementation. - */ - static unsigned long get_error_values(int inc, int top, const char **file, int *line, const char **data, int *flags); @@ -258,16 +253,12 @@ static unsigned long err_string_data_hash(const ERR_STRING_DATA *a) return (ret ^ ret % 19 * 13); } -static IMPLEMENT_LHASH_HASH_FN(err_string_data, ERR_STRING_DATA) - static int err_string_data_cmp(const ERR_STRING_DATA *a, const ERR_STRING_DATA *b) { return (int)(a->error - b->error); } -static IMPLEMENT_LHASH_COMP_FN(err_string_data, ERR_STRING_DATA) - static LHASH_OF(ERR_STRING_DATA) *get_hash(int create, int lockit) { LHASH_OF(ERR_STRING_DATA) *ret = NULL; @@ -275,7 +266,8 @@ static LHASH_OF(ERR_STRING_DATA) *get_hash(int create, int lockit) if (lockit) CRYPTO_w_lock(CRYPTO_LOCK_ERR); if (!int_error_hash && create) { - int_error_hash = lh_ERR_STRING_DATA_new(); + int_error_hash = lh_ERR_STRING_DATA_new(err_string_data_hash, + err_string_data_cmp); } if (int_error_hash != NULL) ret = int_error_hash; @@ -304,15 +296,11 @@ static unsigned long err_state_hash(const ERR_STATE *a) return CRYPTO_THREADID_hash(&a->tid) * 13; } -static IMPLEMENT_LHASH_HASH_FN(err_state, ERR_STATE) - static int err_state_cmp(const ERR_STATE *a, const ERR_STATE *b) { return CRYPTO_THREADID_cmp(&a->tid, &b->tid); } -static IMPLEMENT_LHASH_COMP_FN(err_state, ERR_STATE) - static LHASH_OF(ERR_STATE) *int_thread_get(int create, int lockit) { LHASH_OF(ERR_STATE) *ret = NULL; @@ -320,7 +308,7 @@ static LHASH_OF(ERR_STATE) *int_thread_get(int create, int lockit) if (lockit) CRYPTO_w_lock(CRYPTO_LOCK_ERR); if (!int_thread_hash && create) { - int_thread_hash = lh_ERR_STATE_new(); + int_thread_hash = lh_ERR_STATE_new(err_state_hash, err_state_cmp); } if (int_thread_hash != NULL) { int_thread_hash_references++; diff --git a/crypto/mem_dbg.c b/crypto/mem_dbg.c index 36ce5f4eb4..2bdfbffba2 100644 --- a/crypto/mem_dbg.c +++ b/crypto/mem_dbg.c @@ -306,8 +306,6 @@ static int mem_cmp(const MEM *a, const MEM *b) #endif } -static IMPLEMENT_LHASH_COMP_FN(mem, MEM) - static unsigned long mem_hash(const MEM *a) { size_t ret; @@ -318,17 +316,11 @@ static unsigned long mem_hash(const MEM *a) return (ret); } -static IMPLEMENT_LHASH_HASH_FN(mem, MEM) - -/* static int app_info_cmp(APP_INFO *a, APP_INFO *b) */ -static int app_info_cmp(const void *a_void, const void *b_void) +static int app_info_cmp(const APP_INFO *a, const APP_INFO *b) { - return CRYPTO_THREADID_cmp(&((const APP_INFO *)a_void)->threadid, - &((const APP_INFO *)b_void)->threadid); + return CRYPTO_THREADID_cmp(&a->threadid, &b->threadid); } -static IMPLEMENT_LHASH_COMP_FN(app_info, APP_INFO) - static unsigned long app_info_hash(const APP_INFO *a) { unsigned long ret; @@ -339,8 +331,6 @@ static unsigned long app_info_hash(const APP_INFO *a) return (ret); } -static IMPLEMENT_LHASH_HASH_FN(app_info, APP_INFO) - static APP_INFO *pop_info(void) { APP_INFO tmp; @@ -377,7 +367,7 @@ int CRYPTO_mem_debug_push(const char *info, const char *file, int line) if ((ami = OPENSSL_malloc(sizeof(*ami))) == NULL) goto err; if (amih == NULL) { - if ((amih = lh_APP_INFO_new()) == NULL) { + if ((amih = lh_APP_INFO_new(app_info_hash, app_info_cmp)) == NULL) { OPENSSL_free(ami); goto err; } @@ -435,7 +425,7 @@ void CRYPTO_mem_debug_malloc(void *addr, size_t num, int before_p, return; } if (mh == NULL) { - if ((mh = lh_MEM_new()) == NULL) { + if ((mh = lh_MEM_new(mem_hash, mem_cmp)) == NULL) { OPENSSL_free(addr); OPENSSL_free(m); addr = NULL; diff --git a/crypto/objects/o_names.c b/crypto/objects/o_names.c index df6240bfd0..f7216f210e 100644 --- a/crypto/objects/o_names.c +++ b/crypto/objects/o_names.c @@ -42,20 +42,15 @@ static STACK_OF(NAME_FUNCS) *name_funcs_stack; * casting without the need for macro-generated wrapper functions. */ -/* static unsigned long obj_name_hash(OBJ_NAME *a); */ -static unsigned long obj_name_hash(const void *a_void); -/* static int obj_name_cmp(OBJ_NAME *a,OBJ_NAME *b); */ -static int obj_name_cmp(const void *a_void, const void *b_void); - -static IMPLEMENT_LHASH_HASH_FN(obj_name, OBJ_NAME) -static IMPLEMENT_LHASH_COMP_FN(obj_name, OBJ_NAME) +static unsigned long obj_name_hash(const OBJ_NAME *a); +static int obj_name_cmp(const OBJ_NAME *a, const OBJ_NAME *b); int OBJ_NAME_init(void) { if (names_lh != NULL) return (1); CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE); - names_lh = lh_OBJ_NAME_new(); + names_lh = lh_OBJ_NAME_new(obj_name_hash, obj_name_cmp); CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE); return (names_lh != NULL); } @@ -103,12 +98,9 @@ int OBJ_NAME_new_index(unsigned long (*hash_func) (const char *), return (ret); } -/* static int obj_name_cmp(OBJ_NAME *a, OBJ_NAME *b) */ -static int obj_name_cmp(const void *a_void, const void *b_void) +static int obj_name_cmp(const OBJ_NAME *a, const OBJ_NAME *b) { int ret; - const OBJ_NAME *a = (const OBJ_NAME *)a_void; - const OBJ_NAME *b = (const OBJ_NAME *)b_void; ret = a->type - b->type; if (ret == 0) { @@ -122,11 +114,9 @@ static int obj_name_cmp(const void *a_void, const void *b_void) return (ret); } -/* static unsigned long obj_name_hash(OBJ_NAME *a) */ -static unsigned long obj_name_hash(const void *a_void) +static unsigned long obj_name_hash(const OBJ_NAME *a) { unsigned long ret; - const OBJ_NAME *a = (const OBJ_NAME *)a_void; if ((name_funcs_stack != NULL) && (sk_NAME_FUNCS_num(name_funcs_stack) > a->type)) { diff --git a/crypto/objects/obj_dat.c b/crypto/objects/obj_dat.c index 51a44a285f..cbd6e346c1 100644 --- a/crypto/objects/obj_dat.c +++ b/crypto/objects/obj_dat.c @@ -134,8 +134,6 @@ static unsigned long added_obj_hash(const ADDED_OBJ *ca) return (ret); } -static IMPLEMENT_LHASH_HASH_FN(added_obj, ADDED_OBJ) - static int added_obj_cmp(const ADDED_OBJ *ca, const ADDED_OBJ *cb) { ASN1_OBJECT *a, *b; @@ -174,13 +172,11 @@ static int added_obj_cmp(const ADDED_OBJ *ca, const ADDED_OBJ *cb) } } -static IMPLEMENT_LHASH_COMP_FN(added_obj, ADDED_OBJ) - static int init_added(void) { if (added != NULL) return (1); - added = lh_ADDED_OBJ_new(); + added = lh_ADDED_OBJ_new(added_obj_hash, added_obj_cmp); return (added != NULL); } diff --git a/include/openssl/lhash.h b/include/openssl/lhash.h index d5097cddd6..057c831dd8 100644 --- a/include/openssl/lhash.h +++ b/include/openssl/lhash.h @@ -195,6 +195,13 @@ void lh_node_usage_stats_bio(const _LHASH *lh, BIO *out); # define DECLARE_LHASH_OF(type) \ LHASH_OF(type) { int dummy; }; \ + static inline LHASH_OF(type) * \ + lh_##type##_new(unsigned long (*hfn)(const type *), \ + int (*cfn)(const type *, const type *)) \ + { \ + return (LHASH_OF(type) *) \ + lh_new((LHASH_HASH_FN_TYPE) hfn, (LHASH_COMP_FN_TYPE)cfn); \ + } \ static inline void lh_##type##_free(LHASH_OF(type) *lh) \ { \ lh_free((_LHASH *)lh); \ @@ -245,8 +252,6 @@ void lh_node_usage_stats_bio(const _LHASH *lh, BIO *out); ((_LHASH *)CHECKED_PTR_OF(LHASH_OF(type),lh)) /* Define wrapper functions. */ -# define LHM_lh_new(type, name) \ - ((LHASH_OF(type) *)lh_new(LHASH_HASH_FN(name), LHASH_COMP_FN(name))) # define LHM_lh_doall(type, lh,fn) lh_doall(CHECKED_LHASH_OF(type, lh), fn) # define LHM_lh_doall_arg(type, lh, fn, arg_type, arg) \ lh_doall_arg(CHECKED_LHASH_OF(type, lh), fn, CHECKED_PTR_OF(arg_type, arg)) diff --git a/include/openssl/safestack.h b/include/openssl/safestack.h index 5fc1a449a9..43493fc1e0 100644 --- a/include/openssl/safestack.h +++ b/include/openssl/safestack.h @@ -231,62 +231,50 @@ DEFINE_SPECIAL_STACK_OF(OPENSSL_BLOCK, void) */ -# define lh_ADDED_OBJ_new() LHM_lh_new(ADDED_OBJ,added_obj) # define lh_ADDED_OBJ_doall(lh,fn) LHM_lh_doall(ADDED_OBJ,lh,fn) # define lh_ADDED_OBJ_doall_arg(lh,fn,arg_type,arg) \ LHM_lh_doall_arg(ADDED_OBJ,lh,fn,arg_type,arg) -# define lh_APP_INFO_new() LHM_lh_new(APP_INFO,app_info) # define lh_APP_INFO_doall(lh,fn) LHM_lh_doall(APP_INFO,lh,fn) # define lh_APP_INFO_doall_arg(lh,fn,arg_type,arg) \ LHM_lh_doall_arg(APP_INFO,lh,fn,arg_type,arg) -# define lh_CONF_VALUE_new() LHM_lh_new(CONF_VALUE,conf_value) # define lh_CONF_VALUE_doall(lh,fn) LHM_lh_doall(CONF_VALUE,lh,fn) # define lh_CONF_VALUE_doall_arg(lh,fn,arg_type,arg) \ LHM_lh_doall_arg(CONF_VALUE,lh,fn,arg_type,arg) -# define lh_ENGINE_PILE_new() LHM_lh_new(ENGINE_PILE,engine_pile) # define lh_ENGINE_PILE_doall(lh,fn) LHM_lh_doall(ENGINE_PILE,lh,fn) # define lh_ENGINE_PILE_doall_arg(lh,fn,arg_type,arg) \ LHM_lh_doall_arg(ENGINE_PILE,lh,fn,arg_type,arg) -# define lh_ERR_STATE_new() LHM_lh_new(ERR_STATE,err_state) # define lh_ERR_STATE_doall(lh,fn) LHM_lh_doall(ERR_STATE,lh,fn) # define lh_ERR_STATE_doall_arg(lh,fn,arg_type,arg) \ LHM_lh_doall_arg(ERR_STATE,lh,fn,arg_type,arg) -# define lh_ERR_STRING_DATA_new() LHM_lh_new(ERR_STRING_DATA,err_string_data) # define lh_ERR_STRING_DATA_doall(lh,fn) LHM_lh_doall(ERR_STRING_DATA,lh,fn) # define lh_ERR_STRING_DATA_doall_arg(lh,fn,arg_type,arg) \ LHM_lh_doall_arg(ERR_STRING_DATA,lh,fn,arg_type,arg) -# define lh_FUNCTION_new() LHM_lh_new(FUNCTION,function) # define lh_FUNCTION_doall(lh,fn) LHM_lh_doall(FUNCTION,lh,fn) # define lh_FUNCTION_doall_arg(lh,fn,arg_type,arg) \ LHM_lh_doall_arg(FUNCTION,lh,fn,arg_type,arg) -# define lh_MEM_new() LHM_lh_new(MEM,mem) # define lh_MEM_doall(lh,fn) LHM_lh_doall(MEM,lh,fn) # define lh_MEM_doall_arg(lh,fn,arg_type,arg) \ LHM_lh_doall_arg(MEM,lh,fn,arg_type,arg) -# define lh_OBJ_NAME_new() LHM_lh_new(OBJ_NAME,obj_name) # define lh_OBJ_NAME_doall(lh,fn) LHM_lh_doall(OBJ_NAME,lh,fn) # define lh_OBJ_NAME_doall_arg(lh,fn,arg_type,arg) \ LHM_lh_doall_arg(OBJ_NAME,lh,fn,arg_type,arg) -# define lh_OPENSSL_CSTRING_new() LHM_lh_new(OPENSSL_CSTRING,openssl_cstring) # define lh_OPENSSL_CSTRING_doall(lh,fn) LHM_lh_doall(OPENSSL_CSTRING,lh,fn) # define lh_OPENSSL_CSTRING_doall_arg(lh,fn,arg_type,arg) \ LHM_lh_doall_arg(OPENSSL_CSTRING,lh,fn,arg_type,arg) -# define lh_OPENSSL_STRING_new() LHM_lh_new(OPENSSL_STRING,openssl_string) # define lh_OPENSSL_STRING_doall(lh,fn) LHM_lh_doall(OPENSSL_STRING,lh,fn) # define lh_OPENSSL_STRING_doall_arg(lh,fn,arg_type,arg) \ LHM_lh_doall_arg(OPENSSL_STRING,lh,fn,arg_type,arg) -# define lh_SSL_SESSION_new() LHM_lh_new(SSL_SESSION,ssl_session) # define lh_SSL_SESSION_doall(lh,fn) LHM_lh_doall(SSL_SESSION,lh,fn) # define lh_SSL_SESSION_doall_arg(lh,fn,arg_type,arg) \ LHM_lh_doall_arg(SSL_SESSION,lh,fn,arg_type,arg) diff --git a/ssl/ssl_lib.c b/ssl/ssl_lib.c index 1666cd2880..f3eb5b043f 100644 --- a/ssl/ssl_lib.c +++ b/ssl/ssl_lib.c @@ -2228,8 +2228,6 @@ static int ssl_session_cmp(const SSL_SESSION *a, const SSL_SESSION *b) * variable. The reason is that the functions aren't static, they're exposed * via ssl.h. */ -static IMPLEMENT_LHASH_HASH_FN(ssl_session, SSL_SESSION) -static IMPLEMENT_LHASH_COMP_FN(ssl_session, SSL_SESSION) SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth) { @@ -2266,7 +2264,7 @@ SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth) if ((ret->cert = ssl_cert_new()) == NULL) goto err; - ret->sessions = lh_SSL_SESSION_new(); + ret->sessions = lh_SSL_SESSION_new(ssl_session_hash, ssl_session_cmp); if (ret->sessions == NULL) goto err; ret->cert_store = X509_STORE_new(); diff --git a/util/mkstack.pl b/util/mkstack.pl index 5ddd3bdf83..e188840595 100755 --- a/util/mkstack.pl +++ b/util/mkstack.pl @@ -275,7 +275,6 @@ foreach $type_thing (sort @lhashlst) { my $lc_tt = lc $type_thing; $new_stackfile .= <