OSDN Git Service

Make getting wifi state lockless.
authorBrad Fitzpatrick <bradfitz@android.com>
Mon, 22 Mar 2010 19:08:26 +0000 (12:08 -0700)
committerBrad Fitzpatrick <bradfitz@android.com>
Mon, 22 Mar 2010 19:08:26 +0000 (12:08 -0700)
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

wifi/java/android/net/wifi/WifiStateTracker.java

index abae65d..73ed6ed 100644 (file)
@@ -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;
     }