1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

[222415] Fixed processing of multiple command responses to avoid double processing of accumulated events.

This commit is contained in:
Pawel Piech 2008-03-13 15:53:03 +00:00
parent 9504323dd5
commit f2615af486

View file

@ -509,6 +509,7 @@ public abstract class AbstractMIControl extends AbstractDsfService
* required for processing the results of CLI commands. * required for processing the results of CLI commands.
*/ */
private final List<MIOOBRecord> fAccumulatedOOBRecords = new ArrayList<MIOOBRecord>(); private final List<MIOOBRecord> fAccumulatedOOBRecords = new ArrayList<MIOOBRecord>();
public RxThread(InputStream inputStream) { public RxThread(InputStream inputStream) {
super("MI RX Thread"); //$NON-NLS-1$ super("MI RX Thread"); //$NON-NLS-1$
fInputStream = inputStream; fInputStream = inputStream;
@ -599,9 +600,6 @@ public abstract class AbstractMIControl extends AbstractDsfService
if (recordType == MIParser.RecordType.ResultRecord) { if (recordType == MIParser.RecordType.ResultRecord) {
final MIResultRecord rr = fMiParser.parseMIResultRecord(line); final MIResultRecord rr = fMiParser.parseMIResultRecord(line);
final MIOutput response = new MIOutput(rr,
fAccumulatedOOBRecords.toArray(new MIOOBRecord[fAccumulatedOOBRecords.size()]) );
fAccumulatedOOBRecords.clear();
/* /*
@ -612,6 +610,9 @@ public abstract class AbstractMIControl extends AbstractDsfService
final CommandHandle commandHandle = fRxCommands.remove(id); final CommandHandle commandHandle = fRxCommands.remove(id);
if (commandHandle != null) { if (commandHandle != null) {
final MIOutput response = new MIOutput(
rr, fAccumulatedOOBRecords.toArray(new MIOOBRecord[fAccumulatedOOBRecords.size()]) );
fAccumulatedOOBRecords.clear();
MIInfo result = commandHandle.getCommand().getResult(response); MIInfo result = commandHandle.getCommand().getResult(response);
DataRequestMonitor<MIInfo> rm = commandHandle.getRequestMonitor(); DataRequestMonitor<MIInfo> rm = commandHandle.getRequestMonitor();
@ -663,7 +664,6 @@ public abstract class AbstractMIControl extends AbstractDsfService
* example and the CommandDone listeners there handle the IO as part * example and the CommandDone listeners there handle the IO as part
* of the work. * of the work.
*/ */
final ICommandResult finalResult = result; final ICommandResult finalResult = result;
getExecutor().execute(new DsfRunnable() { getExecutor().execute(new DsfRunnable() {
public void run() { public void run() {
@ -678,9 +678,12 @@ public abstract class AbstractMIControl extends AbstractDsfService
} else { } else {
/* /*
* GDB apparently can sometimes send multiple responses to the same command. In those cases, * GDB apparently can sometimes send multiple responses to the same command. In those cases,
* the command handle is gone, so post the result as an event. Again this must be done on the * the command handle is gone, so post the result as an event. To avoid processing OOB records
* DSF thread for integrity. * as events multiple times, do not include the accumulated OOB record list in the response
* MIOutput object.
*/ */
final MIOutput response = new MIOutput(rr, new MIOOBRecord[0]);
getExecutor().execute(new DsfRunnable() { getExecutor().execute(new DsfRunnable() {
public void run() { public void run() {
processEvent(response); processEvent(response);