1
/*******************************************************************************
2
* Copyright (c) 2000, 2006 QNX Software Systems and others.
3
* All rights reserved. This program and the accompanying materials
4
* are made available under the terms of the Eclipse Public License v1.0
5
* which accompanies this distribution, and is available at
6
* http://www.eclipse.org/legal/epl-v10.html
9
* QNX Software Systems - Initial API and implementation
10
*******************************************************************************/
11
package org.eclipse.cdt.debug.mi.core.cdi;
13
import java.util.ArrayList;
14
import java.util.Collections;
15
import java.util.Hashtable;
16
import java.util.List;
19
import org.eclipse.cdt.debug.core.cdi.CDIException;
20
import org.eclipse.cdt.debug.core.cdi.model.ICDISignal;
21
import org.eclipse.cdt.debug.mi.core.MIException;
22
import org.eclipse.cdt.debug.mi.core.MISession;
23
import org.eclipse.cdt.debug.mi.core.RxThread;
24
import org.eclipse.cdt.debug.mi.core.cdi.model.Signal;
25
import org.eclipse.cdt.debug.mi.core.cdi.model.Target;
26
import org.eclipse.cdt.debug.mi.core.command.CommandFactory;
27
import org.eclipse.cdt.debug.mi.core.command.CLIHandle;
28
import org.eclipse.cdt.debug.mi.core.command.CLIInfoSignals;
29
import org.eclipse.cdt.debug.mi.core.event.MIEvent;
30
import org.eclipse.cdt.debug.mi.core.event.MISignalChangedEvent;
31
import org.eclipse.cdt.debug.mi.core.output.CLIInfoSignalsInfo;
32
import org.eclipse.cdt.debug.mi.core.output.MISigHandle;
36
public class SignalManager extends Manager {
38
ICDISignal[] EMPTY_SIGNALS = {};
39
MISigHandle[] noSigs = new MISigHandle[0];
42
public SignalManager(Session session) {
43
super(session, false);
44
signalsMap = new Hashtable();
47
synchronized List getSignalsList(Target target) {
48
List signalsList = (List)signalsMap.get(target);
49
if (signalsList == null) {
50
signalsList = Collections.synchronizedList(new ArrayList());
51
signalsMap.put(target, signalsList);
56
MISigHandle[] getMISignals(MISession miSession) throws CDIException {
58
CommandFactory factory = miSession.getCommandFactory();
59
CLIInfoSignals sigs = factory.createCLIInfoSignals();
61
RxThread rxThread = miSession.getRxThread();
62
rxThread.setEnableConsole(false);
63
miSession.postCommand(sigs);
64
CLIInfoSignalsInfo info = sigs.getMIInfoSignalsInfo();
66
throw new CDIException(CdiResources.getString("cdi.Common.No_answer")); //$NON-NLS-1$
68
miSigs = info.getMISignals();
69
} catch (MIException e) {
70
throw new MI2CDIException(e);
72
RxThread rxThread = miSession.getRxThread();
73
rxThread.setEnableConsole(true);
78
MISigHandle getMISignal(MISession miSession, String name) throws CDIException {
79
MISigHandle sig = null;
80
CommandFactory factory = miSession.getCommandFactory();
81
CLIInfoSignals sigs = factory.createCLIInfoSignals(name);
83
RxThread rxThread = miSession.getRxThread();
84
rxThread.setEnableConsole(false);
85
miSession.postCommand(sigs);
86
CLIInfoSignalsInfo info = sigs.getMIInfoSignalsInfo();
88
throw new CDIException(CdiResources.getString("cdi.Common.No_answer")); //$NON-NLS-1$
90
MISigHandle[] miSigs = info.getMISignals();
91
if (miSigs.length > 0) {
94
} catch (MIException e) {
95
throw new MI2CDIException(e);
97
RxThread rxThread = miSession.getRxThread();
98
rxThread.setEnableConsole(true);
104
* Method hasSignalChanged.
109
private boolean hasSignalChanged(ICDISignal sig, MISigHandle miSignal) {
110
return !sig.getName().equals(miSignal.getName()) ||
111
sig.isStopSet() != miSignal.isStop() ||
112
sig.isIgnore() != !miSignal.isPass();
115
protected ICDISignal findSignal(Target target, String name) {
116
ICDISignal sig = null;
117
List signalsList = (List) signalsMap.get(target);
118
if (signalsList != null) {
119
ICDISignal[] sigs = (ICDISignal[])signalsList.toArray(new ICDISignal[0]);
120
for (int i = 0; i < sigs.length; i++) {
121
if (sigs[i].getName().equals(name)) {
130
public ICDISignal getSignal(MISession miSession, String name) {
131
Session session = (Session)getSession();
132
Target target = session.getTarget(miSession);
133
return getSignal(target, name);
135
public ICDISignal getSignal(Target target, String name) {
136
ICDISignal sig = findSignal(target, name);
138
MISigHandle miSig = null;
140
miSig = getMISignal(target.getMISession(), name);
141
sig = new Signal(target, miSig);
142
List signalsList = getSignalsList(target);
143
signalsList.add(sig);
144
} catch (CDIException e) {
145
// The session maybe terminated because of the signal.
146
miSig = new MISigHandle(name, false, false, false, name);
147
sig = new Signal(target, miSig);
153
public void handle(Signal sig, boolean isIgnore, boolean isStop) throws CDIException {
154
Target target = (Target)sig.getTarget();
155
MISession miSession = target.getMISession();
156
CommandFactory factory = miSession.getCommandFactory();
157
StringBuffer buffer = new StringBuffer(sig.getName());
158
buffer.append(" "); //$NON-NLS-1$
160
buffer.append("ignore"); //$NON-NLS-1$
162
buffer.append("noignore"); //$NON-NLS-1$
164
buffer.append(" "); //$NON-NLS-1$
166
buffer.append("stop"); //$NON-NLS-1$
168
buffer.append("nostop"); //$NON-NLS-1$
170
CLIHandle handle = factory.createCLIHandle(buffer.toString());
172
miSession.postCommand(handle);
174
} catch (MIException e) {
175
throw new MI2CDIException(e);
177
sig.getMISignal().handle(isIgnore, isStop);
178
miSession.fireEvent(new MISignalChangedEvent(miSession, sig.getName()));
181
public ICDISignal[] getSignals(Target target) throws CDIException {
182
List signalsList = (List)signalsMap.get(target);
183
if (signalsList == null) {
186
signalsList = (List)signalsMap.get(target);
187
if (signalsList != null) {
188
return (ICDISignal[])signalsList.toArray(new ICDISignal[0]);
190
return EMPTY_SIGNALS;
193
public void update(Target target) throws CDIException {
194
MISession miSession = target.getMISession();
195
MISigHandle[] miSigs = getMISignals(miSession);
196
List eventList = new ArrayList(miSigs.length);
197
List signalsList = getSignalsList(target);
198
for (int i = 0; i < miSigs.length; i++) {
199
ICDISignal sig = findSignal(target, miSigs[i].getName());
201
if (hasSignalChanged(sig, miSigs[i])) {
203
((Signal)sig).setMISignal(miSigs[i]);
204
eventList.add(new MISignalChangedEvent(miSession, miSigs[i].getName()));
207
// add the new breakpoint and fire CreatedEvent
208
signalsList.add(new Signal(target, miSigs[i]));
209
//eventList.add(new MISignCreatedEvent(miSession, miSigs[i].getName()));
212
MIEvent[] events = (MIEvent[])eventList.toArray(new MIEvent[0]);
213
miSession.fireEvents(events);