# HG changeset patch # User martin # Date 1543256640 28800 # Mon Nov 26 10:24:00 2018 -0800 # Node ID 4a725dd89094d3b1227c1247388782a955285c61 # Parent e017d2f176d0119cdc70c9f2ee98e78c0c13f0c7 8213406: (fs) More than one instance of built-in FileSystem observed in heap Reviewed-by: alanb, cushon, weijun diff --git a/src/java.base/aix/classes/sun/nio/fs/AixFileSystemProvider.java b/src/java.base/aix/classes/sun/nio/fs/AixFileSystemProvider.java --- a/src/java.base/aix/classes/sun/nio/fs/AixFileSystemProvider.java +++ b/src/java.base/aix/classes/sun/nio/fs/AixFileSystemProvider.java @@ -32,7 +32,7 @@ * AIX implementation of FileSystemProvider */ -public class AixFileSystemProvider extends UnixFileSystemProvider { +class AixFileSystemProvider extends UnixFileSystemProvider { public AixFileSystemProvider() { super(); } diff --git a/src/java.base/aix/classes/sun/nio/fs/DefaultFileSystemProvider.java b/src/java.base/aix/classes/sun/nio/fs/DefaultFileSystemProvider.java --- a/src/java.base/aix/classes/sun/nio/fs/DefaultFileSystemProvider.java +++ b/src/java.base/aix/classes/sun/nio/fs/DefaultFileSystemProvider.java @@ -25,19 +25,21 @@ package sun.nio.fs; -import java.nio.file.spi.FileSystemProvider; +import java.nio.file.FileSystem; /** - * Creates this platform's default FileSystemProvider. + * Creates this platform's system-default ("builtin") FileSystemProvider. */ public class DefaultFileSystemProvider { private DefaultFileSystemProvider() { } - /** - * Returns the default FileSystemProvider. - */ - public static FileSystemProvider create() { - return new AixFileSystemProvider(); + /** The unique instance of the system-default file system provider. */ + public static final AixFileSystemProvider FILE_SYSTEM_PROVIDER + = new AixFileSystemProvider(); + + /** Returns the unique instance of the system-default file system. */ + public static FileSystem theFileSystem() { + return FILE_SYSTEM_PROVIDER.theFileSystem; } } diff --git a/src/java.base/linux/classes/sun/nio/fs/DefaultFileSystemProvider.java b/src/java.base/linux/classes/sun/nio/fs/DefaultFileSystemProvider.java --- a/src/java.base/linux/classes/sun/nio/fs/DefaultFileSystemProvider.java +++ b/src/java.base/linux/classes/sun/nio/fs/DefaultFileSystemProvider.java @@ -25,19 +25,21 @@ package sun.nio.fs; -import java.nio.file.spi.FileSystemProvider; +import java.nio.file.FileSystem; /** - * Creates this platform's default FileSystemProvider. + * Creates this platform's system-default ("builtin") FileSystemProvider. */ public class DefaultFileSystemProvider { private DefaultFileSystemProvider() { } - /** - * Returns the default FileSystemProvider. - */ - public static FileSystemProvider create() { - return new LinuxFileSystemProvider(); + /** The unique instance of the system-default file system provider. */ + public static final LinuxFileSystemProvider FILE_SYSTEM_PROVIDER + = new LinuxFileSystemProvider(); + + /** Returns the unique instance of the system-default file system. */ + public static FileSystem theFileSystem() { + return FILE_SYSTEM_PROVIDER.theFileSystem; } } diff --git a/src/java.base/linux/classes/sun/nio/fs/LinuxFileSystemProvider.java b/src/java.base/linux/classes/sun/nio/fs/LinuxFileSystemProvider.java --- a/src/java.base/linux/classes/sun/nio/fs/LinuxFileSystemProvider.java +++ b/src/java.base/linux/classes/sun/nio/fs/LinuxFileSystemProvider.java @@ -36,7 +36,7 @@ * Linux implementation of FileSystemProvider */ -public class LinuxFileSystemProvider extends UnixFileSystemProvider { +class LinuxFileSystemProvider extends UnixFileSystemProvider { public LinuxFileSystemProvider() { super(); } diff --git a/src/java.base/macosx/classes/sun/nio/fs/BsdFileSystemProvider.java b/src/java.base/macosx/classes/sun/nio/fs/BsdFileSystemProvider.java --- a/src/java.base/macosx/classes/sun/nio/fs/BsdFileSystemProvider.java +++ b/src/java.base/macosx/classes/sun/nio/fs/BsdFileSystemProvider.java @@ -31,7 +31,7 @@ * Bsd implementation of FileSystemProvider */ -public class BsdFileSystemProvider extends UnixFileSystemProvider { +class BsdFileSystemProvider extends UnixFileSystemProvider { public BsdFileSystemProvider() { super(); } diff --git a/src/java.base/macosx/classes/sun/nio/fs/DefaultFileSystemProvider.java b/src/java.base/macosx/classes/sun/nio/fs/DefaultFileSystemProvider.java --- a/src/java.base/macosx/classes/sun/nio/fs/DefaultFileSystemProvider.java +++ b/src/java.base/macosx/classes/sun/nio/fs/DefaultFileSystemProvider.java @@ -25,19 +25,21 @@ package sun.nio.fs; -import java.nio.file.spi.FileSystemProvider; +import javaimport java.nio.file.FileSystem; /** - * Creates this platform's default FileSystemProvider. + * Creates this platform's system-default ("builtin") FileSystemProvider. */ public class DefaultFileSystemProvider { private DefaultFileSystemProvider() { } - /** - * Returns the default FileSystemProvider. - */ - public static FileSystemProvider create() { - return new MacOSXFileSystemProvider(); + /** The unique instance of the system-default file system provider. */ + public static final MacOSXFileSystemProvider FILE_SYSTEM_PROVIDER + = new MacOSXFileSystemProvider(); + + /** Returns the unique instance of the system-default file system. */ + public static FileSystem theFileSystem() { + return FILE_SYSTEM_PROVIDER.theFileSystem; } } diff --git a/src/java.base/macosx/classes/sun/nio/fs/MacOSXFileSystemProvider.java b/src/java.base/macosx/classes/sun/nio/fs/MacOSXFileSystemProvider.java --- a/src/java.base/macosx/classes/sun/nio/fs/MacOSXFileSystemProvider.java +++ b/src/java.base/macosx/classes/sun/nio/fs/MacOSXFileSystemProvider.java @@ -34,7 +34,7 @@ * MacOSX implementation of FileSystemProvider */ -public class MacOSXFileSystemProvider extends BsdFileSystemProvider { +class MacOSXFileSystemProvider extends BsdFileSystemProvider { public MacOSXFileSystemProvider() { super(); } diff --git a/src/java.base/share/classes/java/io/FilePermission.java b/src/java.base/share/classes/java/io/FilePermission.java --- a/src/java.base/share/classes/java/io/FilePermission.java +++ b/src/java.base/share/classes/java/io/FilePermission.java @@ -25,7 +25,6 @@ package java.io; -import java.net.URI; import java.nio.file.*; import java.security.*; import java.util.Enumeration; @@ -198,13 +197,12 @@ private static final long serialVersionUID = 7930732926638008763L; - /** - * Always use the internal default file system, in case it was modified - * with java.nio.file.spi.DefaultFileSystemProvider. + /** + * Always use the builtin system-default file system, in case the + * java.nio.file.spi.DefaultFileSystemProvider system property is set. */ private static final java.nio.file.FileSystem builtInFS = - DefaultFileSystemProvider.create() - .getFileSystem(URI.create("file:///")); + DefaultFileSystemProvider.theFileSystem(); private static final Path here = builtInFS.getPath( GetPropertyAction.privilegedGetProperty("user.dir")); @@ -326,7 +324,7 @@ if (name.equals("<>")) { allFiles = true; - npath = builtInFS.getPath(""); + npath = EMPTY_PATH; // other fields remain default return; } @@ -351,7 +349,7 @@ npath = npath.getParent(); } if (npath == null) { - npath = builtInFS.getPath(""); + npath = EMPTY_PATH; } invalid = false; } catch (InvalidPathException ipe) { diff --git a/src/java.base/share/classes/java/nio/file/FileSystems.java b/src/java.base/share/classes/java/nio/file/FileSystems.java --- a/src/java.base/share/classes/java/nio/file/FileSystems.java +++ b/src/java.base/share/classes/java/nio/file/FileSystems.java @@ -88,16 +88,6 @@ public final class FileSystems { private FileSystems() { } - // Built-in file system provider - private static final FileSystemProvider builtinFileSystemProvider = - sun.nio.fs.DefaultFileSystemProvider.create(); - - // built-in file system - private static class BuiltinFileSystemHolder { - static final FileSystem builtinFileSystem = - builtinFileSystemProvider.getFileSystem(URI.create("file:///")); - } - // lazy initialization of default file system private static class DefaultFileSystemHolder { static final FileSystem defaultFileSystem = defaultFileSystem(); @@ -118,7 +108,8 @@ // returns default provider private static FileSystemProvider getDefaultProvider() { - FileSystemProvider provider = builtinFileSystemProvider; + FileSystemProvider provider = + sun.nio.fs.DefaultFileSystemProvider.FILE_SYSTEM_PROVIDER; // if the property java.nio.file.spi.DefaultFileSystemProvider is // set then its value is the name of the default provider (or a list) @@ -189,7 +180,7 @@ if (VM.isModuleSystemInited()) { return DefaultFileSystemHolder.defaultFileSystem; } else { - return BuiltinFileSystemHolder.builtinFileSystem; + return sun.nio.fs.DefaultFileSystemProvider.theFileSystem(); } } diff --git a/src/java.base/share/classes/java/nio/file/spi/FileSystemProvider.java b/src/java.base/share/classes/java/nio/file/spi/FileSystemProvider.java --- a/src/java.base/share/classes/java/nio/file/spi/FileSystemProvider.java +++ b/src/java.base/share/classes/java/nio/file/spi/FileSystemProvider.java @@ -101,7 +101,7 @@ * obtain a reference to an existing file system created by the provider. Where * a provider is the factory for a single file system then it is provider dependent * if the file system is created when the provider is initialized, or later when - * the {@code newFileSystem} method is invoked. In the case of the default + * the {@code newFileSystem} method is invoked. In the case of the system-default * provider, the {@code FileSystem} is created when the provider is initialized. * *

All of the methods in this class are safe for use by multiple concurrent diff --git a/src/java.base/solaris/classes/sun/nio/fs/DefaultFileSystemProvider.java b/src/java.base/solaris/classes/sun/nio/fs/DefaultFileSystemProvider.java --- a/src/java.base/solaris/classes/sun/nio/fs/DefaultFileSystemProvider.java +++ b/src/java.base/solaris/classes/sun/nio/fs/DefaultFileSystemProvider.java @@ -25,19 +25,21 @@ package sun.nio.fs; -import java.nio.file.spi.FileSystemProvider; +import java.nio.file.FileSystem; /** - * Creates this platform's default FileSystemProvider. + * Creates this platform's system-default ("builtin") FileSystemProvider. */ public class DefaultFileSystemProvider { private DefaultFileSystemProvider() { } - /** - * Returns the default FileSystemProvider. - */ - public static FileSystemProvider create() { - return new SolarisFileSystemProvider(); + /** The unique instance of the system-default file system provider. */ + public static final SolarisFileSystemProvider FILE_SYSTEM_PROVIDER + = new SolarisFileSystemProvider(); + + /** Returns the unique instance of the system-default file system. */ + public static FileSystem theFileSystem() { + return FILE_SYSTEM_PROVIDER.theFileSystem; } } diff --git a/src/java.base/solaris/classes/sun/nio/fs/SolarisFileSystemProvider.java b/src/java.base/solaris/classes/sun/nio/fs/SolarisFileSystemProvider.java --- a/src/java.base/solaris/classes/sun/nio/fs/SolarisFileSystemProvider.java +++ b/src/java.base/solaris/classes/sun/nio/fs/SolarisFileSystemProvider.java @@ -36,7 +36,7 @@ * Solaris implementation of FileSystemProvider */ -public class SolarisFileSystemProvider extends UnixFileSystemProvider { +class SolarisFileSystemProvider extends UnixFileSystemProvider { public SolarisFileSystemProvider() { super(); } diff --git a/src/java.base/unix/classes/sun/nio/fs/UnixFileSystemProvider.java b/src/java.base/unix/classes/sun/nio/fs/UnixFileSystemProvider.java --- a/src/java.base/unix/classes/sun/nio/fs/UnixFileSystemProvider.java +++ b/src/java.base/unix/classes/sun/nio/fs/UnixFileSystemProvider.java @@ -49,7 +49,7 @@ extends AbstractFileSystemProvider { private static final String USER_DIR = "user.dir"; - private final UnixFileSystem theFileSystem; + final UnixFileSystem theFileSystem; public UnixFileSystemProvider() { String userDir = System.getProperty(USER_DIR); diff --git a/src/java.base/windows/classes/sun/nio/fs/DefaultFileSystemProvider.java b/src/java.base/windows/classes/sun/nio/fs/DefaultFileSystemProvider.java --- a/src/java.base/windows/classes/sun/nio/fs/DefaultFileSystemProvider.java +++ b/src/java.base/windows/classes/sun/nio/fs/DefaultFileSystemProvider.java @@ -25,14 +25,20 @@ package sun.nio.fs; -import java.nio.file.spi.FileSystemProvider; +import java.nio.file.FileSystem; /** - * Creates default provider on Windows + * Creates this platform's system-default ("builtin") FileSystemProvider. */ public class DefaultFileSystemProvider { private DefaultFileSystemProvider() { } - public static FileSystemProvider create() { - return new WindowsFileSystemProvider(); + + /** The unique instance of the system-default file system provider. */ + public static final WindowsFileSystemProvider FILE_SYSTEM_PROVIDER + = new WindowsFileSystemProvider(); + + /** Returns the unique instance of the system-default file system. */ + public static FileSystem theFileSystem() { + return FILE_SYSTEM_PROVIDER.theFileSystem; } } diff --git a/src/java.base/windows/classes/sun/nio/fs/WindowsFileSystemProvider.java b/src/java.base/windows/classes/sun/nio/fs/WindowsFileSystemProvider.java --- a/src/java.base/windows/classes/sun/nio/fs/WindowsFileSystemProvider.java +++ b/src/java.base/windows/classes/sun/nio/fs/WindowsFileSystemProvider.java @@ -42,12 +42,12 @@ import static sun.nio.fs.WindowsSecurity.*; import static sun.nio.fs.WindowsConstants.*; -public class WindowsFileSystemProvider +class WindowsFileSystemProvider extends AbstractFileSystemProvider { private static final Unsafe unsafe = Unsafe.getUnsafe(); - private final WindowsFileSystem theFileSystem; + final WindowsFileSystem theFileSystem; public WindowsFileSystemProvider() { theFileSystem = new WindowsFileSystem(this, StaticProperty.userDir());