Skip to content
Snippets Groups Projects
Commit 9d43f99b authored by Russell Bryant's avatar Russell Bryant
Browse files

* The documentation for the LOCK() function says that it will block for up to

  3 seconds while waiting on a lock when other locks are currently held to
  avoid deadlocks.  Change the code to reflect this.
* Since trying to grab a lock may block for some time, put the channel in
  autoservice so that audio is still read from the channel and that any
  active generators on the channel don't pause.


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@84143 65c4cc65-6c06-0410-ace0-fbb531ad65f3
parent b0abdf45
No related branches found
No related tags found
No related merge requests found
......@@ -187,11 +187,12 @@ static int get_lock(struct ast_channel *chan, char *lockname, int try)
/* Okay, we have both frames, so now we need to try to lock the mutex. */
if (count_channel_locks > 1) {
/* If we fail after a certain number of attempts, assume a possible deadlock and bail. */
int x;
for (x = 0; x < 30; x++) {
struct timeval start = ast_tvnow();
for (;;) {
if ((res = ast_mutex_trylock(&current->mutex)) == 0)
break;
if (ast_tvdiff_ms(ast_tvnow(), start) > 3000)
break; /* bail after 3 seconds of waiting */
usleep(1);
}
} else {
......@@ -256,13 +257,19 @@ static int unlock_read(struct ast_channel *chan, const char *cmd, char *data, ch
static int lock_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
{
ast_autoservice_start(chan);
ast_copy_string(buf, get_lock(chan, data, 0) ? "0" : "1", len);
ast_autoservice_stop(chan);
return 0;
}
static int trylock_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
{
ast_autoservice_start(chan);
ast_copy_string(buf, get_lock(chan, data, 1) ? "0" : "1", len);
ast_autoservice_stop(chan);
return 0;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment