diff options
Diffstat (limited to 'interactor/interactor.js')
-rwxr-xr-x | interactor/interactor.js | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/interactor/interactor.js b/interactor/interactor.js index 8a8a32f..32f8517 100755 --- a/interactor/interactor.js +++ b/interactor/interactor.js @@ -36,25 +36,56 @@ app.get("/",function(req,res){ }); }); +var childpids=[]; + +process.on("exit",function(){ + console.log("Exiting:"); + console.log.apply(console,arguments); + childpids.forEach(function(pid){process.kill(pid);}); + process.exit(); +}); +process.on("SIGINT",function(){ + console.log("SIGINT:"); + console.log.apply(console,arguments); + childpids.forEach(function(pid){process.kill(pid);}); + process.exit(); +}); + function stopproc(proc){ + var pid=proc.pid; + console.log("Stopping proc with pid "+pid+", childpids="+JSON.stringify(childpids)); proc.stdin.write("Quit\n"); var timeout=setTimeout(function(){ + console.log("Proc with pid "+pid+" didn't stop in time, killing"); proc.kill(); + var idx=childpids.indexOf(pid); if(idx!=-1)childpids.splice(idx,1); },500); proc.on("exit",function(){ clearTimeout(timeout); + var idx=childpids.indexOf(pid); if(idx!=-1)childpids.splice(idx,1); }); } io.on("connection",function(conn){ var id=uniqid(); console.log("New IO connection id "+id); + var pingtimeout=null; var bd=emptyboard(); var aiplayer=0; conn.on("disconnect",function(){ console.log("Disconnect id "+id); + if(proc){stopproc(proc);proc=null;} + if(pingtimeout)clearTimeout(pingtimeout); + }); + conn.on("ping",function(){ //only enable ping timeouting if a first ping received + if(pingtimeout)clearTimeout(pingtimeout); + pingtimeout=setTimeout(function(){ + console.log("Ping timeout on id "+id+"!"); + if(proc){stopproc(proc);proc=null;} + conn.disconnect(true); + },4000); }); conn.on("usermove",function(idx){ idx=+idx; @@ -71,7 +102,7 @@ io.on("connection",function(conn){ var win=checkwin(bd); if(win!=-1){ conn.emit("win",1-aiplayer); - stopproc(proc); + if(proc){stopproc(proc);proc=null;} return; } } @@ -83,6 +114,7 @@ io.on("connection",function(conn){ var proc=spawn("sh",["-c",aicmd],{ stdio:["pipe","pipe",process.stderr] }); + childpids.push(proc.pid); var buffer=""; proc.stdout.on("data",function(data){ var idx,line,mv,win; @@ -105,7 +137,7 @@ io.on("connection",function(conn){ win=checkwin(bd); if(win!=-1){ conn.emit("win",aiplayer); - stopproc(proc); + if(proc){stopproc(proc);proc=null;} return; } } |