aboutsummaryrefslogtreecommitdiffstats
path: root/res
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2009-03-25 22:02:20 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2009-03-25 22:02:20 +0000
commit7b1e6ccc4e5c0cd147273a0d29afec2fe146fd4f (patch)
tree8e01f20ee75ccf3ca9329414bb33400fff9ca5bc /res
parent493c278a28ad31a01270866ebff960fa63ab0f0a (diff)
Merged revisions 184339 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ........ r184339 | russell | 2009-03-25 16:57:19 -0500 (Wed, 25 Mar 2009) | 35 lines Improve performance of the ast_event cache functionality. This code comes from svn/asterisk/team/russell/event_performance/. Here is a summary of the changes that have been made, in order of both invasiveness and performance impact, from smallest to largest. 1) Asterisk 1.6.1 introduces some additional logic to be able to handle distributed device state. This functionality comes at a cost. One relatively minor change in this patch is that the extra processing required for distributed device state is now completely bypassed if it's not needed. 2) One of the things that I noticed when profiling this code was that a _lot_ of time was spent doing string comparisons. I changed the way strings are represented in an event to include a hash value at the front. So, before doing a string comparison, we do an integer comparison on the hash. 3) Finally, the code that handles the event cache has been re-written. I tried to do this in a such a way that it had minimal impact on the API. I did have to change one API call, though - ast_event_queue_and_cache(). However, the way it works now is nicer, IMO. Each type of event that can be cached (MWI, device state) has its own hash table and rules for hashing and comparing objects. This by far made the biggest impact on performance. For additional details regarding this code and how it was tested, please see the review request. (closes issue #14738) Reported by: russell Review: http://reviewboard.digium.com/r/205/ ........ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.1@184342 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'res')
-rw-r--r--res/ais/evt.c48
1 files changed, 16 insertions, 32 deletions
diff --git a/res/ais/evt.c b/res/ais/evt.c
index 0057f0481..7e8c8adf6 100644
--- a/res/ais/evt.c
+++ b/res/ais/evt.c
@@ -47,6 +47,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$");
#include "asterisk/event.h"
#include "asterisk/config.h"
#include "asterisk/linkedlists.h"
+#include "asterisk/devicestate.h"
#ifndef AST_MODULE
/* XXX HACK */
@@ -111,34 +112,7 @@ void evt_channel_open_cb(SaInvocationT invocation, SaEvtChannelHandleT channel_h
static void queue_event(struct ast_event *ast_event)
{
- enum ast_event_type type;
-
- /*!
- * \todo This hack macks me sad. I need to come up with a better way to
- * figure out whether an event should be cached or not, and what
- * parameters to cache on.
- *
- * As long as the types of events that are supported is limited,
- * this isn't *terrible*, I guess. Perhaps we should just define
- * caching rules in the core, and make them configurable, and not
- * have it be the job of the event publishers.
- */
-
- type = ast_event_get_type(ast_event);
-
- if (type == AST_EVENT_MWI) {
- ast_event_queue_and_cache(ast_event,
- AST_EVENT_IE_MAILBOX, AST_EVENT_IE_PLTYPE_STR,
- AST_EVENT_IE_CONTEXT, AST_EVENT_IE_PLTYPE_STR,
- AST_EVENT_IE_END);
- } else if (type == AST_EVENT_DEVICE_STATE_CHANGE) {
- ast_event_queue_and_cache(ast_event,
- AST_EVENT_IE_DEVICE, AST_EVENT_IE_PLTYPE_STR,
- AST_EVENT_IE_EID, AST_EVENT_IE_PLTYPE_RAW, sizeof(struct ast_eid),
- AST_EVENT_IE_END);
- } else {
- ast_event_queue(ast_event);
- }
+ ast_event_queue_and_cache(ast_event);
}
void evt_event_deliver_cb(SaEvtSubscriptionIdT sub_id,
@@ -341,9 +315,14 @@ static void add_publish_event(struct event_channel *event_channel, const char *e
return;
}
- if (!(publish_event = ast_calloc(1, sizeof(*publish_event))))
+ if (type == AST_EVENT_DEVICE_STATE_CHANGE && ast_enable_distributed_devstate()) {
return;
-
+ }
+
+ if (!(publish_event = ast_calloc(1, sizeof(*publish_event)))) {
+ return;
+ }
+
publish_event->type = type;
ast_log(LOG_DEBUG, "Subscribing to event type %d\n", type);
publish_event->sub = ast_event_subscribe(type, ast_event_cb, event_channel,
@@ -399,9 +378,14 @@ static void add_subscribe_event(struct event_channel *event_channel, const char
return;
}
- if (!(subscribe_event = ast_calloc(1, sizeof(*subscribe_event))))
+ if (type == AST_EVENT_DEVICE_STATE_CHANGE && ast_enable_distributed_devstate()) {
return;
-
+ }
+
+ if (!(subscribe_event = ast_calloc(1, sizeof(*subscribe_event)))) {
+ return;
+ }
+
subscribe_event->type = type;
subscribe_event->id = ast_atomic_fetchadd_int(&unique_id, +1);