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

Commit e7ad27bd authored by Thomas Nguyen's avatar Thomas Nguyen
Browse files

Fix a race condition that causes DatagramDispatcher to get stuck

Bug: 399921227
Test: Manually reproduce the issue to verify the fix work b/400775399
CTS and unit tests
Flag: EXEMPT bugfix

Change-Id: Ib02fd0b3dfd354e53ff7e6d6d352d3e91933b3ea
parent c537808d
Loading
Loading
Loading
Loading
+42 −29
Original line number Diff line number Diff line
@@ -81,6 +81,8 @@ public class DatagramDispatcher extends Handler {
    private static final int CMD_SEND_SMS = 8;
    private static final int EVENT_SEND_SMS_DONE = 9;
    private static final int EVENT_MT_SMS_POLLING_THROTTLE_TIMED_OUT = 10;
    private static final int CMD_SEND_MT_SMS_POLLING_MESSAGE = 11;

    private static final Long TIMEOUT_DATAGRAM_DELAY_IN_DEMO_MODE = TimeUnit.SECONDS.toMillis(10);
    @NonNull private static DatagramDispatcher sInstance;
    @NonNull private final Context mContext;
@@ -422,10 +424,16 @@ public class DatagramDispatcher extends Handler {
            case EVENT_MT_SMS_POLLING_THROTTLE_TIMED_OUT: {
                synchronized (mLock) {
                    mIsMtSmsPollingThrottled = false;
                }
                if (allowMtSmsPolling()) {
                        sendMtSmsPollingMessage();
                    sendMessage(obtainMessage(CMD_SEND_MT_SMS_POLLING_MESSAGE));
                }
                break;
            }

            case CMD_SEND_MT_SMS_POLLING_MESSAGE: {
                plogd("CMD_SEND_MT_SMS_POLLING_MESSAGE");
                handleCmdSendMtSmsPollingMessage();
                break;
            }

@@ -517,9 +525,9 @@ public class DatagramDispatcher extends Handler {
            mIsAligned = isAligned;
            plogd("setDeviceAlignedWithSatellite: " + mIsAligned);
            if (isAligned && mIsDemoMode) handleEventSatelliteAligned();
            if (allowMtSmsPolling()) {
                sendMtSmsPollingMessage();
        }
        if (allowMtSmsPolling()) {
            sendMessage(obtainMessage(CMD_SEND_MT_SMS_POLLING_MESSAGE));
        }
    }

@@ -841,10 +849,9 @@ public class DatagramDispatcher extends Handler {
                    mShouldPollMtSms = shouldPollMtSms();
                }
            }

            if (allowMtSmsPolling()) {
                sendMtSmsPollingMessage();
        }
        if (allowMtSmsPolling()) {
            sendMessage(obtainMessage(CMD_SEND_MT_SMS_POLLING_MESSAGE));
        }
    }

@@ -1321,9 +1328,10 @@ public class DatagramDispatcher extends Handler {
                && satelliteController.shouldSendSmsToDatagramDispatcher(satellitePhone);
    }

    @GuardedBy("mLock")
    private void sendMtSmsPollingMessage() {
    private void handleCmdSendMtSmsPollingMessage() {
        synchronized (mLock) {
            if (!mShouldPollMtSms) {
                plogd("sendMtSmsPollingMessage: mShouldPollMtSms=" + mShouldPollMtSms);
                return;
            }

@@ -1335,10 +1343,12 @@ public class DatagramDispatcher extends Handler {
            for (Entry<Long, PendingRequest> entry : mPendingSmsMap.entrySet()) {
                PendingRequest pendingRequest = entry.getValue();
                if (pendingRequest.isMtSmsPolling) {
                plogd("sendMtSmsPollingMessage: mPendingSmsMap already has the polling message.");
                    plogd("sendMtSmsPollingMessage: mPendingSmsMap already "
                            + "has the polling message.");
                    return;
                }
            }
        }

        Phone satellitePhone = SatelliteController.getInstance().getSatellitePhone();
        if (satellitePhone == null) {
@@ -1370,7 +1380,6 @@ public class DatagramDispatcher extends Handler {
        removeMessages(EVENT_MT_SMS_POLLING_THROTTLE_TIMED_OUT);
    }

    @GuardedBy("mLock")
    private boolean allowMtSmsPolling() {
        if (!mFeatureFlags.carrierRoamingNbIotNtn()) return false;

@@ -1383,11 +1392,15 @@ public class DatagramDispatcher extends Handler {
            return false;
        }

        boolean isModemStateConnectedOrTransferring;
        synchronized (mLock) {
            if (!mIsAligned) return false;

        boolean isModemStateConnectedOrTransferring =
            isModemStateConnectedOrTransferring =
                    mModemState == SATELLITE_MODEM_STATE_CONNECTED
                            || mModemState == SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING;
        }

        if (!isModemStateConnectedOrTransferring && !allowCheckMessageInNotConnected()) {
            plogd("EVENT_MT_SMS_POLLING_THROTTLE_TIMED_OUT:"
                    + " allow_check_message_in_not_connected is disabled");
+10 −17
Original line number Diff line number Diff line
@@ -626,7 +626,6 @@ public class SatelliteController extends Handler {
    private List<SatelliteSubscriberProvisionStatus> mLastEvaluatedSubscriberProvisionStatus =
            new ArrayList<>();
    // The ID of the satellite subscription that has highest priority and is provisioned.
    @GuardedBy("mSatelliteTokenProvisionedLock")
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
    protected int mSelectedSatelliteSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
    // The last ICC ID that framework configured to modem.
@@ -6733,10 +6732,7 @@ public class SatelliteController extends Handler {
                    SATELLITE_SYSTEM_NOTIFICATION_TIME, 0L);
            logv("determineAutoConnectSystemNotification lastSetTimestamp = " + lastSetTimestamp);
            long currentTime = System.currentTimeMillis();
            int subId;
            synchronized (mSatellitePhoneLock) {
                subId = mSatellitePhone.getSubId();
            }
            int subId = getSelectedSatelliteSubId();
            long throttleTime = getNotificationDisplayThrottleTimeout(subId);
            if (lastSetTimestamp == 0L || currentTime - lastSetTimestamp >= throttleTime) {
                // Reset the flag and update the timestamp
@@ -7532,6 +7528,7 @@ public class SatelliteController extends Handler {
     */
    public void requestSatelliteSubscriberProvisionStatus(@NonNull ResultReceiver result) {
        if (!mFeatureFlags.carrierRoamingNbIotNtn()) {
            logd("requestSatelliteSubscriberProvisionStatus: carrierRoamingNbIotNtn is disabled");
            result.send(SATELLITE_RESULT_REQUEST_NOT_SUPPORTED, null);
            return;
        }
@@ -7599,11 +7596,9 @@ public class SatelliteController extends Handler {
    }

    public int getSelectedSatelliteSubId() {
        synchronized (mSatelliteTokenProvisionedLock) {
        plogd("getSelectedSatelliteSubId: subId=" + mSelectedSatelliteSubId);
        return mSelectedSatelliteSubId;
    }
    }

    /**
     * Request to get the currently selected satellite subscription id.
@@ -7970,7 +7965,6 @@ public class SatelliteController extends Handler {

    /** Return the carrier ID of the binding satellite subscription. */
    public int getSatelliteCarrierId() {
        synchronized (mSatelliteTokenProvisionedLock) {
        SubscriptionInfo subInfo = mSubscriptionManagerService.getSubscriptionInfo(
            mSelectedSatelliteSubId);
        if (subInfo == null) {
@@ -7979,7 +7973,6 @@ public class SatelliteController extends Handler {
        }
        return subInfo.getCarrierId();
    }
    }

    /**
     * Get whether phone is eligible to connect to carrier roaming non-terrestrial network.
+8 −0
Original line number Diff line number Diff line
@@ -1153,6 +1153,7 @@ public class DatagramDispatcherTest extends TelephonyTest {
        mDatagramDispatcherUT.handleMessage(
                mDatagramDispatcherUT.obtainMessage(10 /*EVENT_MT_SMS_POLLING_THROTTLE_TIMED_OUT*/,
                        new AsyncResult(null, null, null)));
        processAllMessages();

        verify(mMockSmsDispatchersController, times(1)).sendMtSmsPollingMessage();
   }
@@ -1201,6 +1202,7 @@ public class DatagramDispatcherTest extends TelephonyTest {
                R.bool.config_satellite_allow_check_message_in_not_connected, true);

        mDatagramDispatcherUT.setDeviceAlignedWithSatellite(true);
        processAllMessages();

        verify(mMockSmsDispatchersController, times(1)).sendMtSmsPollingMessage();
    }
@@ -1227,6 +1229,7 @@ public class DatagramDispatcherTest extends TelephonyTest {

        mDatagramDispatcherUT.onSatelliteModemStateChanged(
                SatelliteManager.SATELLITE_MODEM_STATE_NOT_CONNECTED);
        processAllMessages();

        verify(mMockSmsDispatchersController, times(1)).sendMtSmsPollingMessage();
    }
@@ -1239,6 +1242,7 @@ public class DatagramDispatcherTest extends TelephonyTest {

        mDatagramDispatcherUT.onSatelliteModemStateChanged(
                SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED);
        processAllMessages();

        verify(mMockSmsDispatchersController, times(1)).sendMtSmsPollingMessage();
    }
@@ -1251,6 +1255,7 @@ public class DatagramDispatcherTest extends TelephonyTest {

        mDatagramDispatcherUT.onSatelliteModemStateChanged(
                SatelliteManager.SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING);
        processAllMessages();

        verify(mMockSmsDispatchersController, times(1)).sendMtSmsPollingMessage();
    }
@@ -1278,6 +1283,7 @@ public class DatagramDispatcherTest extends TelephonyTest {

        mDatagramDispatcherUT.onSatelliteModemStateChanged(
                SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED);
        processAllMessages();

        verify(mMockSmsDispatchersController, times(1)).sendMtSmsPollingMessage();
    }
@@ -1295,6 +1301,7 @@ public class DatagramDispatcherTest extends TelephonyTest {
                .thenReturn(true);
        mDatagramDispatcherUT.onSatelliteModemStateChanged(
                SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED);
        processAllMessages();

        verify(mMockSmsDispatchersController, times(0)).sendMtSmsPollingMessage();

@@ -1303,6 +1310,7 @@ public class DatagramDispatcherTest extends TelephonyTest {
                .thenReturn(false);
        mDatagramDispatcherUT.onSatelliteModemStateChanged(
                SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED);
        processAllMessages();

        verify(mMockSmsDispatchersController, times(1)).sendMtSmsPollingMessage();
    }