[asterisk-commits] murf: branch murf/fast-ast r44615 - in
/team/murf/fast-ast/main: pbx.c trb.c
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Fri Oct 6 13:07:15 MST 2006
Author: murf
Date: Fri Oct 6 15:07:14 2006
New Revision: 44615
URL: http://svn.digium.com/view/asterisk?rev=44615&view=rev
Log:
Until the time is right.
Removed:
team/murf/fast-ast/main/trb.c
Modified:
team/murf/fast-ast/main/pbx.c
Modified: team/murf/fast-ast/main/pbx.c
URL: http://svn.digium.com/view/asterisk/team/murf/fast-ast/main/pbx.c?rev=44615&r1=44614&r2=44615&view=diff
==============================================================================
--- team/murf/fast-ast/main/pbx.c (original)
+++ team/murf/fast-ast/main/pbx.c Fri Oct 6 15:07:14 2006
@@ -60,6 +60,7 @@
#include "asterisk/app.h"
#include "asterisk/devicestate.h"
#include "asterisk/stringfields.h"
+#include "trb.h"
/*!
* \note I M P O R T A N T :
@@ -124,6 +125,8 @@
void *data; /*!< Data to use (arguments) */
void (*datad)(void *); /*!< Data destructor */
struct ast_exten *peer; /*!< Next higher priority with our extension */
+ struct trb_table *peer_tree; /*!< Priorities list in tree form -- only on the head of the peer list */
+ struct trb_table *peer_label_tree; /*!< labeled priorities in the peer list -- only on the head of the peer list */
const char *registrar; /*!< Registrar */
struct ast_exten *next; /*!< Extension with a greater ID */
char stuff[0];
@@ -162,6 +165,7 @@
struct ast_context {
ast_mutex_t lock; /*!< A lock to prevent multiple threads from clobbering the context */
struct ast_exten *root; /*!< The root of the list of extensions */
+ struct trb_table *root_tree; /*!< The root of the list of extensions in threaded red-black tree form */
struct ast_context *next; /*!< Link them together */
struct ast_include *includes; /*!< Include other contexts */
struct ast_ignorepat *ignorepats; /*!< Patterns for which to continue playing dialtone */
@@ -237,6 +241,44 @@
static int pbx_builtin_sayphonetic(struct ast_channel *, void *);
int pbx_builtin_setvar(struct ast_channel *, void *);
static int pbx_builtin_importvar(struct ast_channel *, void *);
+static int trb_compare_contexts(const void *trb_a, const void *trb_b, void *trb_param);
+static int trb_compare_extens(const void *trb_a, const void *trb_b, void *trb_param);
+static int trb_compare_exten_numbers(const void *trb_a, const void *trb_b, void *trb_param);
+static int trb_compare_exten_labels(const void *trb_a, const void *trb_b, void *trb_param);
+
+
+static int trb_compare_contexts(const void *trb_a, const void *trb_b, void *trb_param)
+{
+ struct ast_context *ac = (struct ast_context*)trb_a;
+ struct ast_context *bc = (struct ast_context*)trb_b;
+ return strcmp(ac->name, bc->name);
+}
+
+static int trb_compare_extens(const void *trb_a, const void *trb_b, void *trb_param)
+{
+ struct ast_exten *ac = (struct ast_exten*)trb_a;
+ struct ast_exten *bc = (struct ast_exten*)trb_b;
+ return strcmp(ac->exten, bc->exten);
+}
+
+static int trb_compare_exten_numbers(const void *trb_a, const void *trb_b, void *trb_param)
+{
+ struct ast_exten *ac = (struct ast_exten*)trb_a;
+ struct ast_exten *bc = (struct ast_exten*)trb_b;
+ if (ac->priority < bc->priority)
+ return -1;
+ else if (ac->priority == bc->priority)
+ return 0;
+ else
+ return 1;
+}
+
+static int trb_compare_exten_labels(const void *trb_a, const void *trb_b, void *trb_param)
+{
+ struct ast_exten *ac = (struct ast_exten*)trb_a;
+ struct ast_exten *bc = (struct ast_exten*)trb_b;
+ return strcmp(ac->label, bc->label);
+}
AST_MUTEX_DEFINE_STATIC(globalslock);
static struct varshead globals = AST_LIST_HEAD_NOLOCK_INIT_VALUE;
@@ -459,6 +501,8 @@
};
static struct ast_context *contexts = NULL;
+static struct trb_table *contexts_tree = NULL;
+
AST_MUTEX_DEFINE_STATIC(conlock); /*!< Lock for the ast_context list */
static AST_LIST_HEAD_STATIC(apps, ast_app);
@@ -861,11 +905,16 @@
struct ast_context *ast_context_find(const char *name)
{
struct ast_context *tmp = NULL;
+ struct ast_context item;
+ item->name = name;
ast_mutex_lock(&conlock);
+ tmp = trb_find(contexts_tree,&item);
+#ifdef NOTNOW
while ( (tmp = ast_walk_contexts(tmp)) ) {
if (!name || !strcasecmp(name, tmp->name))
break;
}
+#endif
ast_mutex_unlock(&conlock);
return tmp;
}
@@ -3529,6 +3578,8 @@
if (!extcontexts) {
ast_mutex_lock(&conlock);
local_contexts = &contexts;
+ if (!contexts_tree)
+ contexts_tree = trb_create(trb_compare_contexts, NULL, NULL);
} else
local_contexts = extcontexts;
@@ -3548,11 +3599,13 @@
ast_mutex_init(&tmp->macrolock);
strcpy(tmp->name, name);
tmp->root = NULL;
+ tmp->root_tree = NULL;
tmp->registrar = registrar;
tmp->next = *local_contexts;
tmp->includes = NULL;
tmp->ignorepats = NULL;
*local_contexts = tmp;
+ trb_insert(contexts_tree, tmp); /*put this context into the tree */
if (option_debug)
ast_log(LOG_DEBUG, "Registered context '%s'\n", tmp->name);
if (option_verbose > 2)
More information about the asterisk-commits
mailing list