[core] Avoid setScope starving (#1060)
This commit is contained in:
parent
6e036f49da
commit
3613c09719
|
|
@ -153,7 +153,7 @@ public class ConfigManager {
|
||||||
private final Map<Pair<String, Integer>, Map<String, ConcurrentHashMap<String, Object>>> cachedConfig = new ConcurrentHashMap<>();
|
private final Map<Pair<String, Integer>, Map<String, ConcurrentHashMap<String, Object>>> cachedConfig = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
private void updateCaches(boolean sync) {
|
private void updateCaches(boolean sync) {
|
||||||
synchronized (this) {
|
synchronized (cacheHandler) {
|
||||||
requestScopeCacheTime = requestModuleCacheTime = SystemClock.elapsedRealtime();
|
requestScopeCacheTime = requestModuleCacheTime = SystemClock.elapsedRealtime();
|
||||||
}
|
}
|
||||||
if (sync) {
|
if (sync) {
|
||||||
|
|
@ -256,7 +256,11 @@ public class ConfigManager {
|
||||||
static ConfigManager getInstance() {
|
static ConfigManager getInstance() {
|
||||||
if (instance == null)
|
if (instance == null)
|
||||||
instance = new ConfigManager();
|
instance = new ConfigManager();
|
||||||
if (instance.lastModuleCacheTime == 0 || instance.lastScopeCacheTime == 0) {
|
boolean needCached;
|
||||||
|
synchronized (instance.cacheHandler) {
|
||||||
|
needCached = instance.lastModuleCacheTime == 0 || instance.lastScopeCacheTime == 0;
|
||||||
|
}
|
||||||
|
if (needCached) {
|
||||||
if (PackageService.isAlive()) {
|
if (PackageService.isAlive()) {
|
||||||
Log.d(TAG, "pm is ready, updating cache");
|
Log.d(TAG, "pm is ready, updating cache");
|
||||||
// must ensure cache is valid for later usage
|
// must ensure cache is valid for later usage
|
||||||
|
|
@ -347,8 +351,10 @@ public class ConfigManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized void clearCache() {
|
private synchronized void clearCache() {
|
||||||
lastScopeCacheTime = 0;
|
synchronized (cacheHandler) {
|
||||||
lastModuleCacheTime = 0;
|
lastScopeCacheTime = 0;
|
||||||
|
lastModuleCacheTime = 0;
|
||||||
|
}
|
||||||
cachedModule.clear();
|
cachedModule.clear();
|
||||||
cachedScope.clear();
|
cachedScope.clear();
|
||||||
}
|
}
|
||||||
|
|
@ -356,8 +362,10 @@ public class ConfigManager {
|
||||||
private synchronized void cacheModules() {
|
private synchronized void cacheModules() {
|
||||||
// skip caching when pm is not yet available
|
// skip caching when pm is not yet available
|
||||||
if (!PackageService.isAlive()) return;
|
if (!PackageService.isAlive()) return;
|
||||||
if (lastModuleCacheTime >= requestModuleCacheTime) return;
|
synchronized (cacheHandler) {
|
||||||
else lastModuleCacheTime = SystemClock.elapsedRealtime();
|
if (lastModuleCacheTime >= requestModuleCacheTime) return;
|
||||||
|
else lastModuleCacheTime = SystemClock.elapsedRealtime();
|
||||||
|
}
|
||||||
try (Cursor cursor = db.query(true, "modules", new String[]{"module_pkg_name", "apk_path"},
|
try (Cursor cursor = db.query(true, "modules", new String[]{"module_pkg_name", "apk_path"},
|
||||||
"enabled = 1", null, null, null, null, null)) {
|
"enabled = 1", null, null, null, null, null)) {
|
||||||
if (cursor == null) {
|
if (cursor == null) {
|
||||||
|
|
@ -434,8 +442,10 @@ public class ConfigManager {
|
||||||
private synchronized void cacheScopes() {
|
private synchronized void cacheScopes() {
|
||||||
// skip caching when pm is not yet available
|
// skip caching when pm is not yet available
|
||||||
if (!PackageService.isAlive()) return;
|
if (!PackageService.isAlive()) return;
|
||||||
if (lastScopeCacheTime >= requestScopeCacheTime) return;
|
synchronized (cacheHandler) {
|
||||||
else lastScopeCacheTime = SystemClock.elapsedRealtime();
|
if (lastScopeCacheTime >= requestScopeCacheTime) return;
|
||||||
|
else lastScopeCacheTime = SystemClock.elapsedRealtime();
|
||||||
|
}
|
||||||
cachedScope.clear();
|
cachedScope.clear();
|
||||||
try (Cursor cursor = db.query("scope INNER JOIN modules ON scope.mid = modules.mid", new String[]{"app_pkg_name", "module_pkg_name", "user_id"},
|
try (Cursor cursor = db.query("scope INNER JOIN modules ON scope.mid = modules.mid", new String[]{"app_pkg_name", "module_pkg_name", "user_id"},
|
||||||
"enabled = 1", null, null, null, null)) {
|
"enabled = 1", null, null, null, null)) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue