diff --git a/src/macosx/classes/java/util/prefs/MacOSXPreferences.java b/src/macosx/classes/java/util/prefs/MacOSXPreferences.java index 66b3e3af4e0b6c0a04774ccb84a6c8eb8ba85835..7a4ef4b6605ee4f58b91ef6c29e3543554c19ccd 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 a5d6293bd8c6318f4d1377e5356a3142de62df6e..7cfb899ddf47a9c90b096ff29462320a80612f15 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