diff options
author | file <file@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-03-29 17:33:58 +0000 |
---|---|---|
committer | file <file@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-03-29 17:33:58 +0000 |
commit | 4e302d51366e2f708d06cb923a389189a0323c34 (patch) | |
tree | 1dccdbd6634483347818d928ffcf5123c26b54d2 /apps | |
parent | f9a9d3a9224b3198dd68ee653461e2ca3ed676ba (diff) |
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)
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.2@59360 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-rw-r--r-- | apps/app_meetme.c | 37 |
1 files changed, 16 insertions, 21 deletions
diff --git a/apps/app_meetme.c b/apps/app_meetme.c index 9c22ea20d..8e7f2d8f0 100644 --- a/apps/app_meetme.c +++ b/apps/app_meetme.c @@ -154,6 +154,8 @@ struct ast_conference { 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 @@ static struct ast_conference *build_conf(char *confno, char *pin, char *pinadmin { 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 @@ static struct ast_conference *build_conf(char *confno, char *pin, char *pinadmin 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 conf_free(struct ast_conference *conf) 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 @@ static int conf_exec(struct ast_channel *chan, void *data) 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 @@ static int conf_exec(struct ast_channel *chan, void *data) 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 @@ static int conf_exec(struct ast_channel *chan, void *data) /* 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? */ |