summaryrefslogtreecommitdiff
path: root/main/sched.c
diff options
context:
space:
mode:
authorYousf Ateya <y.ateya@starkbits.com>2015-04-20 23:00:00 +0200
committerYousf Ateya <y.ateya@starkbits.com>2015-05-20 23:27:42 +0200
commit83ff268b9ed3f130b79d4d9a106682e274ce94fd (patch)
tree434464efb79e2cefcd34278c0f4405e7ffddcc77 /main/sched.c
parent06ba1e59cbe2b62b6c1978d913b7a1fcc20d8d4d (diff)
chan_iax2: Prevent deadlock between hangup and sending lagrq/ping
channels/chan_iax.c: Prevent the deadlock between iax2_hangup and send_lagrq/ send_ping. This deadlock happens because the scheduled task send_lagrq(or send_ping) starts execution after the call hangup procedure starts but before it deletes the tasks in the scheduler. The solution is to delete scheduled lagrq (and ping) task asynchronously (i.e. schedule AST_SCHED_DEL for these tasks); By this, AST_SCHED_DEL will be called in a new context (doesn't have callno locked). This commit also cleans up the procedure of sending LAGRQ and PING. main/sched.c: Do not assert when deleting non existant entry from scheduler. This assert seems to be the reason for a lot of awkward code to avoid it. ASTERISK-24983 #close Reported by: Y Ateya Change-Id: I03bec1fc8faacb89630269e935fa667c6d6c080c
Diffstat (limited to 'main/sched.c')
-rw-r--r--main/sched.c12
1 files changed, 2 insertions, 10 deletions
diff --git a/main/sched.c b/main/sched.c
index 911143c9d..d50a31e56 100644
--- a/main/sched.c
+++ b/main/sched.c
@@ -513,16 +513,8 @@ int _ast_sched_del(struct ast_sched_context *con, int id, const char *file, int
if (!s && *last_id != id) {
ast_debug(1, "Attempted to delete nonexistent schedule entry %d!\n", id);
-#ifndef AST_DEVMODE
- ast_assert(s != NULL);
-#else
- {
- char buf[100];
-
- snprintf(buf, sizeof(buf), "s != NULL, id=%d", id);
- _ast_assert(0, buf, file, line, function);
- }
-#endif
+ /* Removing nonexistent schedule entry shouldn't trigger assert (it was enabled in DEV_MODE);
+ * because in many places entries is deleted without having valid id. */
*last_id = id;
return -1;
} else if (!s) {