summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Harwell <kharwell@digium.com>2015-05-04 17:28:08 -0500
committerKevin Harwell <kharwell@digium.com>2015-05-06 16:09:33 -0500
commit68513e00f781e4b9e87a8464b725b96050b3c9c3 (patch)
treefdf50df3356addc2bee2ca359729cada3dcc4615
parentd6ffbe39b0ffac581c341bda01c88bd8eb4f5073 (diff)
res_stasis_snoop: Spying on a single direction continually increases CPU
Creating a snoop channel in ARI and spying only on a single direction (in or out) results in CPU utilization continually increasing until the CPU is fully consumed. This occurs because frames are being put in the opposing direction's slin factory queue, but not being removed. Fixed the problem by always reading and disposing of frames from the opposite queue of the direction selected. ASTERISK-24938 #closes Change-Id: I935bfd15f1db958f364d9d6b3b45582c0113dd60
-rw-r--r--res/res_stasis_snoop.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/res/res_stasis_snoop.c b/res/res_stasis_snoop.c
index 16d47f8ba..abdef6e46 100644
--- a/res/res_stasis_snoop.c
+++ b/res/res_stasis_snoop.c
@@ -177,12 +177,28 @@ static struct ast_frame *snoop_read(struct ast_channel *chan)
}
/* Only get audio from the spy audiohook if it is active */
- if (snoop->spy_active) {
- ast_audiohook_lock(&snoop->spy);
- frame = ast_audiohook_read_frame(&snoop->spy, snoop->spy_samples, snoop->spy_direction, snoop->spy_format);
- ast_audiohook_unlock(&snoop->spy);
+ if (!snoop->spy_active) {
+ return &ast_null_frame;
}
+ ast_audiohook_lock(&snoop->spy);
+ if (snoop->spy_direction != AST_AUDIOHOOK_DIRECTION_BOTH) {
+ /*
+ * When a singular direction is chosen frames are still written to the
+ * opposing direction's queue. Those frames must be read so the queue
+ * does not continue to grow, however since they are not needed for the
+ * selected direction they can be dropped.
+ */
+ enum ast_audiohook_direction opposing_direction =
+ snoop->spy_direction == AST_AUDIOHOOK_DIRECTION_READ ?
+ AST_AUDIOHOOK_DIRECTION_WRITE : AST_AUDIOHOOK_DIRECTION_READ;
+ ast_frame_dtor(ast_audiohook_read_frame(&snoop->spy, snoop->spy_samples,
+ opposing_direction, snoop->spy_format));
+ }
+
+ frame = ast_audiohook_read_frame(&snoop->spy, snoop->spy_samples, snoop->spy_direction, snoop->spy_format);
+ ast_audiohook_unlock(&snoop->spy);
+
return frame ? frame : &ast_null_frame;
}