Persist settings on a dedicated background thread am: 82b8c92b97
am: f528fb457b
* commit 'f528fb457bbec504ba9e8f6b779fa70f6f37cb58':
Persist settings on a dedicated background thread
Change-Id: I319491186231ebe1f90e97d52551536c30b77a6d
This commit is contained in:
@ -46,6 +46,7 @@ import android.os.Debug;
|
||||
import android.os.DropBoxManager;
|
||||
import android.os.Environment;
|
||||
import android.os.Handler;
|
||||
import android.os.HandlerThread;
|
||||
import android.os.Looper;
|
||||
import android.os.Message;
|
||||
import android.os.ParcelFileDescriptor;
|
||||
@ -199,6 +200,12 @@ public class SettingsProvider extends ContentProvider {
|
||||
@GuardedBy("mLock")
|
||||
private SettingsRegistry mSettingsRegistry;
|
||||
|
||||
@GuardedBy("mLock")
|
||||
private HandlerThread mHandlerThread;
|
||||
|
||||
@GuardedBy("mLock")
|
||||
private Handler mBackgroundHandler;
|
||||
|
||||
// We have to call in the user manager with no lock held,
|
||||
private volatile UserManager mUserManager;
|
||||
|
||||
@ -245,6 +252,10 @@ public class SettingsProvider extends ContentProvider {
|
||||
mUserManager = UserManager.get(getContext());
|
||||
mPackageManager = AppGlobals.getPackageManager();
|
||||
mSettingsRegistry = new SettingsRegistry();
|
||||
mHandlerThread = new HandlerThread(LOG_TAG,
|
||||
Process.THREAD_PRIORITY_BACKGROUND);
|
||||
mHandlerThread.start();
|
||||
mBackgroundHandler = new Handler(mHandlerThread.getLooper());
|
||||
}
|
||||
registerBroadcastReceivers();
|
||||
startWatchingUserRestrictionChanges();
|
||||
@ -1669,7 +1680,7 @@ public class SettingsProvider extends ContentProvider {
|
||||
if (mSettingsStates.get(key) == null) {
|
||||
final int maxBytesPerPackage = getMaxBytesPerPackageForType(getTypeFromKey(key));
|
||||
SettingsState settingsState = new SettingsState(mLock, getSettingsFile(key), key,
|
||||
maxBytesPerPackage);
|
||||
maxBytesPerPackage, mBackgroundHandler);
|
||||
mSettingsStates.put(key, settingsState);
|
||||
}
|
||||
}
|
||||
|
@ -95,7 +95,7 @@ final class SettingsState {
|
||||
|
||||
private final Object mLock;
|
||||
|
||||
private final Handler mHandler = new MyHandler();
|
||||
private final Handler mHandler;
|
||||
|
||||
@GuardedBy("mLock")
|
||||
private final ArrayMap<String, Setting> mSettings = new ArrayMap<>();
|
||||
@ -134,13 +134,15 @@ final class SettingsState {
|
||||
@GuardedBy("mLock")
|
||||
private long mNextId;
|
||||
|
||||
public SettingsState(Object lock, File file, int key, int maxBytesPerAppPackage) {
|
||||
public SettingsState(Object lock, File file, int key, int maxBytesPerAppPackage,
|
||||
Handler handler) {
|
||||
// It is important that we use the same lock as the settings provider
|
||||
// to ensure multiple mutations on this state are atomicaly persisted
|
||||
// as the async persistence should be blocked while we make changes.
|
||||
mLock = lock;
|
||||
mStatePersistFile = file;
|
||||
mKey = key;
|
||||
mHandler = handler;
|
||||
if (maxBytesPerAppPackage == MAX_BYTES_PER_APP_PACKAGE_LIMITED) {
|
||||
mMaxBytesPerAppPackage = maxBytesPerAppPackage;
|
||||
mPackageToMemoryUsage = new ArrayMap<>();
|
||||
|
@ -15,6 +15,7 @@
|
||||
*/
|
||||
package com.android.providers.settings;
|
||||
|
||||
import android.os.Handler;
|
||||
import android.test.AndroidTestCase;
|
||||
import android.util.Xml;
|
||||
|
||||
@ -126,7 +127,7 @@ public class SettingsStateTest extends AndroidTestCase {
|
||||
final Object lock = new Object();
|
||||
|
||||
final SettingsState ssWriter = new SettingsState(lock, file, 1,
|
||||
SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED);
|
||||
SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED, new Handler());
|
||||
ssWriter.setVersionLocked(SettingsState.SETTINGS_VERSOIN_NEW_ENCODING);
|
||||
|
||||
ssWriter.insertSettingLocked("k1", "\u0000", "package");
|
||||
@ -138,7 +139,7 @@ public class SettingsStateTest extends AndroidTestCase {
|
||||
}
|
||||
|
||||
final SettingsState ssReader = new SettingsState(lock, file, 1,
|
||||
SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED);
|
||||
SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED, new Handler());
|
||||
synchronized (lock) {
|
||||
assertEquals("\u0000", ssReader.getSettingLocked("k1").getValue());
|
||||
assertEquals("abc", ssReader.getSettingLocked("k2").getValue());
|
||||
@ -165,7 +166,7 @@ public class SettingsStateTest extends AndroidTestCase {
|
||||
os.close();
|
||||
|
||||
final SettingsState ss = new SettingsState(lock, file, 1,
|
||||
SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED);
|
||||
SettingsState.MAX_BYTES_PER_APP_PACKAGE_UNLIMITED, new Handler());
|
||||
synchronized (lock) {
|
||||
SettingsState.Setting s;
|
||||
s = ss.getSettingLocked("k0");
|
||||
|
Reference in New Issue
Block a user