mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-07 10:28:32 +00:00
automerge commit
git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2-netsec@8449 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -755,6 +755,48 @@ static void rt_handle_member_record(struct ast_call_queue *q, char *interface, c
|
||||
}
|
||||
}
|
||||
|
||||
static void free_members(struct ast_call_queue *q, int all)
|
||||
{
|
||||
/* Free non-dynamic members */
|
||||
struct member *curm, *next, *prev = NULL;
|
||||
|
||||
for (curm = q->members; curm; curm = next) {
|
||||
next = curm->next;
|
||||
if (all || !curm->dynamic) {
|
||||
if (prev)
|
||||
prev->next = next;
|
||||
else
|
||||
q->members = next;
|
||||
free(curm);
|
||||
} else
|
||||
prev = curm;
|
||||
}
|
||||
}
|
||||
|
||||
static void destroy_queue(struct ast_call_queue *q)
|
||||
{
|
||||
free_members(q, 1);
|
||||
ast_mutex_destroy(&q->lock);
|
||||
free(q);
|
||||
}
|
||||
|
||||
static void remove_queue(struct ast_call_queue *q)
|
||||
{
|
||||
struct ast_call_queue *cur, *prev = NULL;
|
||||
|
||||
ast_mutex_lock(&qlock);
|
||||
for (cur = queues; cur; cur = cur->next) {
|
||||
if (cur == q) {
|
||||
if (prev)
|
||||
prev->next = cur->next;
|
||||
else
|
||||
queues = cur->next;
|
||||
} else {
|
||||
prev = cur;
|
||||
}
|
||||
}
|
||||
ast_mutex_unlock(&qlock);
|
||||
}
|
||||
|
||||
/*!\brief Reload a single queue via realtime.
|
||||
\return Return the queue, or NULL if it doesn't exist.
|
||||
@@ -811,7 +853,7 @@ static struct ast_call_queue *find_queue_by_name_rt(const char *queuename, struc
|
||||
prev_q->next = q->next;
|
||||
}
|
||||
ast_mutex_unlock(&q->lock);
|
||||
free(q);
|
||||
destroy_queue(q);
|
||||
} else
|
||||
ast_mutex_unlock(&q->lock);
|
||||
}
|
||||
@@ -997,48 +1039,6 @@ ast_log(LOG_NOTICE, "Queue '%s' Join, Channel '%s', Position '%d'\n", q->name, q
|
||||
return res;
|
||||
}
|
||||
|
||||
static void free_members(struct ast_call_queue *q, int all)
|
||||
{
|
||||
/* Free non-dynamic members */
|
||||
struct member *curm, *next, *prev;
|
||||
|
||||
curm = q->members;
|
||||
prev = NULL;
|
||||
while(curm) {
|
||||
next = curm->next;
|
||||
if (all || !curm->dynamic) {
|
||||
if (prev)
|
||||
prev->next = next;
|
||||
else
|
||||
q->members = next;
|
||||
free(curm);
|
||||
} else
|
||||
prev = curm;
|
||||
curm = next;
|
||||
}
|
||||
}
|
||||
|
||||
static void destroy_queue(struct ast_call_queue *q)
|
||||
{
|
||||
struct ast_call_queue *cur, *prev = NULL;
|
||||
|
||||
ast_mutex_lock(&qlock);
|
||||
for (cur = queues; cur; cur = cur->next) {
|
||||
if (cur == q) {
|
||||
if (prev)
|
||||
prev->next = cur->next;
|
||||
else
|
||||
queues = cur->next;
|
||||
} else {
|
||||
prev = cur;
|
||||
}
|
||||
}
|
||||
ast_mutex_unlock(&qlock);
|
||||
free_members(q, 1);
|
||||
ast_mutex_destroy(&q->lock);
|
||||
free(q);
|
||||
}
|
||||
|
||||
static int play_file(struct ast_channel *chan, char *filename)
|
||||
{
|
||||
int res;
|
||||
@@ -1246,6 +1246,7 @@ ast_log(LOG_NOTICE, "Queue '%s' Leave, Channel '%s'\n", q->name, qe->chan->name
|
||||
ast_mutex_unlock(&q->lock);
|
||||
if (q->dead && !q->count) {
|
||||
/* It's dead and nobody is in it, so kill it */
|
||||
remove_queue(q);
|
||||
destroy_queue(q);
|
||||
}
|
||||
}
|
||||
@@ -3266,7 +3267,7 @@ static void reload_queues(void)
|
||||
else
|
||||
queues = q->next;
|
||||
if (!q->count) {
|
||||
free(q);
|
||||
destroy_queue(q);
|
||||
} else
|
||||
ast_log(LOG_WARNING, "XXX Leaking a little memory :( XXX\n");
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user