aboutsummaryrefslogtreecommitdiffstats
path: root/main
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 /main
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
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;
}