/**
* Copyright (c) 2014 by JP Moresmau
* This code is made available under the terms of the Eclipse Public License,
* version 1.0 (EPL). See http://www.eclipse.org/legal/epl-v10.html
*/
package net.sf.eclipsefp.haskell.buildwrapper.types;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import net.sf.eclipsefp.haskell.buildwrapper.BWFacade;
/**
* Manages the buildwrapper long running processes
* @author JP Moresmau
*
*/
public class BWProcessManager {
private Map<String,BWProcessInfo> buildProcesses=new HashMap<String,BWProcessInfo>();
private Set<String> runningFiles=Collections.synchronizedSet(new HashSet<String>());
/**
* the processes running, by thread, so we can kill them when cancelling
*/
private Map<Thread,Process> runningProcesses=Collections.synchronizedMap(new HashMap<Thread,Process>());
/**
*
*/
public BWProcessManager() {
}
public void startRunningFileWait(BWFileInfo bfi){
String k=getKey(bfi);
while (!runningFiles.add(k)){
try {
Thread.sleep(100);
} catch (InterruptedException ignore){
// noop
}
}
}
public boolean startRunningFile(BWFileInfo bfi){
String k=getKey(bfi);
return runningFiles.add(k);
}
public void stopRunningFile(BWFileInfo bfi){
String k=getKey(bfi);
runningFiles.remove(k);
}
private String getKey(BWFileInfo bfi){
if (bfi.getStanza()!=null){
return bfi.getStanza();
}
return bfi.getFile().getProjectRelativePath().toPortableString();
}
public synchronized BWProcessInfo getProcess(BWFileInfo bfi){
return buildProcesses.get(getKey(bfi));
}
public synchronized void registerProcess(BWFileInfo bfi,Process p){
String k=getKey(bfi);
BWProcessInfo bpi=new BWProcessInfo(p, bfi.getFile());
buildProcesses.put(k,bpi);
}
public synchronized boolean removeProcess(BWFileInfo bfi){
String k=getKey(bfi);
BWProcessInfo bpi=buildProcesses.get(k);
if (bpi!=null){
bpi.getFiles().remove(bfi.getFile());
if (bpi.getFiles().isEmpty()){
buildProcesses.remove(k);
return true;
}
}
return false;
}
public synchronized void removeProcessForce(BWFileInfo bfi){
String k=getKey(bfi);
buildProcesses.remove(k);
}
public synchronized boolean hasEnded(BWFileInfo bfi){
String k=getKey(bfi);
BWProcessInfo bpi=buildProcesses.get(k);
if (bpi!=null){
try {
bpi.getProcess().exitValue();
buildProcesses.remove(k);
return true;
} catch (IllegalThreadStateException itse){
// noop
}
}
return false;
}
public void registerProcess(Process p){
runningProcesses.put(Thread.currentThread(), p);
}
public Process unregisterProcess(){
return runningProcesses.remove(Thread.currentThread());
}
public Process unregisterProcess(Thread t){
return runningProcesses.remove(t);
}
public synchronized void closeAll(){
for (BWProcessInfo bpi:buildProcesses.values()){
BWFacade.endProcess(bpi.getProcess());
}
buildProcesses.clear();
}
}