Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 70793e9f authored by Nathan Harold's avatar Nathan Harold
Browse files

Migrate to WorkerThread and BackgroundThread

Remove a bunch of low-utilization threads from the Phone
process, instead moving standard priority work onto a new
worker thread, and background work such as metrics onto
the existing BackgroundThread.

Bug: 390244513
Flag: com.android.internal.telephony.flags.thread_shred
Test: atest FrameworksTelephonyTests
Test: manually verified CUJs on Panther
Change-Id: I4f5176921ee130a2f480575d636b2aaa9f278ff4
parent f4025bcd
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -257,3 +257,14 @@ flag {
        purpose: PURPOSE_BUGFIX
    }
}
#
# OWNER=nharold TARGET=25Q4
flag {
    name: "thread_shred"
    namespace: "telephony"
    description: "Consolidate a bunch of unneeded worker threads to save resources"
    bug:"390244513"
    metadata {
        purpose: PURPOSE_BUGFIX
    }
}
+61 −36
Original line number Diff line number Diff line
@@ -71,6 +71,7 @@ import com.android.internal.annotations.GuardedBy;
import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.uicc.UiccPort;
import com.android.internal.telephony.uicc.UiccProfile;
import com.android.internal.telephony.util.WorkerThread;
import com.android.telephony.Rlog;

import java.io.FileDescriptor;
@@ -369,6 +370,29 @@ public class CarrierPrivilegesTracker extends Handler {

        if (mFeatureFlags.asyncInitCarrierPrivilegesTracker()) {
            final Object localLock = new Object();
            if (mFeatureFlags.threadShred()) {
                mCurrentHandler = new Handler(WorkerThread.get().getLooper()) {
                    @Override
                    public void handleMessage(Message msg) {
                        switch(msg.what) {
                            case ACTION_INITIALIZE_TRACKER:
                                handleInitializeTracker();
                                if (!hasMessagesOrCallbacks()) {
                                    mCurrentHandler = CarrierPrivilegesTracker.this;
                                }
                                break;
                            default:
                                Message m = CarrierPrivilegesTracker.this.obtainMessage();
                                m.copyFrom(msg);
                                m.sendToTarget();
                                if (!hasMessagesOrCallbacks()) {
                                    mCurrentHandler = CarrierPrivilegesTracker.this;
                                }
                                break;
                        }
                    }
                };
            } else {
                HandlerThread initializerThread =
                        new HandlerThread("CarrierPrivilegesTracker Initializer") {
                            @Override
@@ -411,6 +435,7 @@ public class CarrierPrivilegesTracker extends Handler {
                        }
                    }
                };
            }
        } else {
            mCurrentHandler = this;
        }
+29 −9
Original line number Diff line number Diff line
@@ -39,7 +39,9 @@ import android.text.TextUtils;
import android.util.SparseArray;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.metrics.RcsStats;
import com.android.internal.telephony.util.WorkerThread;
import com.android.telephony.Rlog;

import java.util.NoSuchElementException;
@@ -66,6 +68,8 @@ public class GbaManager {
    public static final int REQUEST_TIMEOUT_MS = 5000;
    private final RcsStats mRcsStats;

    private final FeatureFlags mFeatureFlags;

    private final String mLogTag;
    private final Context mContext;
    private final int mSubId;
@@ -202,7 +206,7 @@ public class GbaManager {

    @VisibleForTesting
    public GbaManager(Context context, int subId, String servicePackageName, int releaseTime,
            RcsStats rcsStats) {
            RcsStats rcsStats, Looper looper, FeatureFlags featureFlags) {
        mContext = context;
        mSubId = subId;
        mLogTag = "GbaManager[" + subId + "]";
@@ -210,9 +214,15 @@ public class GbaManager {
        mServicePackageName = servicePackageName;
        mReleaseTime = releaseTime;

        mFeatureFlags = featureFlags;

        if (mFeatureFlags.threadShred()) {
            mHandler = new GbaManagerHandler(looper);
        } else {
            HandlerThread headlerThread = new HandlerThread(mLogTag);
            headlerThread.start();
            mHandler = new GbaManagerHandler(headlerThread.getLooper());
        }

        if (mReleaseTime < 0) {
            mHandler.sendEmptyMessage(EVENT_BIND_SERVICE);
@@ -224,9 +234,15 @@ public class GbaManager {
     * create a GbaManager instance for a sub
     */
    public static GbaManager make(Context context, int subId,
            String servicePackageName, int releaseTime) {
        GbaManager gm = new GbaManager(context, subId, servicePackageName, releaseTime,
                RcsStats.getInstance());
            String servicePackageName, int releaseTime, FeatureFlags featureFlags) {
        GbaManager gm;
        if (featureFlags.threadShred()) {
            gm = new GbaManager(context, subId, servicePackageName, releaseTime,
                    RcsStats.getInstance(), WorkerThread.get().getLooper(), featureFlags);
        } else {
            gm = new GbaManager(context, subId, servicePackageName, releaseTime,
                    RcsStats.getInstance(), null, featureFlags);
        }
        synchronized (sGbaManagers) {
            sGbaManagers.put(subId, gm);
        }
@@ -521,12 +537,16 @@ public class GbaManager {
    @VisibleForTesting
    public void destroy() {
        mHandler.removeCallbacksAndMessages(null);
        if (!mFeatureFlags.threadShred()) {
            mHandler.getLooper().quit();
        }
        mRequestQueue.clear();
        mCallbacks.clear();
        unbindService();
        synchronized (sGbaManagers) {
            sGbaManagers.remove(mSubId);
        }
    }

    private void logv(String msg) {
        if (DBG) {
+15 −4
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@ import android.util.ArraySet;
import android.util.Log;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.flags.Flags;
import com.android.internal.telephony.util.WorkerThread;
import com.android.telephony.Rlog;

import java.io.FileDescriptor;
@@ -55,10 +57,19 @@ public class RadioInterfaceCapabilityController extends Handler {
            final CommandsInterface commandsInterface) {
        synchronized (RadioInterfaceCapabilityController.class) {
            if (sInstance == null) {
                if (Flags.threadShred()) {
                    sInstance = new RadioInterfaceCapabilityController(
                            radioConfig,
                            commandsInterface,
                            WorkerThread.get().getLooper());
                } else {
                    final HandlerThread handlerThread = new HandlerThread("RHC");
                    handlerThread.start();
                sInstance = new RadioInterfaceCapabilityController(radioConfig, commandsInterface,
                    sInstance = new RadioInterfaceCapabilityController(
                            radioConfig,
                            commandsInterface,
                            handlerThread.getLooper());
                }
            } else {
                Log.wtf(LOG_TAG, "init() called multiple times!  sInstance = " + sInstance);
            }
+14 −6
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ import android.util.Pair;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.util.WorkerThread;

import java.util.ArrayList;
import java.util.HashMap;
@@ -205,6 +206,12 @@ public class TelephonyCountryDetector extends Handler {
    public static synchronized TelephonyCountryDetector getInstance(@NonNull Context context,
            FeatureFlags featureFlags) {
        if (sInstance == null) {
            if (featureFlags.threadShred()) {
                sInstance = new TelephonyCountryDetector(WorkerThread.get().getLooper(), context,
                        context.getSystemService(LocationManager.class),
                        context.getSystemService(ConnectivityManager.class),
                        featureFlags);
            } else {
                HandlerThread handlerThread = new HandlerThread("TelephonyCountryDetector");
                handlerThread.start();
                sInstance = new TelephonyCountryDetector(handlerThread.getLooper(), context,
@@ -212,6 +219,7 @@ public class TelephonyCountryDetector extends Handler {
                        context.getSystemService(ConnectivityManager.class),
                        featureFlags);
            }
        }
        return sInstance;
    }

Loading