summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2017-03-09 03:08:23 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2017-03-09 03:08:26 +0000
commitfe473986fcd65e9674bc460657799f23be2f5fe5 (patch)
treeaa7c613c7946dcf4023005bdf2891ee478e51110
parent35035f60664a35f51a2a6f5472db927cab8f1565 (diff)
parente83df48908a1c83056f6be2d6d4a623a3c3bbd2a (diff)
Merge "Avoid cross lock acquisition leading to deadlocks"
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java32
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,