[svn-commits] kpfleming: branch group/new_loader_completion r40394 - /team/group/new_loader...

svn-commits at lists.digium.com svn-commits at lists.digium.com
Fri Aug 18 12:22:16 MST 2006


Author: kpfleming
Date: Fri Aug 18 14:22:15 2006
New Revision: 40394

URL: http://svn.digium.com/view/asterisk?rev=40394&view=rev
Log:
uhh... so here's the very most beginning part of the new loader, totally non-functional

Modified:
    team/group/new_loader_completion/loader.c

Modified: team/group/new_loader_completion/loader.c
URL: http://svn.digium.com/view/asterisk/team/group/new_loader_completion/loader.c?rev=40394&r1=40393&r2=40394&view=diff
==============================================================================
--- team/group/new_loader_completion/loader.c (original)
+++ team/group/new_loader_completion/loader.c Fri Aug 18 14:22:15 2006
@@ -79,30 +79,96 @@
 { 0x87, 0x76, 0x79, 0x35, 0x23, 0xea, 0x3a, 0xd3,
   0x25, 0x2a, 0xbb, 0x35, 0x87, 0xe4, 0x22, 0x24 };
 
+static unsigned int embedding = 1; /* we always start out by registering embedded modules,
+				      since they are here before we dlopen() any
+				   */
+
+enum flags {
+	FLAG_EMBEDDED = (1 << 0),		/* module is embedded */
+};
+
 struct ast_module {
-	const struct ast_module_info *mod;
+	const struct ast_module_info *info;
 	void *lib;					/* the shared lib, or NULL if embedded */
 	int usecount;					/* the number of 'users' currently in this module */
 	struct ast_module_user_list users;		/* the list of users in the module */
+	unsigned int flags;				/* flags for this module */
 	AST_LIST_ENTRY(ast_module) entry;
 	char resource[0];
 };
+
+static AST_LIST_HEAD_STATIC(module_list, ast_module);
 
 struct loadupdate {
 	int (*updater)(void);
 	AST_LIST_ENTRY(loadupdate) entry;
 };
 
-static AST_LIST_HEAD_STATIC(module_list, ast_module);
+/* when dynamic modules are being loaded, ast_module_register() will
+   need to know what filename the module was loaded from while it
+   is being registered
+*/
+const char *module_being_loaded = NULL;
+
 static AST_LIST_HEAD_STATIC(updaters, loadupdate);
+
 AST_MUTEX_DEFINE_STATIC(reloadlock);
 
-void ast_module_register(const struct ast_module_info *mod)
-{
-}
-
-void ast_module_unregister(const struct ast_module_info *mod)
-{
+void ast_module_register(const struct ast_module_info *info)
+{
+	struct ast_module *mod;
+	size_t alloc_len;
+	const char *resource;
+
+	if (embedding)
+		resource = info->name;
+	else
+		resource = module_being_loaded;
+
+	if (!(mod = ast_calloc(1, sizeof(*mod) + strlen(resource) + 1)))
+		return;
+
+	mod->info = info;
+	strcpy(mod->resource, resource);
+	AST_LIST_HEAD_INIT(&mod->users);
+	ast_set2_flag(mod, embedding, FLAG_EMBEDDED);
+
+	/* during startup, before the loader has been initialized,
+	   there are no threads, so there is no need to take the lock
+	   on this list to manipulate it. it is also possible that it
+	   might be unsafe to use the list lock at that point... so
+	   let's avoid it altogether
+	*/
+	if (!embedding)
+		AST_LIST_LOCK(&module_list);
+	/* it is paramount that the new entry be placed at the head of
+	   the list, otherwise the code that uses dlopen() to load
+	   dynamic modules won't be able to find out if the module it
+	   just opened was registered or failed to load
+	*/
+	AST_LIST_INSERT_HEAD(&module_list, mod, entry);
+	if (!embedding)
+		AST_LIST_UNLOCK(&module_list);
+}
+
+void ast_module_unregister(const struct ast_module_info *info)
+{
+	struct ast_module *mod = NULL;
+
+	AST_LIST_LOCK(&module_list);
+	AST_LIST_TRAVERSE_SAFE_BEGIN(&module_list, mod, entry) {
+		if (mod->info == info) {
+			AST_LIST_REMOVE_CURRENT(&module_list, entry);
+			break;
+		}
+	}
+	AST_LIST_TRAVERSE_SAFE_END;
+	AST_LIST_UNLOCK(&module_list);
+
+	if (mod) {
+		AST_LIST_HEAD_DESTROY(&mod->users);
+		free(mod);
+	}
 }
 
 struct ast_module_user *__ast_module_user_add(struct ast_module *mod,
@@ -244,7 +310,7 @@
 		}
 
 		__ast_module_user_hangup_all(cur);
-		res = cur->mod->unload();
+		res = cur->info->unload();
 
 		if (res) {
 			ast_log(LOG_WARNING, "Firm unload failed for %s\n", resource_name);
@@ -287,7 +353,7 @@
 	AST_LIST_LOCK(&module_list);
 	AST_LIST_TRAVERSE(&module_list, cur, entry) {
 		if (!strncasecmp(word, cur->resource, l) &&
-		    (cur->mod->reload || !needsreload) &&
+		    (cur->info->reload || !needsreload) &&
 		    ++which > state) {
 			ret = strdup(cur->resource);
 			break;
@@ -331,12 +397,12 @@
 	AST_LIST_LOCK(&module_list);
 	oldversion = modlistver;
 	AST_LIST_TRAVERSE(&module_list, cur, entry) {
-		const struct ast_module_info *mod = cur->mod;
+		const struct ast_module_info *info = cur->info;
 
 		if (name && strcasecmp(name, cur->resource))	/* not ours */
 			continue;
 
-		if (!mod->reload) {	/* cannot be reloaded */
+		if (!info->reload) {	/* cannot be reloaded */
 			if (res < 1)	/* store result if possible */
 				res = 1;	/* 1 = no reload() method */
 			continue;
@@ -344,8 +410,8 @@
 
 		res = 2;
 		if (option_verbose > 2) 
-			ast_verbose(VERBOSE_PREFIX_3 "Reloading module '%s' (%s)\n", cur->resource, mod->description);
-		mod->reload();
+			ast_verbose(VERBOSE_PREFIX_3 "Reloading module '%s' (%s)\n", cur->resource, info->description);
+		info->reload();
 	}
 	AST_LIST_UNLOCK(&module_list);
 
@@ -403,7 +469,7 @@
 		return NULL;
 	}
 
-	cur->mod = m;
+	cur->info = m;
 
 	if (!m->load)
 		errors++;
@@ -501,6 +567,9 @@
 	struct ast_config *cfg;
 	struct dirent *d;
 	DIR *mods;
+
+	/* all embedded modules have registered themselves by now */
+	embedding = 0;
 
 	if (option_verbose)
 		ast_verbose("Asterisk Dynamic Loader Starting:\n");
@@ -601,7 +670,7 @@
 		unlock = 0;
 
 	AST_LIST_TRAVERSE(&module_list, cur, entry) {
-		total_mod_loaded += modentry(cur->resource, cur->mod->description, cur->usecount, like);
+		total_mod_loaded += modentry(cur->resource, cur->info->description, cur->usecount, like);
 	}
 
 	if (unlock)



More information about the svn-commits mailing list