aboutsummaryrefslogtreecommitdiffstats
path: root/main/sched.c
diff options
context:
space:
mode:
authortilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2010-07-16 20:35:28 +0000
committertilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2010-07-16 20:35:28 +0000
commit935c64c91e25a01270cdde480c6684a9a111db24 (patch)
tree66e2a97f0ee24f1cab1de8bcdcdc92baa90522ae /main/sched.c
parent1243460edd50a6c5ff8fd4b35da38b7b1854a3c5 (diff)
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
Diffstat (limited to 'main/sched.c')
-rw-r--r--main/sched.c27
1 files changed, 21 insertions, 6 deletions
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;
}