/******************************************************************************* * 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; import java.io.IOException; import java.io.OutputStream; import org.eclipse.cdt.debug.mi.core.command.CLICommand; import org.eclipse.cdt.debug.mi.core.command.Command; import org.eclipse.cdt.debug.mi.core.command.MIInterpreterExecConsole; import org.eclipse.cdt.debug.mi.core.command.RawCommand; /** * Transmission command thread blocks on the command Queue * and wake cmd are available and push them to gdb out channel. */ public class TxThread extends Thread { MISession session; CLIProcessor cli; public TxThread(MISession s) { super("MI TX Thread"); //$NON-NLS-1$ session = s; cli = new CLIProcessor(session); } public void run () { try { // signal by the session of time to die. OutputStream out; while ((out = session.getChannelOutputStream()) != null) { Command cmd = null; CommandQueue txQueue = session.getTxQueue(); // removeCommand() will block until a command is available. try { cmd = txQueue.removeCommand(); } catch (InterruptedException e) { //e.printStackTrace(); } if (cmd != null) { String str = cmd.toString(); // if string is empty consider as a noop if (str.length() > 0) { // Move to the RxQueue only if RxThread is alive. Thread rx = session.getRxThread(); if (rx != null && rx.isAlive() && !(cmd instanceof RawCommand)) { CommandQueue rxQueue = session.getRxQueue(); rxQueue.addCommand(cmd); } else { // The RxThread is not running synchronized (cmd) { cmd.notifyAll(); } } // Process the Command line to recognise patterns we may need to fire event. if (cmd instanceof CLICommand) { cli.processStateChanges((CLICommand)cmd); } else if (cmd instanceof MIInterpreterExecConsole) { cli.processStateChanges((MIInterpreterExecConsole)cmd); } // shove in the pipe if (out != null) { out.write(str.getBytes()); out.flush(); } } else { // String is empty consider as a noop synchronized (cmd) { cmd.notifyAll(); } } } } } catch (IOException e) { //e.printStackTrace(); } // Clear the queue and notify any command waiting, we are going down. CommandQueue txQueue = session.getTxQueue(); if (txQueue != null) { Command[] cmds = txQueue.clearCommands(); for (int i = 0; i < cmds.length; i++) { synchronized (cmds[i]) { cmds[i].notifyAll(); } } } } }