*/
struct ast_event_ref {
struct ast_event *event;
+ unsigned int cache;
};
struct ast_event_ie_val {
ao2_unlock(cache);
}
-int ast_event_queue_and_cache(struct ast_event *event)
-{
- struct ao2_container *container;
-
- container = ast_event_cache[ast_event_get_type(event)].container;
- if (!container) {
- ast_log(LOG_WARNING, "cache requested for non-cached event type\n");
- } else {
- event_update_cache(container, event);
- }
-
- if (ast_event_queue(event)) {
- ast_event_destroy(event);
- }
- return 0;
-}
-
static int handle_event(void *data)
{
struct ast_event_ref *event_ref = data;
};
int i;
+ if (event_ref->cache) {
+ struct ao2_container *container;
+ container = ast_event_cache[ast_event_get_type(event_ref->event)].container;
+ if (!container) {
+ ast_log(LOG_WARNING, "cache requested for non-cached event type\n");
+ } else {
+ event_update_cache(container, event_ref->event);
+ }
+ }
+
for (i = 0; i < ARRAY_LEN(event_types); i++) {
AST_RWDLLIST_RDLOCK(&ast_event_subs[event_types[i]]);
AST_RWDLLIST_TRAVERSE(&ast_event_subs[event_types[i]], sub, entry) {
return 0;
}
-int ast_event_queue(struct ast_event *event)
+static int _ast_event_queue(struct ast_event *event, unsigned int cache)
{
struct ast_event_ref *event_ref;
uint16_t host_event_type;
}
event_ref->event = event;
+ event_ref->cache = cache;
res = ast_taskprocessor_push(event_dispatcher, handle_event, event_ref);
if (res) {
return res;
}
+int ast_event_queue(struct ast_event *event)
+{
+ return _ast_event_queue(event, 0);
+}
+
+int ast_event_queue_and_cache(struct ast_event *event)
+{
+ return _ast_event_queue(event, 1);
+}
+
static int ast_event_hash_mwi(const void *obj, const int flags)
{
const struct ast_event *event = obj;