diff options
author | file <file@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-06-12 21:34:38 +0000 |
---|---|---|
committer | file <file@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-06-12 21:34:38 +0000 |
commit | 6088f66ae9ea7e08783832b3595f0e02fa20d5d6 (patch) | |
tree | 0fe288da88b3a4bd777682fe5a64abdbff60713f /channel.c | |
parent | ba80e03980b55e8fb816fe0dc30b4cd15be2381e (diff) |
Greatly simply the mixmonitor thread, and move channel reference directly to spy structure so that the core can modify it.
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.2@33724 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channel.c')
-rw-r--r-- | channel.c | 15 |
1 files changed, 14 insertions, 1 deletions
@@ -964,6 +964,9 @@ void ast_channel_free(struct ast_channel *chan) int ast_channel_spy_add(struct ast_channel *chan, struct ast_channel_spy *spy) { + /* Link the owner channel to the spy */ + spy->chan = chan; + if (!ast_test_flag(spy, CHANSPY_FORMAT_AUDIO)) { ast_log(LOG_WARNING, "Could not add channel spy '%s' to channel '%s', only audio format spies are supported.\n", spy->type, chan->name); @@ -1034,7 +1037,14 @@ void ast_channel_spy_stop_by_type(struct ast_channel *chan, const char *type) void ast_channel_spy_trigger_wait(struct ast_channel_spy *spy) { - ast_cond_wait(&spy->trigger, &spy->lock); + struct timeval tv; + struct timespec ts; + + tv = ast_tvadd(ast_tvnow(), ast_samp2tv(50000, 1000)); + ts.tv_sec = tv.tv_sec; + ts.tv_nsec = tv.tv_usec * 1000; + + ast_cond_timedwait(&spy->trigger, &spy->lock, &ts); } void ast_channel_spy_remove(struct ast_channel *chan, struct ast_channel_spy *spy) @@ -1048,6 +1058,8 @@ void ast_channel_spy_remove(struct ast_channel *chan, struct ast_channel_spy *sp ast_mutex_lock(&spy->lock); + spy->chan = NULL; + for (f = spy->read_queue.head; f; f = spy->read_queue.head) { spy->read_queue.head = f->next; ast_frfree(f); @@ -1085,6 +1097,7 @@ static void detach_spies(struct ast_channel *chan) /* Marking the spies as done is sufficient. Chanspy or spy users will get the picture. */ AST_LIST_TRAVERSE(&chan->spies->list, spy, list) { ast_mutex_lock(&spy->lock); + spy->chan = NULL; if (spy->status == CHANSPY_RUNNING) spy->status = CHANSPY_DONE; if (ast_test_flag(spy, CHANSPY_TRIGGER_MODE) != CHANSPY_TRIGGER_NONE) |