summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorJeff Peeler <jpeeler@digium.com>2010-01-28 22:37:15 +0000
committerJeff Peeler <jpeeler@digium.com>2010-01-28 22:37:15 +0000
commit80d3e91714c9664dec2da889fefcefa254884be0 (patch)
tree255e254ebc32ba8dbd63b039c42ac02c87234776 /main
parent397ec3328488c821df278c76aa966f5f419831d9 (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: https://origsvn.digium.com/svn/asterisk/trunk@243986 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main')
-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;
}