1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-01 06:05:24 +02:00

Bug 345164 - Spawner leaks pipes

This commit is contained in:
Anton Leherbauer 2011-05-11 08:35:03 +00:00
parent 6ea674106c
commit 19370c7dcf
5 changed files with 54 additions and 32 deletions

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2000, 2010 QNX Software Systems and others.
* Copyright (c) 2000, 2011 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
@ -81,6 +81,11 @@ class PTYInputStream extends InputStream {
master.setFD(-1);
}
@Override
protected void finalize() throws IOException {
close();
}
private native int read0(int fd, byte[] buf, int len) throws IOException;
private native int close0(int fd) throws IOException;

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2000, 2008 QNX Software Systems and others.
* Copyright (c) 2000, 2011 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
@ -75,6 +75,11 @@ public class PTYOutputStream extends OutputStream {
master.setFD(-1);
}
@Override
protected void finalize() throws IOException {
close();
}
private native int write0(int fd, byte[] b, int len) throws IOException;
private native int close0(int fd) throws IOException;

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2000, 2010 QNX Software Systems and others.
* Copyright (c) 2000, 2011 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
@ -141,12 +141,17 @@ public class Spawner extends Process {
exec(cmdarray, envp, dirpath);
}
@Override
protected void finalize() throws Throwable {
closeUnusedStreams();
}
/**
* See java.lang.Process#getInputStream ();
* The client is responsible for closing the stream explicitly.
**/
@Override
public InputStream getInputStream() {
public synchronized InputStream getInputStream() {
if(null == in) {
if (fPty != null) {
in = fPty.getInputStream();
@ -162,7 +167,7 @@ public class Spawner extends Process {
* The client is responsible for closing the stream explicitly.
**/
@Override
public OutputStream getOutputStream() {
public synchronized OutputStream getOutputStream() {
if(null == out) {
if (fPty != null) {
out = fPty.getOutputStream();
@ -178,7 +183,7 @@ public class Spawner extends Process {
* The client is responsible for closing the stream explicitly.
**/
@Override
public InputStream getErrorStream() {
public synchronized InputStream getErrorStream() {
if(null == err) {
if (fPty != null && !fPty.isConsole()) {
// If PTY is used and it's not in "Console" mode, then stderr is
@ -215,18 +220,7 @@ public class Spawner extends Process {
// closed by the client itself.
//
// But 345164
try {
if(null == err)
getErrorStream().close();
} catch (IOException e) {}
try {
if(null == in)
getInputStream().close();
} catch (IOException e) {}
try {
if(null == out)
getOutputStream().close();
} catch (IOException e) {}
closeUnusedStreams();
return status;
}
@ -272,18 +266,8 @@ public class Spawner extends Process {
// streams.
//
// But 345164
try {
if(null == err)
getErrorStream().close();
} catch (IOException e) {}
try {
if(null == in)
getInputStream().close();
} catch (IOException e) {}
try {
if(null == out)
getOutputStream().close();
} catch (IOException e) {}
closeUnusedStreams();
// Grace before using the heavy gone.
if (!isDone) {
try {
@ -418,6 +402,24 @@ public class Spawner extends Process {
}
}
/**
* Close any streams not used by clients.
*/
private synchronized void closeUnusedStreams() {
try {
if(null == err)
getErrorStream().close();
} catch (IOException e) {}
try {
if(null == in)
getInputStream().close();
} catch (IOException e) {}
try {
if(null == out)
getOutputStream().close();
} catch (IOException e) {}
}
/**
* Native method use in normal exec() calls.
*/

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2000, 2010 QNX Software Systems and others.
* Copyright (c) 2000, 2011 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
@ -98,6 +98,11 @@ class SpawnerInputStream extends InputStream {
}
}
@Override
protected void finalize() throws IOException {
close();
}
private native int read0(int fileDesc, byte[] buf, int len) throws IOException;
private native int close0(int fileDesc) throws IOException;
private native int available0(int fileDesc) throws IOException;

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2000, 2009 QNX Software Systems and others.
* Copyright (c) 2000, 2011 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
@ -76,6 +76,11 @@ public class SpawnerOutputStream extends OutputStream {
fd = -1;
}
@Override
protected void finalize() throws IOException {
close();
}
private native int write0(int fd, byte[] b, int len) throws IOException;
private native int close0(int fd);