[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