summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2016-12-01 13:22:17 -0600
committerGerrit Code Review <gerrit2@gerrit.digium.api>2016-12-01 13:22:17 -0600
commit02588a1aabda2738de69f7a8c06ee5f3f74ff598 (patch)
tree745588d7e4bbe5e74087e5fe47ee77b0cdad6ba4
parent68fc035795f1fa61a6da3800266b67fd123bc5bd (diff)
parent621d886ca70dc12cdce52c6c7a0813d580e8988c (diff)
Merge "Frame deferral: Re-queue deferred frames one-at-a-time."
-rw-r--r--main/channel.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/main/channel.c b/main/channel.c
index bcfb8afa9..00cfa31aa 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -1070,16 +1070,15 @@ void ast_channel_start_defer_frames(struct ast_channel *chan, int defer_hangups)
void ast_channel_stop_defer_frames(struct ast_channel *chan)
{
+ struct ast_frame *f;
+
ast_clear_flag(ast_channel_flags(chan), AST_FLAG_DEFER_FRAMES);
/* Move the deferred frames onto the channel read queue, ahead of other queued frames */
- ast_queue_frame_head(chan, AST_LIST_FIRST(ast_channel_deferred_readq(chan)));
- /* ast_frfree will mosey down the list and free them all */
- if (!AST_LIST_EMPTY(ast_channel_deferred_readq(chan))) {
- ast_frfree(AST_LIST_FIRST(ast_channel_deferred_readq(chan)));
+ while ((f = AST_LIST_REMOVE_HEAD(ast_channel_deferred_readq(chan), frame_list))) {
+ ast_queue_frame_head(chan, f);
+ ast_frfree(f);
}
- /* Reset the list to be empty */
- AST_LIST_HEAD_INIT_NOLOCK(ast_channel_deferred_readq(chan));
}
static int __ast_queue_frame(struct ast_channel *chan, struct ast_frame *fin, int head, struct ast_frame *after)
@@ -3901,10 +3900,10 @@ static struct ast_frame *__ast_read(struct ast_channel *chan, int dropaudio)
struct ast_frame *dup;
dup = ast_frdup(f);
- AST_LIST_INSERT_TAIL(ast_channel_deferred_readq(chan), dup, frame_list);
+ AST_LIST_INSERT_HEAD(ast_channel_deferred_readq(chan), dup, frame_list);
}
} else {
- AST_LIST_INSERT_TAIL(ast_channel_deferred_readq(chan), f, frame_list);
+ AST_LIST_INSERT_HEAD(ast_channel_deferred_readq(chan), f, frame_list);
AST_LIST_REMOVE_CURRENT(frame_list);
}
}