[asterisk-commits] tilghman: trunk r277484 - in /trunk: include/asterisk/sched.h main/sched.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Fri Jul 16 15:35:31 CDT 2010
Author: tilghman
Date: Fri Jul 16 15:35:28 2010
New Revision: 277484
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=277484
Log:
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.
Modified:
trunk/include/asterisk/sched.h
trunk/main/sched.c
Modified: trunk/include/asterisk/sched.h
URL: http://svnview.digium.com/svn/asterisk/trunk/include/asterisk/sched.h?view=diff&rev=277484&r1=277483&r2=277484
==============================================================================
--- trunk/include/asterisk/sched.h (original)
+++ trunk/include/asterisk/sched.h Fri Jul 16 15:35:28 2010
@@ -53,7 +53,7 @@
int _count = 0; \
int _sched_res = -1; \
while (id > -1 && (_sched_res = ast_sched_del(sched, id)) && ++_count < 10) \
- usleep(1); \
+ usleep(1000); \
if (_count == 10 && option_debug > 2) { \
ast_log(LOG_DEBUG, "Unable to cancel schedule ID %d.\n", id); \
} \
@@ -70,7 +70,7 @@
do { \
int _count = 0; \
while (id > -1 && ast_sched_del(sched, id) && ++_count < 10) { \
- usleep(1); \
+ usleep(1000); \
} \
if (_count == 10) \
ast_log(LOG_WARNING, "Unable to cancel schedule ID %d. This is probably a bug (%s: %s, line %d).\n", id, __FILE__, __PRETTY_FUNCTION__, __LINE__); \
@@ -89,7 +89,7 @@
int _sched_res = -1; \
while (id > -1 && (_sched_res = ast_sched_del(sched, id)) && ++_count < 10) { \
ast_mutex_unlock(lock); \
- usleep(1); \
+ usleep(1000); \
ast_mutex_lock(lock); \
} \
if (_count == 10 && option_debug > 2) { \
@@ -103,7 +103,7 @@
do { \
int _count = 0; \
while (id > -1 && ast_sched_del(sched, id) && ++_count < 10) { \
- usleep(1); \
+ usleep(1000); \
} \
if (_count == 10) \
ast_log(LOG_WARNING, "Unable to cancel schedule ID %d. This is probably a bug (%s: %s, line %d).\n", id, __FILE__, __PRETTY_FUNCTION__, __LINE__); \
@@ -122,7 +122,7 @@
int _count = 0, _res=1; \
void *_data = (void *)ast_sched_find_data(sched, id); \
while (id > -1 && (_res = ast_sched_del(sched, id) && _count++ < 10)) { \
- usleep(1); \
+ usleep(1000); \
} \
if (!_res && _data) \
unrefcall; /* should ref _data! */ \
Modified: trunk/main/sched.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/sched.c?view=diff&rev=277484&r1=277483&r2=277484
==============================================================================
--- trunk/main/sched.c (original)
+++ trunk/main/sched.c Fri Jul 16 15:35:28 2010
@@ -46,6 +46,9 @@
#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 @@
return res->data;
return NULL;
}
-
+
/*! \brief
* Delete the schedule entry with number
* "id". It's nearly impossible that there
@@ -466,9 +469,14 @@
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 @@
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 @@
#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);
-#endif
+ {
+ 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;
}
More information about the asterisk-commits
mailing list