blob: c0302e4dd8b3586eda51e95a188010a6c0227c47 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2015 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.debug.ui.monitors;
import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.model.IDebugElement;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.core.model.ISuspendResume;
import org.eclipse.debug.core.model.ITerminate;
import org.eclipse.debug.core.model.IThread;
/**
* Object used to display owned monitor in the debug launch view.
* In this case, the monitor is waited by the waiting threads, and owned
* by the parent thread.
*/
public class JavaOwnedMonitor extends PlatformObject implements IDebugElement, ITerminate, ISuspendResume {
/**
* The monitor object in the thread and monitor model.
*/
private JavaMonitor fMonitor;
/**
* The threads waiting for this monitor.
*/
private JavaWaitingThread[] fWaitingThreads;
/**
* The parent, in the debug view tree.
*/
private JavaWaitingThread fParent;
/**
* Constructor
* @param monitor
* @param parent
*/
public JavaOwnedMonitor(JavaMonitor monitor, JavaWaitingThread parent) {
fMonitor= monitor;
monitor.addElement(this);
fParent= parent;
}
/**
* Returns the monitor
* @return the monitor
*/
public JavaMonitor getMonitor() {
return fMonitor;
}
/**
* Returns the original <code>IThread</code> or the parent thread
* @return the original <code>IThread</code> of the parent thread
*/
public Object getParent() {
if (fParent.getParent() == null) {
return fParent.getThread().getOriginalThread();
}
return fParent;
}
/**
* Returns an array of all of the threads waiting on this monitor
* @return the array of <code>JavaWaitingThread</code>s waiting on this monitor
*/
public JavaWaitingThread[] getWaitingThreads() {
JavaMonitorThread[] waitingThreads= fMonitor.getWaitingThreads0();
JavaWaitingThread[] tmp= new JavaWaitingThread[waitingThreads.length];
if (fWaitingThreads == null) {
// the list was empty, creating new objects
for (int i= 0; i < waitingThreads.length; i++) {
tmp[i]= new JavaWaitingThread(waitingThreads[i], this);
}
} else {
// trying to reuse the objects from the previous list
outer: for (int i= 0; i < waitingThreads.length; i++) {
JavaMonitorThread waitingThread= waitingThreads[i];
for (int j= 0; j < fWaitingThreads.length; j++) {
if (fWaitingThreads[j].getThread() == waitingThread) {
tmp[i]= fWaitingThreads[j];
continue outer;
}
}
tmp[i]= new JavaWaitingThread(waitingThread, this);
}
}
fWaitingThreads = tmp;
return fWaitingThreads;
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IDebugElement#getModelIdentifier()
*/
@Override
public String getModelIdentifier() {
return fMonitor.getModelIdentifier();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IDebugElement#getDebugTarget()
*/
@Override
public IDebugTarget getDebugTarget() {
return fMonitor.getDebugTarget();
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IDebugElement#getLaunch()
*/
@Override
public ILaunch getLaunch() {
return fMonitor.getLaunch();
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.PlatformObject#getAdapter(java.lang.Class)
*/
@Override
@SuppressWarnings("unchecked")
public <T> T getAdapter(Class<T> adapter) {
if(adapter == IDebugTarget.class) {
return (T) getDebugTarget();
}
//CONTEXTLAUNCHING
if(adapter.equals(ILaunchConfiguration.class)) {
return (T) getLaunch().getLaunchConfiguration();
}
return super.getAdapter(adapter);
}
/**
* returns the parent thread of this monitor
* @return the parent <code>IThread</code> that owns this monitor
*/
protected IThread getParentThread() {
Object parent = getParent();
IThread thread = null;
if(parent instanceof IThread) {
thread = (IThread) parent;
}
else if(parent instanceof JavaWaitingThread) {
thread = ((JavaWaitingThread)parent).getThread().getOriginalThread();
}
return thread;
}
/**
* @see org.eclipse.debug.core.model.ITerminate#canTerminate()
*/
@Override
public boolean canTerminate() {
return getDebugTarget().canTerminate();
}
/**
* @see org.eclipse.debug.core.model.ITerminate#isTerminated()
*/
@Override
public boolean isTerminated() {
return getDebugTarget().isTerminated();
}
/**
* @see org.eclipse.debug.core.model.ITerminate#terminate()
*/
@Override
public void terminate() throws DebugException {
getDebugTarget().terminate();
}
/**
* @see org.eclipse.debug.core.model.ISuspendResume#canResume()
*/
@Override
public boolean canResume() {
IThread thread = getParentThread();
if(thread != null) {
return thread.canResume();
}
return false;
}
/**
* @see org.eclipse.debug.core.model.ISuspendResume#canSuspend()
*/
@Override
public boolean canSuspend() {
IThread thread = getParentThread();
if(thread != null) {
return thread.canSuspend();
}
return false;
}
/**
* @see org.eclipse.debug.core.model.ISuspendResume#isSuspended()
*/
@Override
public boolean isSuspended() {
IThread thread = getParentThread();
if(thread != null) {
return thread.isSuspended();
}
return false;
}
/**
* @see org.eclipse.debug.core.model.ISuspendResume#resume()
*/
@Override
public void resume() throws DebugException {
IThread thread = getParentThread();
if(thread != null) {
thread.resume();
}
}
/**
* @see org.eclipse.debug.core.model.ISuspendResume#suspend()
*/
@Override
public void suspend() throws DebugException {
IThread thread = getParentThread();
if(thread != null) {
thread.suspend();
}
}
}