diff options
author | eutarass | 2009-07-09 04:30:58 +0000 |
---|---|---|
committer | eutarass | 2009-07-09 04:30:58 +0000 |
commit | 57e0537508be9878f45b29d1c5ca51eeda38c0c0 (patch) | |
tree | e955c38239e81175adbad1e91a08f7b799318ded | |
parent | 167bb172366d295f60aac61cc64a69628f7e046e (diff) | |
download | org.eclipse.tcf-57e0537508be9878f45b29d1c5ca51eeda38c0c0.tar.gz org.eclipse.tcf-57e0537508be9878f45b29d1c5ca51eeda38c0c0.tar.xz org.eclipse.tcf-57e0537508be9878f45b29d1c5ca51eeda38c0c0.zip |
Moved waitpid() and related code into a separate module: waitpid.[hc]
Processes service: fixed reporting of process exit code.
4 files changed, 36 insertions, 37 deletions
diff --git a/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/adapters/TCFLaunchLabelProvider.java b/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/adapters/TCFLaunchLabelProvider.java index 2379579e1..db58933ca 100644 --- a/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/adapters/TCFLaunchLabelProvider.java +++ b/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/adapters/TCFLaunchLabelProvider.java @@ -25,9 +25,17 @@ class TCFLaunchLabelProvider implements IElementLabelProvider { TCFLaunch launch = (TCFLaunch)result.getElement(); result.setImageDescriptor(ImageCache.getImageDescriptor(ImageCache.IMG_TCF), 0); String status = ""; - if (launch.isConnecting()) status = "Connecting"; - else if (launch.isExited()) status = "Exited"; - else if (launch.isDisconnected()) status = "Disconnected"; + if (launch.isConnecting()) { + status = "Connecting"; + } + else if (launch.isExited()) { + status = "Exited"; + int code = launch.getExitCode(); + if (code != 0) status += ", exit code " + code; + } + else if (launch.isDisconnected()) { + status = "Disconnected"; + } Throwable error = launch.getError(); if (error != null) { String msg = error.getLocalizedMessage(); diff --git a/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFAnnotationManager.java b/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFAnnotationManager.java index 4261556d4..e4f9e5539 100644 --- a/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFAnnotationManager.java +++ b/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFAnnotationManager.java @@ -97,7 +97,9 @@ public class TCFAnnotationManager { public void onConnected(final TCFLaunch launch) { updateActiveLaunch(); - launch.getBreakpointsStatus().addListener(new ITCFBreakpointListener() { + TCFBreakpointsStatus bps = launch.getBreakpointsStatus(); + if (bps == null) return; + bps.addListener(new ITCFBreakpointListener() { public void breakpointStatusChanged(String id) { displayExec(new Runnable() { @@ -281,7 +283,7 @@ public class TCFAnnotationManager { final TCFLaunch launch = active_launch; final String[] text = new String[1]; text[0] = breakpoint.getText(); - if (launch != null) { + if (launch != null && launch.getBreakpointsStatus() != null) { Protocol.invokeAndWait(new Runnable() { public void run() { TCFBreakpointsStatus bs = launch.getBreakpointsStatus(); diff --git a/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFModel.java b/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFModel.java index 1ae6acc11..27b142554 100644 --- a/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFModel.java +++ b/plugins/org.eclipse.tm.tcf.debug.ui/src/org/eclipse/tm/internal/tcf/debug/ui/model/TCFModel.java @@ -13,11 +13,9 @@ package org.eclipse.tm.internal.tcf.debug.ui.model; import java.io.IOException; import java.util.Collection; import java.util.HashMap; -import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.Set; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.ILaunch; @@ -132,16 +130,12 @@ public class TCFModel implements IElementContentProvider, IElementLabelProvider, new HashMap<String,IMemoryBlockRetrievalExtension>(); private class Console { - final String id; final IOConsole console; final Map<Integer,IOConsoleOutputStream> out; - Console(String id, final IOConsole console) { - this.id = id; + Console(final IOConsole console) { this.console = console; out = new HashMap<Integer,IOConsoleOutputStream>(); - process2console.put(id, this); - consoles.add(this); Thread t = new Thread() { public void run() { try { @@ -167,7 +161,6 @@ public class TCFModel implements IElementContentProvider, IElementLabelProvider, } void close() { - if (process2console.get(id) != this) return; for (IOConsoleOutputStream stream : out.values()) { try { stream.close(); @@ -182,12 +175,10 @@ public class TCFModel implements IElementContentProvider, IElementLabelProvider, catch (IOException x) { Activator.log("Cannot close console stream", x); } - process2console.remove(id); } } - private final Map<String,Console> process2console = new HashMap<String,Console>(); - private final Set<Console> consoles = new HashSet<Console>(); + private Console console; private static final Map<ILaunchConfiguration,IEditorInput> editor_not_found = new HashMap<ILaunchConfiguration,IEditorInput>(); @@ -379,11 +370,8 @@ public class TCFModel implements IElementContentProvider, IElementLabelProvider, private final IProcesses.ProcessesListener prs_listener = new IProcesses.ProcessesListener() { public void exited(String process_id, int exit_code) { - Console console = process2console.get(process_id); - if (console != null) { - console.close(); - onLastContextRemoved(); - } + IProcesses.ProcessContext prs = launch.getProcessContext(); + if (prs != null && process_id.equals(prs.getID())) onLastContextRemoved(); } }; @@ -463,7 +451,6 @@ public class TCFModel implements IElementContentProvider, IElementLabelProvider, try { IProcesses.ProcessContext prs = launch.getProcessContext(); if (prs == null || !process_id.equals(prs.getID())) return; - Console console = process2console.get(process_id); if (console == null) { final IOConsole c = new IOConsole("TCF " + process_id, null, ImageCache.getImageDescriptor(ImageCache.IMG_TCF), "UTF-8", true); @@ -484,7 +471,7 @@ public class TCFModel implements IElementContentProvider, IElementLabelProvider, } } }); - console = new Console(process_id, c); + console = new Console(c); } IOConsoleOutputStream stream = console.out.get(stream_id); if (stream == null) { @@ -565,11 +552,6 @@ public class TCFModel implements IElementContentProvider, IElementLabelProvider, private void onLastContextRemoved() { Protocol.invokeLater(1000, new Runnable() { public void run() { - for (Console console : consoles) { - for (IOConsoleOutputStream stream : console.out.values()) { - if (!stream.isClosed()) return; - } - } if (launch_node == null) return; if (launch_node.isDisposed()) return; if (!launch_node.validateNode(this)) return; @@ -594,18 +576,12 @@ public class TCFModel implements IElementContentProvider, IElementLabelProvider, } void dispose() { - if (!consoles.isEmpty()) { - int i = 0; - final IOConsole[] buf = new IOConsole[consoles.size()]; - for (Console console : consoles) { - console.close(); - buf[i++] = console.console; - } - consoles.clear(); + if (console != null) { display.asyncExec(new Runnable() { public void run() { + console.close(); IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager(); - manager.removeConsoles(buf); + manager.removeConsoles(new IOConsole[]{ console.console }); } }); } diff --git a/plugins/org.eclipse.tm.tcf.debug/src/org/eclipse/tm/internal/tcf/debug/model/TCFLaunch.java b/plugins/org.eclipse.tm.tcf.debug/src/org/eclipse/tm/internal/tcf/debug/model/TCFLaunch.java index 1f12f0565..cbc9141fe 100644 --- a/plugins/org.eclipse.tm.tcf.debug/src/org/eclipse/tm/internal/tcf/debug/model/TCFLaunch.java +++ b/plugins/org.eclipse.tm.tcf.debug/src/org/eclipse/tm/internal/tcf/debug/model/TCFLaunch.java @@ -79,6 +79,7 @@ public class TCFLaunch extends Launch { private ProcessContext process; private IToken process_start_command; private String process_input_stream_id; + private int process_exit_code; private int context_action_cnt; private final HashMap<String,LinkedList<Runnable>> context_action_queue = @@ -101,6 +102,13 @@ public class TCFLaunch extends Launch { } }; + private final IProcesses.ProcessesListener prs_listener = new IProcesses.ProcessesListener() { + + public void exited(String process_id, int exit_code) { + if (process_id.equals(process.getID())) process_exit_code = exit_code; + } + }; + public TCFLaunch(ILaunchConfiguration launchConfiguration, String mode) { super(launchConfiguration, mode, null); for (Listener l : listeners) l.onCreated(TCFLaunch.this); @@ -268,6 +276,7 @@ public class TCFLaunch extends Launch { return; } TCFLaunch.this.process = process; + ps.addListener(prs_listener); connectProcessStreams(); done.run(); } @@ -580,6 +589,10 @@ public class TCFLaunch extends Launch { return last_context_exited; } + public int getExitCode() { + return process_exit_code; + } + public void launchTCF(String mode, String id) { assert Protocol.isDispatchThread(); this.mode = mode; |