Merge "devicestate: Don't create topic when change isn't cached." into 16

This commit is contained in:
Joshua Colp 2018-07-27 05:37:35 -05:00 committed by Gerrit Code Review
commit 3ce7f3a441
3 changed files with 43 additions and 4 deletions

View File

@ -744,6 +744,16 @@ struct stasis_topic_pool *stasis_topic_pool_create(struct stasis_topic *pooled_t
*/
struct stasis_topic *stasis_topic_pool_get_topic(struct stasis_topic_pool *pool, const char *topic_name);
/*!
* \brief Check if a topic exists in a pool
* \param pool Pool to check
* \param topic_name Name of the topic to check
* \retval 1 exists
* \retval 0 does not exist
* \since 13.23.0
*/
int stasis_topic_pool_topic_exists(const struct stasis_topic_pool *pool, const char *topic_name);
/*! \addtogroup StasisTopicsAndMessages
* @{
*/

View File

@ -714,7 +714,7 @@ int ast_publish_device_state_full(
{
RAII_VAR(struct ast_device_state_message *, device_state, NULL, ao2_cleanup);
RAII_VAR(struct stasis_message *, message, NULL, ao2_cleanup);
struct stasis_topic *device_specific_topic;
struct stasis_topic *topic;
ast_assert(!ast_strlen_zero(device));
@ -733,12 +733,28 @@ int ast_publish_device_state_full(
return -1;
}
device_specific_topic = ast_device_state_topic(device);
if (!device_specific_topic) {
/* When a device state is to be cached it is likely that something
* external will either be monitoring it or will want to pull the
* information from the cache, so we always publish to the device
* specific topic. Cachable updates traditionally come from such things
* as a SIP or PJSIP device.
* When a device state is not to be cached we only publish to its
* specific topic if something has already created the topic. Publishing
* to its topic otherwise would create the topic, which may not be
* necessary as it could be an ephemeral device. Uncachable updates
* traditionally come from such things as Local channels.
*/
if (cachable || stasis_topic_pool_topic_exists(device_state_topic_pool, device)) {
topic = ast_device_state_topic(device);
} else {
topic = ast_device_state_topic_all();
}
if (!topic) {
return -1;
}
stasis_publish(device_specific_topic, message);
stasis_publish(topic, message);
return 0;
}

View File

@ -1196,6 +1196,19 @@ struct stasis_topic *stasis_topic_pool_get_topic(struct stasis_topic_pool *pool,
return topic_pool_entry->topic;
}
int stasis_topic_pool_topic_exists(const struct stasis_topic_pool *pool, const char *topic_name)
{
struct topic_pool_entry *topic_pool_entry;
topic_pool_entry = ao2_find(pool->pool_container, topic_name, OBJ_SEARCH_KEY);
if (!topic_pool_entry) {
return 0;
}
ao2_ref(topic_pool_entry, -1);
return 1;
}
void stasis_log_bad_type_access(const char *name)
{
#ifdef AST_DEVMODE