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

[179096] Added suspend trigger to open debug perspective on suspend.

This commit is contained in:
Pawel Piech 2008-02-11 23:56:56 +00:00
parent cedbca9401
commit 91e43c46ad
2 changed files with 124 additions and 0 deletions

View file

@ -23,6 +23,7 @@ Eclipse-LazyStart: true
Export-Package:
org.eclipse.dd.dsf.debug.ui,
org.eclipse.dd.dsf.debug.ui.actions,
org.eclipse.dd.dsf.debug.ui.contexts,
org.eclipse.dd.dsf.debug.ui.sourcelookup,
org.eclipse.dd.dsf.debug.ui.viewmodel,
org.eclipse.dd.dsf.debug.ui.viewmodel.expression,
@ -30,5 +31,7 @@ Export-Package:
org.eclipse.dd.dsf.debug.ui.viewmodel.modules,
org.eclipse.dd.dsf.debug.ui.viewmodel.numberformat,
org.eclipse.dd.dsf.debug.ui.viewmodel.register,
org.eclipse.dd.dsf.debug.ui.viewmodel.update,
org.eclipse.dd.dsf.debug.ui.viewmodel.update.actions,
org.eclipse.dd.dsf.debug.ui.viewmodel.variable
Bundle-RequiredExecutionEnvironment: J2SE-1.5

View file

@ -0,0 +1,121 @@
/*******************************************************************************
* Copyright (c) 2008 Wind River Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.dd.dsf.debug.ui.contexts;
import java.util.concurrent.RejectedExecutionException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.ISafeRunnable;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.dd.dsf.concurrent.ConfinedToDsfExecutor;
import org.eclipse.dd.dsf.concurrent.DsfRunnable;
import org.eclipse.dd.dsf.concurrent.ThreadSafe;
import org.eclipse.dd.dsf.debug.service.IRunControl;
import org.eclipse.dd.dsf.debug.ui.DsfDebugUIPlugin;
import org.eclipse.dd.dsf.service.DsfServiceEventHandler;
import org.eclipse.dd.dsf.service.DsfSession;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.ui.contexts.ISuspendTrigger;
import org.eclipse.debug.ui.contexts.ISuspendTriggerListener;
/**
* DSF implementation of the ISuspendTrigger interface. The suspend trigger
* is used by the IDE to trigger activation of the debug perspective when
* the debugger suspends.
*
* @see ISuspendTrigger
*/
@ConfinedToDsfExecutor("fSession.getExecutor()")
public class DsfSuspendTrigger implements ISuspendTrigger {
private final DsfSession fSession;
private final ILaunch fLaunch;
private boolean fDisposed = false;
private boolean fEventListenerRegisterd = false;
@ThreadSafe
private final ListenerList fListeners = new ListenerList();
@ThreadSafe
public DsfSuspendTrigger(DsfSession session, ILaunch launch) {
fSession = session;
fLaunch = launch;
try {
fSession.getExecutor().execute(new DsfRunnable() {
public void run() {
if (!fDisposed) {
fSession.addServiceEventListener(DsfSuspendTrigger.this, null);
fEventListenerRegisterd = true;
}
}
});
} catch(RejectedExecutionException e) {}
}
@ThreadSafe
public void addSuspendTriggerListener(ISuspendTriggerListener listener) {
if (fListeners != null) {
fListeners.add(listener);
}
}
@ThreadSafe
public void removeSuspendTriggerListener(ISuspendTriggerListener listener) {
if (fListeners != null) {
fListeners.remove(listener);
}
}
public void dispose() {
if (fEventListenerRegisterd) {
fSession.removeServiceEventListener(this);
}
fDisposed = true;
}
@DsfServiceEventHandler
public void eventDispatched(IRunControl.ISuspendedDMEvent e) {
final Object[] listeners = fListeners.getListeners();
if (listeners.length != 0) {
new Job("DSF Suspend Trigger Notify") { //$NON-NLS-1$
{
setSystem(true);
}
@Override
protected IStatus run(IProgressMonitor monitor) {
final MultiStatus status = new MultiStatus(DsfDebugUIPlugin.PLUGIN_ID, 0, "DSF Suspend Trigger Notify Job Status", null); //$NON-NLS-1$
for (int i = 0; i < listeners.length; i++) {
final ISuspendTriggerListener listener = (ISuspendTriggerListener) listeners[i];
SafeRunner.run(new ISafeRunnable() {
public void run() throws Exception {
listener.suspended(fLaunch, null);
}
public void handleException(Throwable exception) {
status.add(new Status(
IStatus.ERROR, DsfDebugUIPlugin.PLUGIN_ID, "Exception while calling suspend trigger listeners", exception)); //$NON-NLS-1$
}
});
}
return status;
}
}.schedule();
}
}
}