blob: 865cb3df53bd40d9e5f95ae4265da9a5bd4c34b6 [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2006, 2010 IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - Initial Implementation
*
*****************************************************************************/
package org.eclipse.ptp.remotetools.internal.ssh;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.ptp.remotetools.core.messages.Messages;
/**
* Observer responsible for updating the list of running process.
*
* Note: This must be a Thread not a Job as it may be run very early on in
* Eclipse startup.
*
* @author Richard Maciel
* @since 1.1
*/
public class ExecutionObserver extends Thread {
private final Connection fConnection;
private boolean fCanceled = false;
public ExecutionObserver(Connection connection) {
super(Messages.ExecutionObserver_ExecutionObserver_RemoteCommandObserver);
fConnection = connection;
}
public void cancel() {
fCanceled = true;
synchronized (this) {
notify();
}
}
/**
* Check for executions and notify appropriately.
*
* @param cancel
* if true, cancel all running executions, otherwise notify any
* finished executions
*/
private void checkAndNotify(boolean cancel) {
List<KillableExecution> execs;
synchronized (fConnection.getActiveProcessTable()) {
execs = new ArrayList<KillableExecution>(fConnection.getActiveProcessTable().values());
}
for (KillableExecution exec : execs) {
if (cancel && exec.isRunning()) {
exec.notifyCancel();
} else if (!cancel && !exec.isRunning()) {
exec.notifyFinish();
}
}
}
/**
* Check for process that finished and remove then from the table until
* there are no more process.
*/
@Override
public void run() {
while (!fCanceled && fConnection.isConnected()) {
checkAndNotify(false);
synchronized (this) {
try {
wait(100);
} catch (InterruptedException e) {
// Safe to ignore
}
}
}
checkAndNotify(true);
}
}