This is an automated email from the ASF dual-hosted git repository. matthiasblaesing pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-netbeans.git
commit 63eea8a40a9af4f981ca6361484b252faa6e1c3c Author: Matthias Bläsing <[email protected]> AuthorDate: Thu Nov 1 22:28:39 2018 +0100 [NETBEANS-1658] Revert "[NETBEANS-1197] Avoid ClosedByInterruptException in NetBeans' classloader. Use NIO by default, but fall back to the old FileInputStream if ClosedByInterruptException is detected." This reverts commit f84b25e042e1a3eeb88afcc12805cd74bc5e4fd7. --- .../src/org/netbeans/JarClassLoader.java | 74 ++++------------------ 1 file changed, 12 insertions(+), 62 deletions(-) diff --git a/platform/o.n.bootstrap/src/org/netbeans/JarClassLoader.java b/platform/o.n.bootstrap/src/org/netbeans/JarClassLoader.java index 77cc076..b1cdcc8 100644 --- a/platform/o.n.bootstrap/src/org/netbeans/JarClassLoader.java +++ b/platform/o.n.bootstrap/src/org/netbeans/JarClassLoader.java @@ -21,7 +21,6 @@ package org.netbeans; import java.io.ByteArrayInputStream; import java.io.File; -import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -37,7 +36,6 @@ import java.net.URISyntaxException; import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandler; -import java.nio.channels.ClosedByInterruptException; import java.nio.file.Files; import java.nio.file.InvalidPathException; import java.security.CodeSource; @@ -852,41 +850,20 @@ public class JarClassLoader extends ProxyClassLoader { super(BaseUtilities.toURI(file).toURL()); dir = file; } - - private Manifest getManifestHelper(boolean useNIO) throws IOException { - File maniF = new File(new File(dir, "META-INF"), "MANIFEST.MF"); - Manifest mf = new Manifest(); - if (maniF.canRead()) { - try (InputStream istm = useNIO - ? Files.newInputStream(maniF.toPath()) - : new FileInputStream(maniF)) - { - mf.read(istm); - } - } - return mf; - } - + public Manifest getManifest() { Manifest mf = manifest; if (mf != null) { return mf; } - try { - try { - mf = getManifestHelper(true); - } catch (ClosedByInterruptException ex) { - // See comments in readClass(). - LOGGER.log(Level.INFO, - "getManifest was interrupted; redoing operation with a regular FileInputStream"); - try { - mf = getManifestHelper(false); - } finally { - Thread.currentThread().interrupt(); - } + File maniF = new File(new File(dir, "META-INF"), "MANIFEST.MF"); + mf = new Manifest(); + if (maniF.canRead()) { + try (InputStream istm = Files.newInputStream(maniF.toPath())) { + mf.read(istm); + } catch (IOException | InvalidPathException ex) { + Exceptions.printStackTrace(ex); } - } catch (IOException | InvalidPathException ex) { - Exceptions.printStackTrace(ex); } return manifest = mf; } @@ -899,17 +876,14 @@ public class JarClassLoader extends ProxyClassLoader { File resFile = new File(dir, name); return resFile.exists() ? BaseUtilities.toURI(resFile).toURL() : null; } - - private byte[] readClassHelper(String path, boolean usingNIO) throws IOException { + + protected byte[] readClass(String path) throws IOException { File clsFile = new File(dir, path.replace('/', File.separatorChar)); if (!clsFile.exists()) return null; - + int len = (int)clsFile.length(); byte[] data = new byte[len]; - try (InputStream is = usingNIO - ? Files.newInputStream(clsFile.toPath()) - : new FileInputStream(clsFile)) - { + try (InputStream is = Files.newInputStream(clsFile.toPath())) { int count = 0; while (count < len) { count += is.read(data, count, len - count); @@ -919,30 +893,6 @@ public class JarClassLoader extends ProxyClassLoader { throw new IOException(ex); } } - - protected byte[] readClass(String path) throws IOException { - /* "FileOutputStream and FileInputStream complicate GC because they both override - 'finalize()'. Switching to NIO API creates Stream without finalizers and thus relieving - GC." However, using NIO means IO operations can fail with a ClosedByInterruptException, - for instance if client code starts a new thread which needs to load some new classes, - and then interrupts the thread before class loading has finished. See NETBEANS-1197. - Note that the old java.io.InterruptedIOException, which could in theory be called even - from FileOutputStream/FileInputStream, was seldom seen in practice; see JDK-4385444. */ - try { - return readClassHelper(path, true); - } catch (ClosedByInterruptException ex) { - LOGGER.log(Level.INFO, - "readClass was interrupted; redoing operation with a regular FileInputStream"); - try { - return readClassHelper(path, false); - } finally { - /* The wording in ClosedByInterruptException's Javadoc is a little ambiguous as to - whether the thread's interrupt status will remain set _after_ the - ClosedByInterruptException exception is thrown, so set it here just to be safe. */ - Thread.currentThread().interrupt(); - } - } - } protected void listCoveredPackages(Set<String> known, StringBuffer save) { appendAllChildren(known, save, dir, ""); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected] For further information about the NetBeans mailing lists, visit: https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists
