diff options
author | jpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b> | 2010-01-28 22:37:15 +0000 |
---|---|---|
committer | jpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b> | 2010-01-28 22:37:15 +0000 |
commit | 19a36bcf931c949bd91c93d4b87605fcd3f35c15 (patch) | |
tree | 255e254ebc32ba8dbd63b039c42ac02c87234776 | |
parent | 26afee496837bd6cc7d7954912114b13696ea401 (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.c | 14 |
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; } |