From 935c64c91e25a01270cdde480c6684a9a111db24 Mon Sep 17 00:00:00 2001 From: tilghman Date: Fri, 16 Jul 2010 20:35:28 +0000 Subject: Finally, a method that really fixes the assertions in chan_iax2.c related to cancelling lagid. No, replacing usleep(1) with sched_yield() did not have an effect. git-svn-id: http://svn.digium.com/svn/asterisk/trunk@277484 f38db490-d61c-443f-a65b-d21fe96a405b --- main/sched.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) (limited to 'main') diff --git a/main/sched.c b/main/sched.c index 8699cfbab..78de1a99e 100644 --- a/main/sched.c +++ b/main/sched.c @@ -46,6 +46,9 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/dlinkedlists.h" #include "asterisk/hashtab.h" #include "asterisk/heap.h" +#include "asterisk/threadstorage.h" + +AST_THREADSTORAGE(last_del_id); struct sched { AST_LIST_ENTRY(sched) list; @@ -450,7 +453,7 @@ const void *ast_sched_find_data(struct sched_context *con, int id) return res->data; return NULL; } - + /*! \brief * Delete the schedule entry with number * "id". It's nearly impossible that there @@ -466,9 +469,14 @@ int _ast_sched_del(struct sched_context *con, int id, const char *file, int line struct sched *s, tmp = { .id = id, }; + int *last_id = ast_threadstorage_get(&last_del_id, sizeof(int *)); DEBUG(ast_debug(1, "ast_sched_del(%d)\n", id)); - + + if (id < 0) { + return 0; + } + ast_mutex_lock(&con->lock); s = ast_hashtab_lookup(con->schedq_ht, &tmp); if (s) { @@ -484,7 +492,7 @@ int _ast_sched_del(struct sched_context *con, int id, const char *file, int line sched_release(con, s); } - + #ifdef DUMP_SCHEDULER /* Dump contents of the context while we have the lock so nothing gets screwed up by accident. */ if (option_debug) @@ -492,16 +500,23 @@ int _ast_sched_del(struct sched_context *con, int id, const char *file, int line #endif ast_mutex_unlock(&con->lock); - if (!s) { + 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 - _ast_assert(0, "s != NULL", file, line, function); + { + char buf[100]; + snprintf(buf, sizeof(buf), "s != NULL, id=%d", id); + _ast_assert(0, buf, file, line, function); + } #endif + *last_id = id; + return -1; + } else if (!s) { return -1; } - + return 0; } -- cgit v1.2.3