Don't cache null in getSystemService()

When Context.getSystemService(SERVICE_NAME) returns null, previously,
we remembered it and would always return null for the same service.

Now we stop doing it and always retry in the next call.

Bug: 175626705
Test: boot
Change-Id: I458e59fe2efc6278ff27d821f6ef516a48ded443
This commit is contained in:
Makoto Onuki
2021-01-05 13:10:35 -08:00
parent 583b2e5098
commit 1f33110f50

View File

@@ -1719,7 +1719,7 @@ public final class SystemServiceRegistry {
synchronized (cache) {
// Return it if we already have a cached instance.
T service = (T) cache[mCacheIndex];
if (service != null || gates[mCacheIndex] == ContextImpl.STATE_NOT_FOUND) {
if (service != null) {
ret = service;
break; // exit the for (;;)
}
@@ -1729,7 +1729,9 @@ public final class SystemServiceRegistry {
// Grr... if gate is STATE_READY, then this means we initialized the service
// once but someone cleared it.
// We start over from STATE_UNINITIALIZED.
if (gates[mCacheIndex] == ContextImpl.STATE_READY) {
// Similarly, if the previous attempt returned null, we'll retry again.
if (gates[mCacheIndex] == ContextImpl.STATE_READY
|| gates[mCacheIndex] == ContextImpl.STATE_NOT_FOUND) {
gates[mCacheIndex] = ContextImpl.STATE_UNINITIALIZED;
}