mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-30 02:26:23 +00:00
Merge "stasis: No need to keep a stasis type ref in a stasis msg or cache object." into 16
This commit is contained in:
@@ -156,7 +156,6 @@ static void cache_entry_dtor(void *obj)
|
|||||||
struct stasis_cache_entry *entry = obj;
|
struct stasis_cache_entry *entry = obj;
|
||||||
size_t idx;
|
size_t idx;
|
||||||
|
|
||||||
ao2_cleanup(entry->key.type);
|
|
||||||
entry->key.type = NULL;
|
entry->key.type = NULL;
|
||||||
ast_free((char *) entry->key.id);
|
ast_free((char *) entry->key.id);
|
||||||
entry->key.id = NULL;
|
entry->key.id = NULL;
|
||||||
@@ -204,7 +203,16 @@ static struct stasis_cache_entry *cache_entry_create(struct stasis_message_type
|
|||||||
ao2_cleanup(entry);
|
ao2_cleanup(entry);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
entry->key.type = ao2_bump(type);
|
/*
|
||||||
|
* Normal ao2 ref counting rules says we should increment the message
|
||||||
|
* type ref here and decrement it in cache_entry_dtor(). However, the
|
||||||
|
* stasis message snapshot is cached here, will always have the same type
|
||||||
|
* as the cache entry, and can legitimately cause the type ref count to
|
||||||
|
* hit the excessive ref count assertion. Since the cache entry will
|
||||||
|
* always have a snapshot we can get away with not holding a ref here.
|
||||||
|
*/
|
||||||
|
ast_assert(type == stasis_message_type(snapshot));
|
||||||
|
entry->key.type = type;
|
||||||
cache_entry_compute_hash(&entry->key);
|
cache_entry_compute_hash(&entry->key);
|
||||||
|
|
||||||
is_remote = ast_eid_cmp(&ast_eid_default, stasis_message_eid(snapshot)) ? 1 : 0;
|
is_remote = ast_eid_cmp(&ast_eid_default, stasis_message_eid(snapshot)) ? 1 : 0;
|
||||||
|
@@ -110,7 +110,6 @@ struct stasis_message {
|
|||||||
static void stasis_message_dtor(void *obj)
|
static void stasis_message_dtor(void *obj)
|
||||||
{
|
{
|
||||||
struct stasis_message *message = obj;
|
struct stasis_message *message = obj;
|
||||||
ao2_cleanup(message->type);
|
|
||||||
ao2_cleanup(message->data);
|
ao2_cleanup(message->data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -129,7 +128,14 @@ struct stasis_message *stasis_message_create_full(struct stasis_message_type *ty
|
|||||||
}
|
}
|
||||||
|
|
||||||
message->timestamp = ast_tvnow();
|
message->timestamp = ast_tvnow();
|
||||||
ao2_ref(type, +1);
|
/*
|
||||||
|
* XXX Normal ao2 ref counting rules says we should increment the message
|
||||||
|
* type ref here and decrement it in stasis_message_dtor(). However, the
|
||||||
|
* stasis message could be cached and legitimately cause the type ref count
|
||||||
|
* to hit the excessive ref count assertion. Since the message type
|
||||||
|
* practically has to be a global object anyway, we can get away with not
|
||||||
|
* holding a ref in the stasis message.
|
||||||
|
*/
|
||||||
message->type = type;
|
message->type = type;
|
||||||
ao2_ref(data, +1);
|
ao2_ref(data, +1);
|
||||||
message->data = data;
|
message->data = data;
|
||||||
|
Reference in New Issue
Block a user