From 20b1059092eb9a4490317ef26717b16a8146cb17 Mon Sep 17 00:00:00 2001 From: khazra Date: Thu, 26 Apr 2012 12:04:29 -0700 Subject: [PATCH] 7118100: (prefs) Inconsistency when using system and user preference on OSX Lion Summary: Enable user to read/write preferences to persistent storage Reviewed-by: alanb --- .../java/util/prefs/MacOSXPreferences.java | 10 ++++-- .../util/prefs/MacOSXPreferencesFile.java | 33 +++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/macosx/classes/java/util/prefs/MacOSXPreferences.java b/src/macosx/classes/java/util/prefs/MacOSXPreferences.java index 66b3e3af4..7a4ef4b66 100644 --- a/src/macosx/classes/java/util/prefs/MacOSXPreferences.java +++ b/src/macosx/classes/java/util/prefs/MacOSXPreferences.java @@ -231,8 +231,14 @@ class MacOSXPreferences extends AbstractPreferences { if (isRemoved()) throw new IllegalStateException("Node has been removed"); // fixme! overkill - if (!MacOSXPreferencesFile.syncWorld()) { - throw new BackingStoreException("Synchronization failed for node '" + path + "'"); + if (isUser) { + if (!MacOSXPreferencesFile.syncUser()) { + throw new BackingStoreException("Synchronization failed for node '" + path + "'"); + } + } else { + if (!MacOSXPreferencesFile.syncWorld()) { + throw new BackingStoreException("Synchronization failed for node '" + path + "'"); + } } } } diff --git a/src/macosx/classes/java/util/prefs/MacOSXPreferencesFile.java b/src/macosx/classes/java/util/prefs/MacOSXPreferencesFile.java index a5d6293bd..7cfb899dd 100644 --- a/src/macosx/classes/java/util/prefs/MacOSXPreferencesFile.java +++ b/src/macosx/classes/java/util/prefs/MacOSXPreferencesFile.java @@ -192,6 +192,39 @@ class MacOSXPreferencesFile { } + // Sync only current user preferences + static synchronized boolean syncUser() { + boolean ok = true; + if (cachedFiles != null && !cachedFiles.isEmpty()) { + Iterator iter = cachedFiles.values().iterator(); + while (iter.hasNext()) { + WeakReference ref = iter.next(); + MacOSXPreferencesFile f = (MacOSXPreferencesFile)ref.get(); + if (f != null && f.user == cfCurrentUser) { + if (!f.synchronize()) { + ok = false; + } + } else { + iter.remove(); + } + } + } + // Remove synchronized file from changed file list. The changed files were + // guaranteed to have been in the cached file list (because there was a strong + // reference from changedFiles. + if (changedFiles != null) { + Iterator iterChanged = changedFiles.iterator(); + while (iterChanged.hasNext()) { + MacOSXPreferencesFile f = iterChanged.next(); + if (f != null && f.user == cfCurrentUser) + iterChanged.remove(); + } + } + return ok; + } + + + // Write all prefs changes to disk, but do not clear all cached prefs // values. Also kills any scheduled flush task. // There's no CFPreferencesFlush() (), so lots of cached prefs -- GitLab