mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-12 18:55:38 +02:00
Implement a monitor thread for the stream
This commit is contained in:
parent
cf2832ceab
commit
4f906197da
1 changed files with 53 additions and 21 deletions
|
@ -7,7 +7,8 @@ package org.eclipse.cdt.debug.mi.core;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.Collections;
|
||||||
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.eclipse.debug.core.IStreamListener;
|
import org.eclipse.debug.core.IStreamListener;
|
||||||
|
@ -17,13 +18,12 @@ import org.eclipse.debug.core.model.IStreamMonitor;
|
||||||
*/
|
*/
|
||||||
public class GDBStreamMonitor implements IStreamMonitor {
|
public class GDBStreamMonitor implements IStreamMonitor {
|
||||||
|
|
||||||
List listeners;
|
List listeners = Collections.synchronizedList(new LinkedList());
|
||||||
StringBuffer buffer;
|
|
||||||
|
StringBuffer contents = new StringBuffer();
|
||||||
InputStream stream;
|
InputStream stream;
|
||||||
|
|
||||||
public GDBStreamMonitor(InputStream s) {
|
public GDBStreamMonitor(InputStream s) {
|
||||||
listeners = new ArrayList();
|
|
||||||
buffer = new StringBuffer();
|
|
||||||
stream = s;
|
stream = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,22 +34,6 @@ public class GDBStreamMonitor implements IStreamMonitor {
|
||||||
listeners.add(listener);
|
listeners.add(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @see org.eclipse.debug.core.model.IStreamMonitor#getContents()
|
|
||||||
*/
|
|
||||||
public String getContents() {
|
|
||||||
try {
|
|
||||||
int count = stream.available();
|
|
||||||
byte[] bytes = new byte[count];
|
|
||||||
count = stream.read(bytes);
|
|
||||||
if (count > 0) {
|
|
||||||
buffer.append(bytes);
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
}
|
|
||||||
return buffer.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see org.eclipse.debug.core.model.IStreamMonitor#removeListener(IStreamListener)
|
* @see org.eclipse.debug.core.model.IStreamMonitor#removeListener(IStreamListener)
|
||||||
*/
|
*/
|
||||||
|
@ -57,4 +41,52 @@ public class GDBStreamMonitor implements IStreamMonitor {
|
||||||
listeners.remove(listener);
|
listeners.remove(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notifies the listeners.
|
||||||
|
*/
|
||||||
|
private void fireStreamAppended(String text) {
|
||||||
|
IStreamListener[] array = (IStreamListener[])listeners.toArray(new IStreamListener[0]);
|
||||||
|
for (int i = 0; i < array.length; i++) {
|
||||||
|
array[i].streamAppended(text, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see org.eclipse.debug.core.model.IStreamMonitor#getContents()
|
||||||
|
*/
|
||||||
|
public String getContents() {
|
||||||
|
return contents.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Continually reads from the stream.
|
||||||
|
*/
|
||||||
|
void read() {
|
||||||
|
byte[] bytes = new byte[1024];
|
||||||
|
int count = 0;
|
||||||
|
try {
|
||||||
|
while ((count = stream.read(bytes)) >= 0) {
|
||||||
|
if (count > 0) {
|
||||||
|
String text = new String(bytes, 0, count);
|
||||||
|
contents.append(text);
|
||||||
|
fireStreamAppended(text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stream.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
// e.printStackTrace();
|
||||||
|
} catch (NullPointerException e) {
|
||||||
|
// killing the stream monitor while reading can cause an NPE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void startMonitoring() {
|
||||||
|
Thread thread = new Thread(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
read();
|
||||||
|
}
|
||||||
|
}, "GDB stream Monitor");
|
||||||
|
thread.setDaemon(true);
|
||||||
|
thread.start();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue