From e0ecaea594eaad1a83af298ceb39dea6cc0b0f5a Mon Sep 17 00:00:00 2001 From: Motomu Utsumi Date: Tue, 30 May 2023 19:24:31 +0900 Subject: [PATCH] Add executing thread check in LegacyNetworkActivityTracker One of the reasons for having locks in LegacyNetworkActivityTracker is mNetworkActive is updated from non handler thread. aosp/2606673 moves network activity change processing to handler thread. All the methods that update mNetworkActive and mActiveIdleTimers should be called from handler thread now. Bug: 267870186 Bug: 279380356 Test: atest FrameworksNetTests Change-Id: I5c8cd0b253a77a2740ade3a0145ef80336b3b133 --- .../com/android/server/ConnectivityService.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/service/src/com/android/server/ConnectivityService.java b/service/src/com/android/server/ConnectivityService.java index 298c3120d8..c2d6c5e900 100755 --- a/service/src/com/android/server/ConnectivityService.java +++ b/service/src/com/android/server/ConnectivityService.java @@ -1703,7 +1703,7 @@ public class ConnectivityService extends IConnectivityManager.Stub mUserAllContext.registerReceiver(mPackageIntentReceiver, packageIntentFilter, null /* broadcastPermission */, mHandler); - mNetworkActivityTracker = new LegacyNetworkActivityTracker(mContext, mNetd); + mNetworkActivityTracker = new LegacyNetworkActivityTracker(mContext, mNetd, mHandler); final NetdCallback netdCallback = new NetdCallback(); try { @@ -11115,6 +11115,7 @@ public class ConnectivityService extends IConnectivityManager.Stub private static final int NO_UID = -1; private final Context mContext; private final INetd mNetd; + private final Handler mHandler; private final RemoteCallbackList mNetworkActivityListeners = new RemoteCallbackList<>(); // Indicate the current system default network activity is active or not. @@ -11133,12 +11134,22 @@ public class ConnectivityService extends IConnectivityManager.Stub } } - LegacyNetworkActivityTracker(@NonNull Context context, @NonNull INetd netd) { + LegacyNetworkActivityTracker(@NonNull Context context, @NonNull INetd netd, + @NonNull Handler handler) { mContext = context; mNetd = netd; + mHandler = handler; + } + + private void ensureRunningOnConnectivityServiceThread() { + if (mHandler.getLooper().getThread() != Thread.currentThread()) { + throw new IllegalStateException("Not running on ConnectivityService thread: " + + Thread.currentThread().getName()); + } } public void handleReportNetworkActivity(NetworkActivityParams activityParams) { + ensureRunningOnConnectivityServiceThread(); sendDataActivityBroadcast(transportTypeToLegacyType(activityParams.label), activityParams.isActive, activityParams.timestampNs); synchronized (mActiveIdleTimers) { @@ -11299,6 +11310,7 @@ public class ConnectivityService extends IConnectivityManager.Stub */ public void updateDataActivityTracking(NetworkAgentInfo newNetwork, NetworkAgentInfo oldNetwork) { + ensureRunningOnConnectivityServiceThread(); if (newNetwork != null) { setupDataActivityTracking(newNetwork); }