You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by bo...@apache.org on 2009/09/03 09:06:59 UTC
svn commit: r810790 -
/ant/core/trunk/src/main/org/apache/tools/ant/filters/util/ChainReaderHelper.java
Author: bodewig
Date: Thu Sep 3 07:06:58 2009
New Revision: 810790
URL: http://svn.apache.org/viewvc?rev=810790&view=rev
Log:
clean up classloaders if things go wrong as well
Modified:
ant/core/trunk/src/main/org/apache/tools/ant/filters/util/ChainReaderHelper.java
Modified: ant/core/trunk/src/main/org/apache/tools/ant/filters/util/ChainReaderHelper.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/filters/util/ChainReaderHelper.java?rev=810790&r1=810789&r2=810790&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/filters/util/ChainReaderHelper.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/filters/util/ChainReaderHelper.java Thu Sep 3 07:06:58 2009
@@ -24,6 +24,7 @@
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Iterator;
+import java.util.List;
import java.util.Vector;
import org.apache.tools.ant.AntClassLoader;
import org.apache.tools.ant.BuildException;
@@ -138,6 +139,8 @@
final int filtersCount = finalFilters.size();
if (filtersCount > 0) {
+ boolean success = false;
+ try {
for (int i = 0; i < filtersCount; i++) {
Object o = finalFilters.elementAt(i);
@@ -155,8 +158,8 @@
} else {
AntClassLoader al
= pro.createClassLoader(classpath);
- clazz = Class.forName(className, true, al);
classLoadersToCleanUp.add(al);
+ clazz = Class.forName(className, true, al);
}
if (clazz != null) {
if (!FilterReader.class.isAssignableFrom(clazz)) {
@@ -208,16 +211,19 @@
setProjectOnObject(instream);
}
}
+ success = true;
+ } finally {
+ if (!success && classLoadersToCleanUp.size() > 0) {
+ cleanUpClassLoaders(classLoadersToCleanUp);
+ }
+ }
}
final Reader finalReader = instream;
return classLoadersToCleanUp.size() == 0 ? finalReader
: new FilterReader(finalReader) {
public void close() throws IOException {
FileUtils.close(in);
- for (Iterator it = classLoadersToCleanUp.iterator();
- it.hasNext(); ) {
- ((AntClassLoader) it.next()).cleanup();
- }
+ cleanUpClassLoaders(classLoadersToCleanUp);
}
protected void finalize() throws Throwable {
try {
@@ -246,6 +252,15 @@
}
/**
+ * Deregisters Classloaders from the project so GC can remove them later.
+ */
+ private static void cleanUpClassLoaders(List/*<AntClassLoader>*/ loaders) {
+ for (Iterator it = loaders.iterator(); it.hasNext(); ) {
+ ((AntClassLoader) it.next()).cleanup();
+ }
+ }
+
+ /**
* Read data from the reader and return the
* contents as a string.
* @param rdr the reader object