blob: dde8830e440c3ca084c74862b7ce05d592d2c797 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 QNX Software 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:
* QNX Software Systems - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.debug.mi.core.cdi;
import java.util.HashMap;
import org.eclipse.cdt.debug.core.cdi.CDIException;
import org.eclipse.cdt.debug.core.cdi.model.ICDIThread;
import org.eclipse.cdt.debug.mi.core.MIException;
import org.eclipse.cdt.debug.mi.core.MISession;
import org.eclipse.cdt.debug.mi.core.cdi.model.Target;
import org.eclipse.cdt.debug.mi.core.cdi.model.Thread;
import org.eclipse.cdt.debug.mi.core.command.CommandFactory;
import org.eclipse.cdt.debug.mi.core.command.CLIInfoThreads;
import org.eclipse.cdt.debug.mi.core.output.CLIInfoThreadsInfo;
/**
*/
public class ThreadManager extends Manager { //implements ICDIThreadManager {
static final Thread[] noThreads = new Thread[0];
HashMap threadMap;
class ThreadSet {
ICDIThread[] currentThreads;
int currentThreadId;
ThreadSet(ICDIThread[] threads, int id) {
currentThreads = threads;
currentThreadId = id;
}
}
public ThreadManager(Session session) {
super(session, true);
threadMap = new HashMap();
}
/**
* @see org.eclipse.cdt.debug.core.cdi.ICDIThreadManager#getThreads()
*/
public ICDIThread[] getThreads() throws CDIException {
return new ICDIThread[] {};
}
/**
* @see org.eclipse.cdt.debug.core.cdi.ICDIThreadManager#getThreads()
*/
public ICDIThread[] getThreads(Target process) throws CDIException {
ThreadSet set = (ThreadSet)threadMap.get(process);
if (set == null) {
set = getCThreads(process);
threadMap.put(process, set);
}
return set.currentThreads;
}
public ThreadSet getCThreads(Target process) throws CDIException {
Thread[] cthreads = noThreads;
int currentThreadId = 0;
MISession mi = process.getMISession();
CommandFactory factory = mi.getCommandFactory();
try {
// HACK/FIXME: gdb/mi thread-list-ids does not
// show any newly create thread, we workaround by
// issuing "info threads" instead.
//MIThreadListIds tids = factory.createMIThreadListIds();
//MIThreadListIdsInfo info = tids.getMIThreadListIdsInfo();
CLIInfoThreads tids = factory.createCLIInfoThreads();
mi.postCommand(tids);
CLIInfoThreadsInfo info = tids.getMIInfoThreadsInfo();
int [] ids;
if (info == null) {
ids = new int[0];
} else {
ids = info.getThreadIds();
}
if (ids != null && ids.length > 0) {
cthreads = new Thread[ids.length];
// Ok that means it is a multiThreaded.
for (int i = 0; i < ids.length; i++) {
cthreads[i] = new Thread(process, ids[i]);
}
} else {
// Provide a dummy.
cthreads = new Thread[]{new Thread(process, 0)};
}
currentThreadId = info.getCurrentThread();
//FIX: When attaching there is no thread selected
// We will choose the first one as a workaround.
if (currentThreadId == 0 && cthreads.length > 0) {
currentThreadId = cthreads[0].getId();
}
} catch (MIException e) {
throw new CDIException(e.getMessage());
}
return new ThreadSet(cthreads, currentThreadId);
}
@Override
public void update(Target target) throws CDIException {
}
}