1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-04 07:35:24 +02:00

[170910] Fix AbstractTerminalShell#waitFor() implementation

This commit is contained in:
Martin Oberhuber 2008-04-11 15:49:55 +00:00
parent fe84b78f7d
commit 33f62079ea
2 changed files with 38 additions and 5 deletions

View file

@ -58,18 +58,49 @@ public abstract class AbstractTerminalShell extends PlatformObject implements IT
public int exitValue() {
// exit values are not supported by default, but we need to observe the
// API by throwing IllegalThreadStateException
if (isActive())
if (isActive()) {
throw new IllegalThreadStateException();
}
return 0;
}
/**
* Return the interval (in milliseconds) for polling the {@ink #isActive()}
* method during the {@link #waitFor(long)} method. Subclasses may override
* to return different poll intervals.
*
* The interval may be changed dynamically as appropriate for the current
* state of this shell. That way, wait polling mechanisms such as
* exponential backoff can be implemented.
*
* Or, a concrete implementation that supports a notification mechanism for
* knowing when the shell terminates, can use this to tweak the waitFor()
* method by returning Long.MAX_VALUE here (wait forever), but calling
* {@link #notifyAll()} when the shell is dead.
*
* @return interval (in milliseconds) for polling active state
*/
protected long getWaitForPollInterval() {
return 500L;
}
/**
* Wait for the shell to terminate. This uses a polling mechanism by
* default, which can be tweaked by overriding
* {@link #getWaitForPollInterval()}.
*
* @see IBaseShell#waitFor(long)
*/
public boolean waitFor(long timeout) throws InterruptedException {
boolean active = isActive();
if (active) {
synchronized (this) {
wait(timeout);
}
active = isActive();
long endTime = (timeout <= 0) ? Long.MAX_VALUE : System.currentTimeMillis() + timeout - getWaitForPollInterval();
do {
synchronized (this) {
wait(getWaitForPollInterval());
}
active = isActive();
} while (active && (timeout <= 0 || System.currentTimeMillis() < endTime));
}
return active;
}

View file

@ -125,6 +125,8 @@ public class ProcessBaseShell extends PlatformObject implements IBaseShell {
if (active) {
Thread watchdog = null;
if (timeout > 0) {
// TODO Check if using java.util.Timer would be more efficient
// than our own Watchdog
watchdog = new Watchdog(Thread.currentThread(), timeout) {
protected boolean conditionDone() {
return !isActive();