pbx.c didn't get updated last time

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1184 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Martin Pycko
2003-07-14 15:35:21 +00:00
parent cbd33586ac
commit fb1aeaa66c

62
pbx.c
View File

@@ -2696,16 +2696,22 @@ int ast_unregister_application(char *app) {
return -1;
}
struct ast_context *ast_context_create(char *name, char *registrar)
struct ast_context *ast_context_create(struct ast_context **extcontexts, char *name, char *registrar)
{
struct ast_context *tmp;
ast_pthread_mutex_lock(&conlock);
tmp = contexts;
struct ast_context *tmp, **local_contexts;
if (!extcontexts) {
local_contexts = &contexts;
ast_pthread_mutex_lock(&conlock);
} else
local_contexts = extcontexts;
tmp = *local_contexts;
while(tmp) {
if (!strcasecmp(tmp->name, name)) {
ast_pthread_mutex_unlock(&conlock);
ast_log(LOG_WARNING, "Tried to register context '%s', already in use\n", name);
if (!extcontexts)
ast_pthread_mutex_unlock(&conlock);
return NULL;
}
tmp = tmp->next;
@@ -2717,10 +2723,10 @@ struct ast_context *ast_context_create(char *name, char *registrar)
strncpy(tmp->name, name, sizeof(tmp->name)-1);
tmp->root = NULL;
tmp->registrar = registrar;
tmp->next = contexts;
tmp->next = *local_contexts;
tmp->includes = NULL;
tmp->ignorepats = NULL;
contexts = tmp;
*local_contexts = tmp;
if (option_debug)
ast_log(LOG_DEBUG, "Registered context '%s'\n", tmp->name);
else if (option_verbose > 2)
@@ -2728,10 +2734,32 @@ struct ast_context *ast_context_create(char *name, char *registrar)
} else
ast_log(LOG_WARNING, "Out of memory\n");
ast_pthread_mutex_unlock(&conlock);
if (!extcontexts)
ast_pthread_mutex_unlock(&conlock);
return tmp;
}
void __ast_context_destroy(struct ast_context *con, char *registrar, int lock);
void ast_merge_contexts_and_delete(struct ast_context **extcontexts) {
struct ast_context *tmp, *lasttmp = NULL;
tmp = *extcontexts;
ast_pthread_mutex_lock(&conlock);
while (tmp) {
__ast_context_destroy(tmp,tmp->registrar,0);
lasttmp = tmp;
tmp = tmp->next;
}
if (lasttmp) {
lasttmp->next = contexts;
contexts = *extcontexts;
*extcontexts = NULL;
} else
ast_log(LOG_WARNING, "Requested contexts didn't get merged\n");
ast_pthread_mutex_unlock(&conlock);
return;
}
/*
* errno values
* EBUSY - can't lock
@@ -3890,16 +3918,17 @@ static void destroy_exten(struct ast_exten *e)
free(e);
}
void ast_context_destroy(struct ast_context *con, char *registrar)
void __ast_context_destroy(struct ast_context *con, char *registrar, int lock)
{
struct ast_context *tmp, *tmpl=NULL;
struct ast_include *tmpi, *tmpil= NULL;
struct ast_sw *sw, *swl= NULL;
struct ast_exten *e, *el, *en;
ast_pthread_mutex_lock(&conlock);
if (lock)
ast_pthread_mutex_lock(&conlock);
tmp = contexts;
while(tmp) {
if (((tmp == con) || !con) &&
if (((tmp->name && con && con->name && !strcasecmp(tmp->name, con->name)) || !con) &&
(!registrar || !strcasecmp(registrar, tmp->registrar))) {
/* Okay, let's lock the structure to be sure nobody else
is searching through it. */
@@ -3945,13 +3974,20 @@ void ast_context_destroy(struct ast_context *con, char *registrar)
tmpil = NULL;
continue;
}
ast_pthread_mutex_unlock(&conlock);
if (lock)
ast_pthread_mutex_unlock(&conlock);
return;
}
tmpl = tmp;
tmp = tmp->next;
}
ast_pthread_mutex_unlock(&conlock);
if (lock)
ast_pthread_mutex_unlock(&conlock);
}
void ast_context_destroy(struct ast_context *con, char *registrar)
{
__ast_context_destroy(con,registrar,1);
}
static void wait_for_hangup(struct ast_channel *chan)