/******************************************************************************* * Copyright (c) 2016 Ericsson 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 *******************************************************************************/ package org.eclipse.cdt.utils.pty; import java.io.IOException; import org.eclipse.core.runtime.Platform; /** * A type of PTY that is persistent. This means that closing * its streams (e.g., once the connection to the process is lost) * will not close the PTY or the streams; instead, they will * remain open to be used again by reconnecting to the streams. * {@link PersistentPTY#closeStreams()} must be called to properly * cleanup the streams once the PersistentPTY is known not be needed * anymore. * * @since 5.10 */ public class PersistentPTY extends PTY { private class PersistentPTYInputStream extends PTYInputStream { public PersistentPTYInputStream(MasterFD fd) { super(fd); } @Override public void close() throws IOException { // This is the change to bring persistence. // Don't actually close the stream. } public void realClose() throws IOException { // This method should be called to actually close // the stream once we know it won't be needed anymore super.close(); } @Override protected void finalize() throws IOException { realClose(); } } private class PersistentPTYOutputStream extends PTYOutputStream { public PersistentPTYOutputStream(MasterFD fd, boolean sendEotBeforeClose) { super(fd, sendEotBeforeClose); } @Override public void close() throws IOException { // This is the change to bring persistence. // Don't actually close the stream. } public void realClose() throws IOException { // This method should be called to actually close // the stream once we know it won't be needed anymore super.close(); } @Override protected void finalize() throws IOException { realClose(); } } final PersistentPTYInputStream in2; final PersistentPTYOutputStream out2; public PersistentPTY() throws IOException { this(Mode.CONSOLE); } public PersistentPTY(Mode mode) throws IOException { super(mode); in2 = new PersistentPTYInputStream(new MasterFD()); out2 = new PersistentPTYOutputStream(new MasterFD(), !Platform.OS_WIN32.equals(Platform.getOS())); } @Override public PTYInputStream getInputStream() { return in2; } @Override public PTYOutputStream getOutputStream() { return out2; } /** * This method must be called once the PersistentPTY is * no longer needed, so that its streams can be closed. */ public void closeStreams() throws IOException { in2.realClose(); out2.realClose(); } }