mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-11 15:18:38 +00:00
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: https://origsvn.digium.com/svn/asterisk/trunk@277484 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -53,7 +53,7 @@ extern "C" {
|
||||
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 @@ extern "C" {
|
||||
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 @@ extern "C" {
|
||||
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 @@ extern "C" {
|
||||
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 @@ extern "C" {
|
||||
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! */ \
|
||||
|
19
main/sched.c
19
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;
|
||||
@@ -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) {
|
||||
@@ -492,13 +500,20 @@ 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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user