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

Commit 90dd21ef authored by Brad Fitzpatrick's avatar Brad Fitzpatrick
Browse files

Make getting wifi state lockless.

Previous it was synchronized on the same lock that was held while
transitioning wifi states, effectively making it impossible to ever
find out about such states, and worse: making calls during transitions
block.

This manifested itself in a really laggy power control widget, which
I'm working on fixing in general in a separate change.

Change-Id: Ia34af98c73d7f5662e41360a213df87f6adaf130
parent ac96fa57
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -54,10 +54,11 @@ import android.content.Context;
import android.database.ContentObserver;
import com.android.internal.app.IBatteryStats;

import java.util.List;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.net.UnknownHostException;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Track the state of Wifi connectivity. All event handling is done here,
@@ -284,6 +285,13 @@ public class WifiStateTracker extends NetworkStateTracker {
     *         {@link WifiManager#WIFI_STATE_UNKNOWN}
     */
    private int mWifiState;

    /**
     * For getWifiState(), to make sure it's always fast, even when the
     * instance lock is held on other slow operations.
     */
    private final AtomicInteger mWifiStateAtomic = new AtomicInteger(WIFI_STATE_UNKNOWN);

    // Wi-Fi run states:
    private static final int RUN_STATE_STARTING = 1;
    private static final int RUN_STATE_RUNNING  = 2;
@@ -1504,11 +1512,12 @@ public class WifiStateTracker extends NetworkStateTracker {
        return true;
    }

    public synchronized int getWifiState() {
        return mWifiState;
    public int getWifiState() {
        return mWifiStateAtomic.get();
    }

    public synchronized void setWifiState(int wifiState) {
        mWifiStateAtomic.set(wifiState);
        mWifiState = wifiState;
    }