Skip to content
Snippets Groups Projects
Commit 85e1cb51 authored by Joshua Colp's avatar Joshua Colp
Browse files

sched: ast_sched_del may return prematurely due to spurious wakeup

When deleting a scheduled item if the item in question is currently
executing the ast_sched_del function waits until it has completed.
This is accomplished using ast_cond_wait. Unfortunately the
ast_cond_wait function can suffer from spurious wakeups so the
predicate needs to be checked after it returns to make sure it has
really woken up as a result of being signaled.

This change adds a loop around the ast_cond_wait to make sure that
it only exits when the executing task has really completed.

ASTERISK-25355 #close

Change-Id: I51198270eb0b637c956c61aa409f46283432be61
parent b5801fe4
Branches
Tags
No related merge requests found
......@@ -497,7 +497,9 @@ int _ast_sched_del(struct ast_sched_context *con, int id, const char *file, int
/* Wait for executing task to complete so that caller of ast_sched_del() does not
* free memory out from under the task.
*/
ast_cond_wait(&s->cond, &con->lock);
while (con->currently_executing && (id == con->currently_executing->id)) {
ast_cond_wait(&s->cond, &con->lock);
}
/* Do not sched_release() here because ast_sched_runq() will do it */
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment