aboutsummaryrefslogtreecommitdiffstats
path: root/apps/app_queue.c
diff options
context:
space:
mode:
authormmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2008-03-28 00:17:17 +0000
committermmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2008-03-28 00:17:17 +0000
commit8e357c3db94b6d543a358e0a52780556fc6b49d5 (patch)
tree3c3693423efd9ce15b1704b6e9bee7c5dfc012b7 /apps/app_queue.c
parentbfc2e778acc2caa2e0099817e126bbae402712e7 (diff)
Merged revisions 111533 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ........ r111533 | mmichelson | 2008-03-27 19:12:52 -0500 (Thu, 27 Mar 2008) | 10 lines Fix a crash that would happen when attempting to unload the app_queue module. The problem was that when the refcount on the queue hit 0, the destructor was called, and inside the destructor, another function was called which would increase the refcount back to 1 again and then decrease it again back to 0 for every member in the queue. This meant that the destructor was being recursively called, leading to a double free of the queue. This is now fixed by making sure to unlink the queue from the queues container prior to the final unref of the queue. ........ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@111534 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps/app_queue.c')
-rw-r--r--apps/app_queue.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/apps/app_queue.c b/apps/app_queue.c
index b8a084491..9a24cc37f 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -1402,8 +1402,6 @@ static void destroy_queue(void *obj)
struct call_queue *q = obj;
int i;
- ast_debug(0, "Queue destructor called for queue '%s'!\n", q->name);
-
free_members(q, 1);
ast_string_field_free_memory(q);
for (i = 0; i < MAX_PERIODIC_ANNOUNCEMENTS; i++) {
@@ -6169,6 +6167,8 @@ static int unload_module(void)
{
int res;
struct ast_context *con;
+ struct ao2_iterator q_iter;
+ struct call_queue *q = NULL;
if (device_state.thread != AST_PTHREADT_NULL) {
device_state.stop = 1;
@@ -6211,6 +6211,11 @@ static int unload_module(void)
clear_and_free_interfaces();
+ q_iter = ao2_iterator_init(queues, 0);
+ while ((q = ao2_iterator_next(&q_iter))) {
+ ao2_unlink(queues, q);
+ queue_unref(q);
+ }
ao2_ref(queues, -1);
return res;