[svn-commits] file: branch 1.2 r59360 - /branches/1.2/apps/app_meetme.c

svn-commits at lists.digium.com svn-commits at lists.digium.com
Thu Mar 29 10:33:59 MST 2007


Author: file
Date: Thu Mar 29 12:33:58 2007
New Revision: 59360

URL: http://svn.digium.com/view/asterisk?view=rev&rev=59360
Log:
Keep a global array of variables indicating whether certain conference rooms are in use. This ensures that two people going into a new dynamic conference when the 'e' option is set don't go into the same conference room. (issue #8835 reported by eliel)

Modified:
    branches/1.2/apps/app_meetme.c

Modified: branches/1.2/apps/app_meetme.c
URL: http://svn.digium.com/view/asterisk/branches/1.2/apps/app_meetme.c?view=diff&rev=59360&r1=59359&r2=59360
==============================================================================
--- branches/1.2/apps/app_meetme.c (original)
+++ branches/1.2/apps/app_meetme.c Thu Mar 29 12:33:58 2007
@@ -154,6 +154,8 @@
 
 static AST_LIST_HEAD_STATIC(confs, ast_conference);
 
+static unsigned int conf_map[1024] = {0, };
+
 struct volume {
 	int desired;				/* Desired volume adjustment */
 	int actual;				/* Actual volume adjustment (for channels that can't adjust) */
@@ -442,6 +444,7 @@
 {
 	struct ast_conference *cnf;
 	struct zt_confinfo ztc;
+	int confno_int = 0;
 
 	AST_LIST_LOCK(&confs);
 	AST_LIST_TRAVERSE(&confs, cnf, list) {
@@ -493,6 +496,9 @@
 			if (option_verbose > 2)
 				ast_verbose(VERBOSE_PREFIX_3 "Created MeetMe conference %d for conference '%s'\n", cnf->zapconf, cnf->confno);
 			AST_LIST_INSERT_HEAD(&confs, cnf, list);
+			/* Reserve conference number in map */
+			if ((sscanf(cnf->confno, "%d", &confno_int) == 1) && (confno_int >= 0 && confno_int < 1024))
+				conf_map[confno_int] = 1;
 		} else	
 			ast_log(LOG_WARNING, "Out of memory\n");
 	}
@@ -795,9 +801,13 @@
 static int dispose_conf(struct ast_conference *conf)
 {
 	int res = 0;
+	int confno_int = 0;
 
 	AST_LIST_LOCK(&confs);
 	if (ast_atomic_dec_and_test(&conf->refcount)) {
+		/* Take the conference room number out of an inuse state */
+		if ((sscanf(conf->confno, "%d", &confno_int) == 1) && (confno_int >= 0 && confno_int < 1024))
+			conf_map[confno_int] = 0;
 		conf_free(conf);
 		res = 1;
 	}
@@ -1819,20 +1829,9 @@
 		if (retrycnt > 3)
 			allowretry = 0;
 		if (empty) {
-			int i, map[1024] = { 0, };
 			struct ast_config *cfg;
 			struct ast_variable *var;
-			int confno_int;
-
-			AST_LIST_LOCK(&confs);
-			AST_LIST_TRAVERSE(&confs, cnf, list) {
-				if (sscanf(cnf->confno, "%d", &confno_int) == 1) {
-					/* Disqualify in use conference */
-					if (confno_int >= 0 && confno_int < 1024)
-						map[confno_int]++;
-				}
-			}
-			AST_LIST_UNLOCK(&confs);
+			int i = 0, confno_int = 0;
 
 			/* We only need to load the config file for static and empty_no_pin (otherwise we don't care) */
 			if ((empty_no_pin) || (!dynamic)) {
@@ -1845,13 +1844,6 @@
 							if (stringp) {
 								char *confno_tmp = strsep(&stringp, "|,");
 								int found = 0;
-								if (sscanf(confno_tmp, "%d", &confno_int) == 1) {
-									if ((confno_int >= 0) && (confno_int < 1024)) {
-										if (stringp && empty_no_pin) {
-											map[confno_int]++;
-										}
-									}
-								}
 								if (!dynamic) {
 									/* For static:  run through the list and see if this conference is empty */
 									AST_LIST_LOCK(&confs);
@@ -1888,12 +1880,15 @@
 
 			/* Select first conference number not in use */
 			if (ast_strlen_zero(confno) && dynamic) {
-				for (i = 0; i < sizeof(map) / sizeof(map[0]); i++) {
-					if (!map[i]) {
+				AST_LIST_LOCK(&confs);
+				for (i = 0; i < sizeof(conf_map) / sizeof(conf_map[0]); i++) {
+					if (!conf_map[i]) {
 						snprintf(confno, sizeof(confno), "%d", i);
+						conf_map[i] = 1;
 						break;
 					}
 				}
+				AST_LIST_UNLOCK(&confs);
 			}
 
 			/* Not found? */



More information about the svn-commits mailing list