diff options
| author | 2017-03-09 03:08:23 +0000 | |
|---|---|---|
| committer | 2017-03-09 03:08:26 +0000 | |
| commit | fe473986fcd65e9674bc460657799f23be2f5fe5 (patch) | |
| tree | aa7c613c7946dcf4023005bdf2891ee478e51110 | |
| parent | 35035f60664a35f51a2a6f5472db927cab8f1565 (diff) | |
| parent | e83df48908a1c83056f6be2d6d4a623a3c3bbd2a (diff) | |
Merge "Avoid cross lock acquisition leading to deadlocks"
| -rw-r--r-- | packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java index de79d3f98c32..5f4b2391a763 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java @@ -553,23 +553,23 @@ final class SettingsState { } private void doWriteState() { + boolean wroteState = false; + final int version; + final ArrayMap<String, Setting> settings; + + synchronized (mLock) { + version = mVersion; + settings = new ArrayMap<>(mSettings); + mDirty = false; + mWriteScheduled = false; + } + synchronized (mWriteLock) { if (DEBUG_PERSISTENCE) { Slog.i(LOG_TAG, "[PERSIST START]"); } AtomicFile destination = new AtomicFile(mStatePersistFile); - - final int version; - final ArrayMap<String, Setting> settings; - - synchronized (mLock) { - version = mVersion; - settings = new ArrayMap<>(mSettings); - mDirty = false; - mWriteScheduled = false; - } - FileOutputStream out = null; try { out = destination.startWrite(); @@ -600,9 +600,7 @@ final class SettingsState { serializer.endDocument(); destination.finishWrite(out); - synchronized (mLock) { - addHistoricalOperationLocked(HISTORICAL_OPERATION_PERSIST, null); - } + wroteState = true; if (DEBUG_PERSISTENCE) { Slog.i(LOG_TAG, "[PERSIST END]"); @@ -614,6 +612,12 @@ final class SettingsState { IoUtils.closeQuietly(out); } } + + if (wroteState) { + synchronized (mLock) { + addHistoricalOperationLocked(HISTORICAL_OPERATION_PERSIST, null); + } + } } static void writeSingleSetting(int version, XmlSerializer serializer, String id, |