From 455ca1095e525de6c4c6a98a0dce1a8ee3042189 Mon Sep 17 00:00:00 2001 From: Joshua Colp <jcolp@digium.com> Date: Mon, 6 Aug 2018 08:36:22 -0300 Subject: [PATCH] stasis: Reduce calculation of stasis message type hash. When the stasis cache is used a hash is calculated for retrieving or inserting messages. This change calculates a hash when the message type is initialized that is then used each time needed. This ensures that the hash is calculated only once for the message type. Change-Id: I4fe6bfdafb55bf5c322dd313fbd8c32cce73ef37 --- include/asterisk/stasis.h | 8 ++++++++ main/stasis_cache.c | 2 +- main/stasis_message.c | 8 ++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/include/asterisk/stasis.h b/include/asterisk/stasis.h index 0373eeb35e..bca6d40259 100644 --- a/include/asterisk/stasis.h +++ b/include/asterisk/stasis.h @@ -318,6 +318,14 @@ enum stasis_message_type_result stasis_message_type_create(const char *name, */ const char *stasis_message_type_name(const struct stasis_message_type *type); +/*! + * \brief Gets the hash of a given message type + * \param type The type to get the hash of. + * \return The hash + * \since 13.24.0 + */ +unsigned int stasis_message_type_hash(const struct stasis_message_type *type); + /*! * \brief Check whether a message type is declined * diff --git a/main/stasis_cache.c b/main/stasis_cache.c index ca17bdd263..8c3c7f15b6 100644 --- a/main/stasis_cache.c +++ b/main/stasis_cache.c @@ -174,7 +174,7 @@ static void cache_entry_dtor(void *obj) static void cache_entry_compute_hash(struct cache_entry_key *key) { - key->hash = ast_hashtab_hash_string(stasis_message_type_name(key->type)); + key->hash = stasis_message_type_hash(key->type); key->hash += ast_hashtab_hash_string(key->id); } diff --git a/main/stasis_message.c b/main/stasis_message.c index 88db49f1a6..482dd01d40 100644 --- a/main/stasis_message.c +++ b/main/stasis_message.c @@ -32,11 +32,13 @@ #include "asterisk/astobj2.h" #include "asterisk/stasis.h" #include "asterisk/utils.h" +#include "asterisk/hashtab.h" /*! \internal */ struct stasis_message_type { struct stasis_message_vtable *vtable; char *name; + unsigned int hash; }; static struct stasis_message_vtable null_vtable = {}; @@ -73,6 +75,7 @@ int stasis_message_type_create(const char *name, ao2_cleanup(type); return STASIS_MESSAGE_TYPE_ERROR; } + type->hash = ast_hashtab_hash_string(name); type->vtable = vtable; *result = type; @@ -84,6 +87,11 @@ const char *stasis_message_type_name(const struct stasis_message_type *type) return type->name; } +unsigned int stasis_message_type_hash(const struct stasis_message_type *type) +{ + return type->hash; +} + /*! \internal */ struct stasis_message { /*! Time the message was created */ -- GitLab