]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
remove a race condition for the creation of recordthread's, and fix a small memory...
authorDwayne M. Hubbard <dwayne.hubbard@gmail.com>
Wed, 12 Sep 2007 20:24:24 +0000 (20:24 +0000)
committerDwayne M. Hubbard <dwayne.hubbard@gmail.com>
Wed, 12 Sep 2007 20:24:24 +0000 (20:24 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@82286 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_meetme.c

index f1a7bcdec26ff61142b339cdf1ce628e852dae1c..3da5eaf89d8fdf9db08843a6a84adb9e895f7ff5 100644 (file)
@@ -331,6 +331,7 @@ struct ast_conference {
        unsigned int isdynamic:1;               /*!< Created on the fly? */
        unsigned int locked:1;                  /*!< Is the conference locked? */
        pthread_t recordthread;                 /*!< thread for recording */
+       ast_mutex_t recordthreadlock;           /*!< control threads trying to start recordthread */
        pthread_attr_t attr;                    /*!< thread attribute */
        const char *recordingfilename;          /*!< Filename to record the Conference into */
        const char *recordingformat;            /*!< Format to record the Conference in */
@@ -757,6 +758,8 @@ static struct ast_conference *build_conf(char *confno, char *pin, char *pinadmin
 
        ast_mutex_init(&cnf->playlock);
        ast_mutex_init(&cnf->listenlock);
+       cnf->recordthread = AST_PTHREADT_NULL;
+       ast_mutex_init(&cnf->recordthreadlock);
        ast_copy_string(cnf->confno, confno, sizeof(cnf->confno));
        ast_copy_string(cnf->pin, pin, sizeof(cnf->pin));
        ast_copy_string(cnf->pinadmin, pinadmin, sizeof(cnf->pinadmin));
@@ -1253,7 +1256,10 @@ static int conf_free(struct ast_conference *conf)
                ast_hangup(conf->chan);
        else
                close(conf->fd);
-       
+
+       ast_mutex_destroy(&conf->playlock);
+       ast_mutex_destroy(&conf->listenlock);
+       ast_mutex_destroy(&conf->recordthreadlock);
        free(conf);
 
        return 0;
@@ -1429,7 +1435,8 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
                }
        }
 
-       if ((conf->recording == MEETME_RECORD_OFF) && (confflags & CONFFLAG_RECORDCONF) && ((conf->lchan = ast_request("zap", AST_FORMAT_SLINEAR, "pseudo", NULL)))) {
+       ast_mutex_lock(&conf->recordthreadlock);
+       if ((conf->recordthread == AST_PTHREADT_NULL) && (confflags & CONFFLAG_RECORDCONF) && ((conf->lchan = ast_request("zap", AST_FORMAT_SLINEAR, "pseudo", NULL)))) {
                ast_set_read_format(conf->lchan, AST_FORMAT_SLINEAR);
                ast_set_write_format(conf->lchan, AST_FORMAT_SLINEAR);
                ztc.chan = 0;
@@ -1446,6 +1453,7 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
                        pthread_attr_destroy(&conf->attr);
                }
        }
+       ast_mutex_unlock(&conf->recordthreadlock);
 
        time(&user->jointime);