Hi Alan,
Thanks for the comment, an answer is inlined.
On 10.6.2016 12:20, Alan Bateman wrote:
On 08/06/2016 18:39, Jan Lahoda wrote:
Hello,
When starting JShell on Windows, one may see a message like this:
?vn 08, 2016 6:46:35 ODP. java.util.prefs.WindowsPreferences <init>
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs
at root 0 x80000002. Windows RegCreateKeyEx(...) returned error code 5.
The problem, as far as I can understand, is that when the JShell tool
asks for the user Preferences (Preferences.userRoot()), not only the
user preferences get created, but also the system preferences get
created. And when the given (system) root node cannot be created (e.g.
due to permissions), the above warning is printed.
As JShell does not need system Preferences, I don't think this warning
does not make much sense in the JShell context. My proposal is to
create both the user and system Preferences lazily on Windows, so
applications that only need user Preferences don't trigger the
warning. As far as I can tell, this is consistent with what the
FileSystemPreferences do:
http://hg.openjdk.java.net/jdk9/dev/jdk/file/7f5b7acebffd/src/java.prefs/unix/classes/java/util/prefs/FileSystemPreferences.java#l160
Bugs:
https://bugs.openjdk.java.net/browse/JDK-8139507
https://bugs.openjdk.java.net/browse/JDK-8158292
Webrev:
http://cr.openjdk.java.net/~jlahoda/8139507/webrev.00/
Not sure if there's a way to write a test for the behavior, I didn't
see an obvious way. Any suggestions on testing would be welcome!
I don't know if the prefs APIs is used much but I assume it would be
better to not synchronized on the class and instead do something like:
The other Preferences implementations used this pattern, so I used it as
well. I don't have a problem with using double-checked locking. Updated
webrev:
http://cr.openjdk.java.net/~jlahoda/8139507/webrev.01
(updates all the Preferences implementations, to remain consistent.)
Jan
static volatile Preferences userRoot;
static Preferences getUserRoot() {
Preferences root = userRoot;
if (root == null) {
synchronized (Preferences.class) {
root = userRoot;
if (root == null) {
userRoot = root = new
WindowsPreferences(USER_ROOT_NATIVE_HANDLE,
WINDOWS_ROOT_PATH);
}
}
}
return root;
}
I'm not sure that a test is possible for the scenario as it would be too
fragile/dependent on whether the user running the test has privileges or
not.
-Alan