mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-17 22:15:23 +02:00
Added ability to cancell DsfSequence using the progress monitor (bug# 159048).
This commit is contained in:
parent
3f86dad9d5
commit
cfeb1e5d31
1 changed files with 71 additions and 46 deletions
|
@ -233,33 +233,55 @@ abstract public class DsfSequence extends DsfRunnable implements Future<Object>
|
||||||
* submit the next step.
|
* submit the next step.
|
||||||
*/
|
*/
|
||||||
private void executeStep(int nextStepIndex) {
|
private void executeStep(int nextStepIndex) {
|
||||||
|
/*
|
||||||
|
* At end of each step check progress monitor to see if it's cancelled.
|
||||||
|
* If progress monitor is cancelled, mark the whole sequence as
|
||||||
|
* cancelled.
|
||||||
|
*/
|
||||||
|
if (fProgressMonitor.isCanceled()) {
|
||||||
|
cancel(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If sequence was cencelled during last step (or before the sequence
|
||||||
|
* was ever executed), start rolling back the execution.
|
||||||
|
*/
|
||||||
if (isCancelled()) {
|
if (isCancelled()) {
|
||||||
cancelExecution();
|
cancelExecution();
|
||||||
} else {
|
return;
|
||||||
if (nextStepIndex < getSteps().length) {
|
|
||||||
fCurrentStepIdx = nextStepIndex;
|
|
||||||
getSteps()[fCurrentStepIdx].execute(new Done() {
|
|
||||||
final private int fStepIdx = fCurrentStepIdx;
|
|
||||||
public void run() {
|
|
||||||
// Check if we're still the correct step.
|
|
||||||
assert fStepIdx == fCurrentStepIdx;
|
|
||||||
|
|
||||||
// Proceed to the next step.
|
|
||||||
if (getStatus().isOK()) {
|
|
||||||
fProgressMonitor.worked(getSteps()[fStepIdx].getTicks());
|
|
||||||
executeStep(fStepIdx + 1);
|
|
||||||
} else {
|
|
||||||
abortExecution(getStatus());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public String toString() {
|
|
||||||
return "DsfSequence \"" + fTaskName + "\", result for executing step #" + fStepIdx + " = " + getStatus();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check if we've reached the last step. Note that if execution was
|
||||||
|
* cancelled during the last step (and thus the sequence is
|
||||||
|
* technically finished, since it was cancelled it will be rolled
|
||||||
|
* back.
|
||||||
|
*/
|
||||||
|
if (nextStepIndex >= getSteps().length) {
|
||||||
|
finish();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Proceed with executing next step.
|
||||||
|
fCurrentStepIdx = nextStepIndex;
|
||||||
|
getSteps()[fCurrentStepIdx].execute(new Done() {
|
||||||
|
final private int fStepIdx = fCurrentStepIdx;
|
||||||
|
public void run() {
|
||||||
|
// Check if we're still the correct step.
|
||||||
|
assert fStepIdx == fCurrentStepIdx;
|
||||||
|
|
||||||
|
// Proceed to the next step.
|
||||||
|
if (getStatus().isOK()) {
|
||||||
|
fProgressMonitor.worked(getSteps()[fStepIdx].getTicks());
|
||||||
|
executeStep(fStepIdx + 1);
|
||||||
|
} else {
|
||||||
|
abortExecution(getStatus());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public String toString() {
|
||||||
|
return "DsfSequence \"" + fTaskName + "\", result for executing step #" + fStepIdx + " = " + getStatus();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -267,30 +289,33 @@ abstract public class DsfSequence extends DsfRunnable implements Future<Object>
|
||||||
* roll back next step.
|
* roll back next step.
|
||||||
*/
|
*/
|
||||||
private void rollBackStep(int stepIdx) {
|
private void rollBackStep(int stepIdx) {
|
||||||
if (stepIdx >= 0) {
|
// If we reach before step 0, finish roll back.
|
||||||
fCurrentStepIdx = stepIdx;
|
if (stepIdx < 0) {
|
||||||
getSteps()[fCurrentStepIdx].rollBack(new Done() {
|
|
||||||
final private int fStepIdx = fCurrentStepIdx;
|
|
||||||
public void run() {
|
|
||||||
// Check if we're still the correct step.
|
|
||||||
assert fStepIdx == fCurrentStepIdx;
|
|
||||||
|
|
||||||
// Proceed to the next step.
|
|
||||||
if (getStatus().isOK()) {
|
|
||||||
fProgressMonitor.worked(getSteps()[fStepIdx].getTicks());
|
|
||||||
rollBackStep(fStepIdx - 1);
|
|
||||||
} else {
|
|
||||||
abortRollBack(getStatus());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "DsfSequence \"" + fTaskName + "\", result for rolling back step #" + fStepIdx + " = " + getStatus();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
finish();
|
finish();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Proceed with rolling back given step.
|
||||||
|
fCurrentStepIdx = stepIdx;
|
||||||
|
getSteps()[fCurrentStepIdx].rollBack(new Done() {
|
||||||
|
final private int fStepIdx = fCurrentStepIdx;
|
||||||
|
public void run() {
|
||||||
|
// Check if we're still the correct step.
|
||||||
|
assert fStepIdx == fCurrentStepIdx;
|
||||||
|
|
||||||
|
// Proceed to the next step.
|
||||||
|
if (getStatus().isOK()) {
|
||||||
|
fProgressMonitor.worked(getSteps()[fStepIdx].getTicks());
|
||||||
|
rollBackStep(fStepIdx - 1);
|
||||||
|
} else {
|
||||||
|
abortRollBack(getStatus());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "DsfSequence \"" + fTaskName + "\", result for rolling back step #" + fStepIdx + " = " + getStatus();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Reference in a new issue