From dba01ce870165fd8d8a5fea921cb31f7c4e8c25f Mon Sep 17 00:00:00 2001 From: Comment Date: Mon, 10 Dec 2012 19:30:27 +0000 Subject: fixed race condition in asterisk driver --- vfg/src/Asterisk.cpp | 97 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 63 insertions(+), 34 deletions(-) (limited to 'vfg/src/Asterisk.cpp') diff --git a/vfg/src/Asterisk.cpp b/vfg/src/Asterisk.cpp index 98ffd9d..55a77e0 100755 --- a/vfg/src/Asterisk.cpp +++ b/vfg/src/Asterisk.cpp @@ -33,25 +33,28 @@ gameQ has 1 calls (max unlimited) in 'rrmemory' strategy (8s holdtime, 50s talkt void Asterisk::threadedFunction(){ - while( isThreadRunning() != 0 ){ - FILE *f = popen("ssh 80.93.22.22 'sudo /usr/sbin/asterisk -rx \"queue show gameQ\"'", "re"); - int fn=fileno(f); - char buf[1000]; - ssize_t r = read(fn, buf, 1000); - pclose(f); - string msg=string(buf); - //received data is always a command ACKNOWLEDGEMENT - if (msg.compare(0,5,"gameQ")==0) { - vector lines; - split(msg,'\n',lines); - queued=0; - for (int i=4;i lines; + split(msg,'\n',lines); + queued=0; + for (int i=4;i0) startThread(true, false); // blocking, verbose + if (statusPollMillis>0) startThread(false, false); // blocking, verbose } -void Asterisk::startGame(){ - if (state==ASTERISK_IDLE&&queued) { - cmd("ssh 80.93.22.22 'sudo /usr/sbin/asterisk -rx \"devstate change Custom:GAME NOT_INUSE\"'"); - printf("Asterisk: attempting to dequeue\n"); - state=ASTERISK_WAITING; - } +void Asterisk::startGame(){ + //if (lock()) { + if (state==ASTERISK_IDLE&&queued) { + cmd("ssh 80.93.22.22 'sudo /usr/sbin/asterisk -rx \"devstate change Custom:GAME NOT_INUSE\"'"); + printf("Asterisk: attempting to dequeue\n"); + } + //unlock(); + //} } void Asterisk::endGame(string score){ printf("Asterisk: request hangup %s\n",playerCode.c_str()); if (state==ASTERISK_PLAYING) { - cmd("ssh 80.93.22.22 'sudo /usr/sbin/asterisk -rx \"database put GAME statuscode "+score+"\"'"); + //cmd("ssh 80.93.22.22 'sudo /usr/sbin/asterisk -rx \"database put GAME statuscode "+score+"\"'"); string emsg="ssh 80.93.22.22 'sudo /usr/sbin/asterisk -rx \"hangup request "+playerCode+"\"'"; - cmd(emsg); + scmd(emsg); printf("Asterisk: hanging up %s\n",playerCode.c_str()); state=ASTERISK_IDLE; } } void Asterisk::cmd(string s) { - //non blocking command for anync messages - file = popen(s.c_str(), "re"); + //non blocking command for anync messages + //pclose(file); always closing before open crashes + //printf("open file\n"); + file = popen(s.c_str(), "re"); //"e" seems necessary for non blocking but with it getting crash when dequeuing. can't seem to trace it filenum=fileno(file); - fcntl(filenum, F_SETFL, O_NONBLOCK); -} + fcntl(filenum, F_SETFL, O_NONBLOCK); + state=ASTERISK_WAITING; +} + +void Asterisk::scmd(string s) { + //non blocking command for anync messages + //pclose(file); always closing before open crashes + //printf("open file\n"); + file = popen(s.c_str(), "re"); //"e" seems necessary for non blocking but with it getting crash when dequeuing. can't seem to trace it + filenum=fileno(file); + fcntl(filenum, F_SETFL, O_NONBLOCK); + //printf("close file\n"); + pclose(file); +} + + +/*Child process PID: 4265 +Program received signal SIGABRT, Aborted. +In __GI_raise (sig=) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64 () +Cannot open file: /home/tim/workspace/VFxmas/vfg/iofclose.c +*/ + int Asterisk::update(){ //capture stdin response from popen - if (state==ASTERISK_WAITING||state==ASTERISK_STARTING) { + if (state==ASTERISK_WAITING) { char buf[100]; ssize_t r = read(filenum, buf, 1000); //if (r == -1 && errno == EAGAIN) //no data yet //else - if (r > 0) { + if (r > 0) { + //is it here? + //printf("close file\n"); pclose(file); string msg=string(buf); state=ASTERISK_IDLE; -- cgit v1.2.3