summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Michał Brzeziński <brzezinski@google.com> 2022-11-01 11:58:36 +0000
committer Michał Brzeziński <brzezinski@google.com> 2022-11-01 11:58:36 +0000
commit8ef5a2e3ae9fe53a71c8fc7c4a1e931b445fd06a (patch)
treefd5cbd63841f8558cd3f834c0d4959c0822cb1d3
parent46a36cb0a9a8b72462ee68b2cf1d008209bc8966 (diff)
Revert "BroadcastQueue: better state transition logging."
Revert submission 20329504 Reason for revert: Broken SystemServicesTestRuleTest Bug: 256741859 Reverted Changes: I1a74109e7:BroadcastQueue: return reasons from skip policy. I7fe33cd17:BroadcastQueue: better state transition logging. I9899e805f:BroadcastQueue: skip ANRs when assuming success. Change-Id: I31ad4804cde2e16d5ecffb8ea8c9cfa9fec4f23d
-rw-r--r--apex/jobscheduler/service/java/com/android/server/JobSchedulerBackgroundThread.java3
-rw-r--r--services/core/java/com/android/server/ServiceThread.java10
-rw-r--r--services/core/java/com/android/server/StorageManagerService.java2
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java2
-rw-r--r--services/core/java/com/android/server/am/BroadcastLoopers.java3
-rw-r--r--services/core/java/com/android/server/am/BroadcastQueueModernImpl.java60
6 files changed, 29 insertions, 51 deletions
diff --git a/apex/jobscheduler/service/java/com/android/server/JobSchedulerBackgroundThread.java b/apex/jobscheduler/service/java/com/android/server/JobSchedulerBackgroundThread.java
index 6b01a9f446af..a413f7b1f3ca 100644
--- a/apex/jobscheduler/service/java/com/android/server/JobSchedulerBackgroundThread.java
+++ b/apex/jobscheduler/service/java/com/android/server/JobSchedulerBackgroundThread.java
@@ -22,8 +22,6 @@ import android.os.HandlerThread;
import android.os.Looper;
import android.os.Trace;
-import com.android.server.am.BroadcastLoopers;
-
import java.util.concurrent.Executor;
/**
@@ -47,7 +45,6 @@ public final class JobSchedulerBackgroundThread extends HandlerThread {
sInstance = new JobSchedulerBackgroundThread();
sInstance.start();
final Looper looper = sInstance.getLooper();
- BroadcastLoopers.addLooper(looper);
looper.setTraceTag(Trace.TRACE_TAG_SYSTEM_SERVER);
looper.setSlowLogThresholdMs(
SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);
diff --git a/services/core/java/com/android/server/ServiceThread.java b/services/core/java/com/android/server/ServiceThread.java
index 3ea4b86d5296..6d8e49c7c869 100644
--- a/services/core/java/com/android/server/ServiceThread.java
+++ b/services/core/java/com/android/server/ServiceThread.java
@@ -22,8 +22,6 @@ import android.os.Looper;
import android.os.Process;
import android.os.StrictMode;
-import com.android.server.am.BroadcastLoopers;
-
/**
* Special handler thread that we create for system services that require their own loopers.
*/
@@ -48,14 +46,6 @@ public class ServiceThread extends HandlerThread {
super.run();
}
- @Override
- protected void onLooperPrepared() {
- // Almost all service threads are used for dispatching broadcast
- // intents, so register ourselves to ensure that "wait-for-broadcast"
- // shell commands are able to drain any pending broadcasts
- BroadcastLoopers.addLooper(getLooper());
- }
-
protected static Handler makeSharedHandler(Looper looper) {
return new Handler(looper, /*callback=*/ null, /* async=*/ false, /* shared=*/ true);
}
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index c280719b06a3..72876f669f01 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -147,7 +147,6 @@ import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.Preconditions;
import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;
-import com.android.server.am.BroadcastLoopers;
import com.android.server.pm.Installer;
import com.android.server.pm.UserManagerInternal;
import com.android.server.storage.AppFuseBridge;
@@ -1810,7 +1809,6 @@ class StorageManagerService extends IStorageManager.Stub
HandlerThread hthread = new HandlerThread(TAG);
hthread.start();
- BroadcastLoopers.addLooper(hthread.getLooper());
mHandler = new StorageManagerServiceHandler(hthread.getLooper());
// Add OBB Action Handler to StorageManagerService thread.
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index f865b8a377f6..3032f17c2597 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -2508,8 +2508,6 @@ public class ActivityManagerService extends IActivityManager.Stub
Watchdog.getInstance().addMonitor(this);
Watchdog.getInstance().addThread(mHandler);
- BroadcastLoopers.addLooper(BackgroundThread.getHandler().getLooper());
-
// bind background threads to little cores
// this is expected to fail inside of framework tests because apps can't touch cpusets directly
// make sure we've already adjusted system_server's internal view of itself first
diff --git a/services/core/java/com/android/server/am/BroadcastLoopers.java b/services/core/java/com/android/server/am/BroadcastLoopers.java
index b828720c9162..bebb48473fc3 100644
--- a/services/core/java/com/android/server/am/BroadcastLoopers.java
+++ b/services/core/java/com/android/server/am/BroadcastLoopers.java
@@ -25,8 +25,6 @@ import android.os.SystemClock;
import android.util.ArraySet;
import android.util.Slog;
-import com.android.internal.annotations.GuardedBy;
-
import java.io.PrintWriter;
import java.util.Objects;
import java.util.concurrent.CountDownLatch;
@@ -39,7 +37,6 @@ import java.util.concurrent.CountDownLatch;
public class BroadcastLoopers {
private static final String TAG = "BroadcastLoopers";
- @GuardedBy("sLoopers")
private static final ArraySet<Looper> sLoopers = new ArraySet<>();
/**
diff --git a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java
index 21700a3a08ca..9e9eb71db4e5 100644
--- a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java
+++ b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java
@@ -144,6 +144,14 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
mRunning = new BroadcastProcessQueue[mConstants.MAX_RUNNING_PROCESS_QUEUES];
}
+ // TODO: add support for replacing pending broadcasts
+ // TODO: add support for merging pending broadcasts
+
+ // TODO: consider reordering foreground broadcasts within queue
+
+ // TODO: pause queues when background services are running
+ // TODO: pause queues when processes are frozen
+
/**
* Map from UID to per-process broadcast queues. If a UID hosts more than
* one process, each additional process is stored as a linked list using
@@ -501,8 +509,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
if (queue != null) {
// If queue was running a broadcast, fail it
if (queue.isActive()) {
- finishReceiverLocked(queue, BroadcastRecord.DELIVERY_FAILURE,
- "onApplicationCleanupLocked");
+ finishReceiverLocked(queue, BroadcastRecord.DELIVERY_FAILURE);
}
// Skip any pending registered receivers, since the old process
@@ -654,8 +661,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
// Ignore registered receivers from a previous PID
if (receiver instanceof BroadcastFilter) {
mRunningColdStart = null;
- finishReceiverLocked(queue, BroadcastRecord.DELIVERY_SKIPPED,
- "BroadcastFilter for cold app");
+ finishReceiverLocked(queue, BroadcastRecord.DELIVERY_SKIPPED);
return;
}
@@ -677,8 +683,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
hostingRecord, zygotePolicyFlags, allowWhileBooting, false);
if (queue.app == null) {
mRunningColdStart = null;
- finishReceiverLocked(queue, BroadcastRecord.DELIVERY_FAILURE,
- "startProcessLocked failed");
+ finishReceiverLocked(queue, BroadcastRecord.DELIVERY_FAILURE);
return;
}
}
@@ -709,30 +714,29 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
// If someone already finished this broadcast, finish immediately
final int oldDeliveryState = getDeliveryState(r, index);
if (isDeliveryStateTerminal(oldDeliveryState)) {
- finishReceiverLocked(queue, oldDeliveryState, "already terminal state");
+ finishReceiverLocked(queue, oldDeliveryState);
return;
}
// Consider additional cases where we'd want to finish immediately
if (app.isInFullBackup()) {
- finishReceiverLocked(queue, BroadcastRecord.DELIVERY_SKIPPED, "isInFullBackup");
+ finishReceiverLocked(queue, BroadcastRecord.DELIVERY_SKIPPED);
return;
}
if (mSkipPolicy.shouldSkip(r, receiver)) {
- finishReceiverLocked(queue, BroadcastRecord.DELIVERY_SKIPPED, "mSkipPolicy");
+ finishReceiverLocked(queue, BroadcastRecord.DELIVERY_SKIPPED);
return;
}
final Intent receiverIntent = r.getReceiverIntent(receiver);
if (receiverIntent == null) {
- finishReceiverLocked(queue, BroadcastRecord.DELIVERY_SKIPPED, "isInFullBackup");
+ finishReceiverLocked(queue, BroadcastRecord.DELIVERY_SKIPPED);
return;
}
// Ignore registered receivers from a previous PID
if ((receiver instanceof BroadcastFilter)
&& ((BroadcastFilter) receiver).receiverList.pid != app.getPid()) {
- finishReceiverLocked(queue, BroadcastRecord.DELIVERY_SKIPPED,
- "BroadcastFilter for mismatched PID");
+ finishReceiverLocked(queue, BroadcastRecord.DELIVERY_SKIPPED);
return;
}
@@ -764,8 +768,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
}
if (DEBUG_BROADCAST) logv("Scheduling " + r + " to warm " + app);
- setDeliveryState(queue, app, r, index, receiver, BroadcastRecord.DELIVERY_SCHEDULED,
- "scheduleReceiverWarmLocked");
+ setDeliveryState(queue, app, r, index, receiver, BroadcastRecord.DELIVERY_SCHEDULED);
final IApplicationThread thread = app.getOnewayThread();
if (thread != null) {
@@ -780,8 +783,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
// TODO: consider making registered receivers of unordered
// broadcasts report results to detect ANRs
if (!r.ordered) {
- finishReceiverLocked(queue, BroadcastRecord.DELIVERY_DELIVERED,
- "assuming delivered");
+ finishReceiverLocked(queue, BroadcastRecord.DELIVERY_DELIVERED);
}
} else {
notifyScheduleReceiver(app, r, (ResolveInfo) receiver);
@@ -795,11 +797,10 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
logw(msg);
app.scheduleCrashLocked(msg, CannotDeliverBroadcastException.TYPE_ID, null);
app.setKilled(true);
- finishReceiverLocked(queue, BroadcastRecord.DELIVERY_FAILURE, "remote app");
+ finishReceiverLocked(queue, BroadcastRecord.DELIVERY_FAILURE);
}
} else {
- finishReceiverLocked(queue, BroadcastRecord.DELIVERY_FAILURE,
- "missing IApplicationThread");
+ finishReceiverLocked(queue, BroadcastRecord.DELIVERY_FAILURE);
}
}
@@ -843,8 +844,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
}
private void deliveryTimeoutHardLocked(@NonNull BroadcastProcessQueue queue) {
- finishReceiverLocked(queue, BroadcastRecord.DELIVERY_TIMEOUT,
- "deliveryTimeoutHardLocked");
+ finishReceiverLocked(queue, BroadcastRecord.DELIVERY_TIMEOUT);
}
@Override
@@ -871,16 +871,16 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
if (r.resultAbort) {
for (int i = r.terminalCount + 1; i < r.receivers.size(); i++) {
setDeliveryState(null, null, r, i, r.receivers.get(i),
- BroadcastRecord.DELIVERY_SKIPPED, "resultAbort");
+ BroadcastRecord.DELIVERY_SKIPPED);
}
}
}
- return finishReceiverLocked(queue, BroadcastRecord.DELIVERY_DELIVERED, "remote app");
+ return finishReceiverLocked(queue, BroadcastRecord.DELIVERY_DELIVERED);
}
private boolean finishReceiverLocked(@NonNull BroadcastProcessQueue queue,
- @DeliveryState int deliveryState, @NonNull String reason) {
+ @DeliveryState int deliveryState) {
checkState(queue.isActive(), "isActive");
final ProcessRecord app = queue.app;
@@ -888,7 +888,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
final int index = queue.getActiveIndex();
final Object receiver = r.receivers.get(index);
- setDeliveryState(queue, app, r, index, receiver, deliveryState, reason);
+ setDeliveryState(queue, app, r, index, receiver, deliveryState);
if (deliveryState == BroadcastRecord.DELIVERY_TIMEOUT) {
r.anrCount++;
@@ -935,7 +935,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
*/
private void setDeliveryState(@Nullable BroadcastProcessQueue queue,
@Nullable ProcessRecord app, @NonNull BroadcastRecord r, int index,
- @NonNull Object receiver, @DeliveryState int newDeliveryState, String reason) {
+ @NonNull Object receiver, @DeliveryState int newDeliveryState) {
final int oldDeliveryState = getDeliveryState(r, index);
// Only apply state when we haven't already reached a terminal state;
@@ -963,7 +963,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
logw("Delivery state of " + r + " to " + receiver
+ " via " + app + " changed from "
+ deliveryStateToString(oldDeliveryState) + " to "
- + deliveryStateToString(newDeliveryState) + " because " + reason);
+ + deliveryStateToString(newDeliveryState));
}
r.terminalCount++;
@@ -1053,8 +1053,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
* of it matching a predicate.
*/
private final BroadcastConsumer mBroadcastConsumerSkip = (r, i) -> {
- setDeliveryState(null, null, r, i, r.receivers.get(i), BroadcastRecord.DELIVERY_SKIPPED,
- "mBroadcastConsumerSkip");
+ setDeliveryState(null, null, r, i, r.receivers.get(i), BroadcastRecord.DELIVERY_SKIPPED);
};
/**
@@ -1062,8 +1061,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue {
* cancelled, usually as a result of it matching a predicate.
*/
private final BroadcastConsumer mBroadcastConsumerSkipAndCanceled = (r, i) -> {
- setDeliveryState(null, null, r, i, r.receivers.get(i), BroadcastRecord.DELIVERY_SKIPPED,
- "mBroadcastConsumerSkipAndCanceled");
+ setDeliveryState(null, null, r, i, r.receivers.get(i), BroadcastRecord.DELIVERY_SKIPPED);
r.resultCode = Activity.RESULT_CANCELED;
r.resultData = null;
r.resultExtras = null;