aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b>2010-01-28 22:37:15 +0000
committerjpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b>2010-01-28 22:37:15 +0000
commit19a36bcf931c949bd91c93d4b87605fcd3f35c15 (patch)
tree255e254ebc32ba8dbd63b039c42ac02c87234776
parent26afee496837bd6cc7d7954912114b13696ea401 (diff)
Optimization to manager events.
When potentially sending manager events, return immediately if there are no sessions or hooks. Also, avoid locking the hooks list if it is empty. (issue #16455) Reported by: atis Patches: manager_hooks_trunk.patch uploaded by atis (license 242) git-svn-id: http://svn.digium.com/svn/asterisk/trunk@243986 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--main/manager.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/main/manager.c b/main/manager.c
index 2d1fa476d..fdcf2bbc8 100644
--- a/main/manager.c
+++ b/main/manager.c
@@ -4286,6 +4286,10 @@ int __ast_manager_event_multichan(int category, const char *event, int chancount
struct ast_str *buf;
int i;
+ if (!sessions && AST_RWLIST_EMPTY(&manager_hooks)) {
+ return 0;
+ }
+
if (!(buf = ast_str_thread_get(&manager_event_buf, MANAGER_EVENT_BUF_INITSIZE))) {
return -1;
}
@@ -4343,11 +4347,13 @@ int __ast_manager_event_multichan(int category, const char *event, int chancount
ao2_iterator_destroy(&i);
}
- AST_RWLIST_RDLOCK(&manager_hooks);
- AST_RWLIST_TRAVERSE(&manager_hooks, hook, list) {
- hook->helper(category, event, ast_str_buffer(buf));
+ if (!AST_RWLIST_EMPTY(&manager_hooks)) {
+ AST_RWLIST_RDLOCK(&manager_hooks);
+ AST_RWLIST_TRAVERSE(&manager_hooks, hook, list) {
+ hook->helper(category, event, ast_str_buffer(buf));
+ }
+ AST_RWLIST_UNLOCK(&manager_hooks);
}
- AST_RWLIST_UNLOCK(&manager_hooks);
return 0;
}