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

Commit e9e6d8e1 authored by Sarah Chin's avatar Sarah Chin
Browse files

Fixed concurrency issue in DcTracker

Added lock to getLinkBandwidths method
Update bandwidths in shorter synchronized block

Test: atest DcTrackerTest, DataConnectionTest
Bug: 152894725
Change-Id: I05114d6d5b64de5927ebddebec92e935d875e86b
parent b07db11f
Loading
Loading
Loading
Loading
+26 −29
Original line number Diff line number Diff line
@@ -599,7 +599,7 @@ public class DcTracker extends Handler {
    private ArrayList<DataProfile> mLastDataProfileList = new ArrayList<>();

    /** RAT name ===> (downstream, upstream) bandwidth values from carrier config. */
    private final ConcurrentHashMap<String, Pair<Integer, Integer>> mBandwidths =
    private ConcurrentHashMap<String, Pair<Integer, Integer>> mBandwidths =
            new ConcurrentHashMap<>();

    /**
@@ -3806,8 +3806,7 @@ public class DcTracker extends Handler {
     * @param useLte For NR NSA, whether to use LTE value for upstream or not
     */
    private void updateLinkBandwidths(String[] bandwidths, boolean useLte) {
        synchronized (mBandwidths) {
            mBandwidths.clear();
        ConcurrentHashMap<String, Pair<Integer, Integer>> temp = new ConcurrentHashMap<>();
        for (String config : bandwidths) {
            int downstream = 14;
            int upstream = 14;
@@ -3821,25 +3820,23 @@ public class DcTracker extends Handler {
                    } catch (NumberFormatException ignored) {
                    }
                }
                    mBandwidths.put(kv[0], new Pair<>(downstream, upstream));
                temp.put(kv[0], new Pair<>(downstream, upstream));
            }
        }
        if (useLte) {
                Pair<Integer, Integer> ltePair = mBandwidths.get(DctConstants.RAT_NAME_LTE);
            Pair<Integer, Integer> ltePair = temp.get(DctConstants.RAT_NAME_LTE);
            if (ltePair != null) {
                    if (mBandwidths.containsKey(DctConstants.RAT_NAME_NR_NSA)) {
                        mBandwidths.put(DctConstants.RAT_NAME_NR_NSA, new Pair<>(
                                mBandwidths.get(DctConstants.RAT_NAME_NR_NSA).first,
                                ltePair.second));
                    }
                    if (mBandwidths.containsKey(DctConstants.RAT_NAME_NR_NSA_MMWAVE)) {
                        mBandwidths.put(DctConstants.RAT_NAME_NR_NSA_MMWAVE, new Pair<>(
                                mBandwidths.get(DctConstants.RAT_NAME_NR_NSA_MMWAVE).first,
                                ltePair.second));
                if (temp.containsKey(DctConstants.RAT_NAME_NR_NSA)) {
                    temp.put(DctConstants.RAT_NAME_NR_NSA, new Pair<>(
                            temp.get(DctConstants.RAT_NAME_NR_NSA).first, ltePair.second));
                }
                if (temp.containsKey(DctConstants.RAT_NAME_NR_NSA_MMWAVE)) {
                    temp.put(DctConstants.RAT_NAME_NR_NSA_MMWAVE, new Pair<>(
                            temp.get(DctConstants.RAT_NAME_NR_NSA_MMWAVE).first, ltePair.second));
                }
            }
        }
        mBandwidths = temp;
        for (DataConnection dc : mDataConnections.values()) {
            dc.sendMessage(DataConnection.EVENT_CARRIER_CONFIG_LINK_BANDWIDTHS_CHANGED);
        }