[Asterisk-cvs] asterisk loader.c,1.29,1.30 pbx.c,1.169,1.170
markster at lists.digium.com
markster at lists.digium.com
Sat Nov 13 17:43:39 CST 2004
Update of /usr/cvsroot/asterisk
In directory mongoose.digium.com:/tmp/cvs-serv18261
Modified Files:
loader.c pbx.c
Log Message:
Big agent / queue fixes
Index: loader.c
===================================================================
RCS file: /usr/cvsroot/asterisk/loader.c,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -d -r1.29 -r1.30
--- loader.c 16 Oct 2004 21:14:05 -0000 1.29
+++ loader.c 13 Nov 2004 22:44:32 -0000 1.30
@@ -408,6 +408,14 @@
return 0;
}
+static const char *loadorder[] =
+{
+ "res_",
+ "chan_",
+ "pbx_",
+ NULL,
+};
+
int load_modules()
{
struct ast_config *cfg;
@@ -442,13 +450,14 @@
DIR *mods;
struct dirent *d;
int x;
- /* Make two passes. First, load any resource modules, then load the others. */
- for (x=0;x<2;x++) {
+ /* Loop through each order */
+ for (x=0;x<sizeof(loadorder) / sizeof(loadorder[0]);x++) {
mods = opendir((char *)ast_config_AST_MODULE_DIR);
if (mods) {
while((d = readdir(mods))) {
/* Must end in .so to load it. */
- if ((strlen(d->d_name) > 3) && (x || !strncasecmp(d->d_name, "res_", 4)) &&
+ if ((strlen(d->d_name) > 3) &&
+ (!loadorder[x] || !strncasecmp(d->d_name, loadorder[x], strlen(loadorder[x]))) &&
!strcasecmp(d->d_name + strlen(d->d_name) - 3, ".so") &&
!ast_resource_exists(d->d_name)) {
/* It's a shared library -- Just be sure we're allowed to load it -- kinda
Index: pbx.c
===================================================================
RCS file: /usr/cvsroot/asterisk/pbx.c,v
retrieving revision 1.169
retrieving revision 1.170
diff -u -d -r1.169 -r1.170
--- pbx.c 12 Nov 2004 02:54:17 -0000 1.169
+++ pbx.c 13 Nov 2004 22:44:32 -0000 1.170
@@ -135,6 +135,15 @@
struct ast_state_cb *next;
};
+/* ast_state_cb: An extension state notify */
+struct ast_devstate_cb {
+ void *data;
+ ast_devstate_cb_type callback;
+ struct ast_devstate_cb *next;
+};
+
+static struct ast_devstate_cb *devcbs;
+
struct ast_hint {
struct ast_exten *exten;
int laststate;
@@ -1445,6 +1454,7 @@
{
struct ast_hint *list;
struct ast_state_cb *cblist;
+ struct ast_devstate_cb *devcb;
char hint[AST_MAX_EXTENSION] = "";
char device[AST_MAX_EXTENSION];
char *cur, *rest;
@@ -1461,8 +1471,16 @@
*rest = 0;
}
+ state = ast_device_state(device);
+
ast_mutex_lock(&hintlock);
+ devcb = devcbs;
+ while(devcb) {
+ if (devcb->callback)
+ devcb->callback(device, state, devcb->data);
+ devcb = devcb->next;
+ }
list = hints;
while (list) {
@@ -1506,6 +1524,42 @@
return 1;
}
+int ast_devstate_add(ast_devstate_cb_type callback, void *data)
+{
+ struct ast_devstate_cb *devcb;
+ devcb = malloc(sizeof(struct ast_devstate_cb));
+ if (devcb) {
+ memset(devcb, 0, sizeof(struct ast_devstate_cb));
+ ast_mutex_lock(&hintlock);
+ devcb->data = data;
+ devcb->callback = callback;
+ devcb->next = devcbs;
+ devcbs = devcb;
+ ast_mutex_unlock(&hintlock);
+ }
+ return 0;
+}
+
+void ast_devstate_del(ast_devstate_cb_type callback, void *data)
+{
+ struct ast_devstate_cb *devcb, *prev = NULL, *next;
+ ast_mutex_lock(&hintlock);
+ devcb = devcbs;
+ while(devcb) {
+ next = devcb->next;
+ if ((devcb->data == data) && (devcb->callback == callback)) {
+ if (prev)
+ prev->next = next;
+ else
+ devcbs = next;
+ free(devcb);
+ } else
+ prev = devcb;
+ devcb = next;
+ }
+ ast_mutex_unlock(&hintlock);
+}
+
int ast_extension_state_add(const char *context, const char *exten,
ast_state_cb_type callback, void *data)
{
More information about the svn-commits
mailing list