From 14ae39acbc1387a46946de88e068e10baa76f831 Mon Sep 17 00:00:00 2001 From: Adam Lesinski Date: Fri, 26 May 2017 11:50:40 -0700 Subject: [PATCH] BatteryStats: Acquire network stats without BatteryStatsImpl lock Moves the network stats collection under a different lock to prevent the main BatteryStatsImpl lock from being held while doing I/O. Bug: 37645919 Bug: 38296815 Test: manual Change-Id: I0d6b4a7b12b234939cb6eb3a32658b28f61dff4f --- .../com/android/internal/os/BatteryStatsImpl.java | 777 +++++++++++---------- .../com/android/server/am/BatteryStatsService.java | 74 +- 2 files changed, 438 insertions(+), 413 deletions(-) diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 31064ac73dff..f5cff9df9651 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -56,6 +56,7 @@ import android.util.LogWriter; import android.util.LongSparseArray; import android.util.LongSparseLongArray; import android.util.MutableInt; +import android.util.Pools; import android.util.PrintWriterPrinter; import android.util.Printer; import android.util.Slog; @@ -66,6 +67,7 @@ import android.util.TimeUtils; import android.util.Xml; import android.view.Display; +import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.net.NetworkStatsFactory; import com.android.internal.util.ArrayUtils; @@ -173,7 +175,6 @@ public class BatteryStatsImpl extends BatteryStats { private final PlatformIdleStateCallback mPlatformIdleStateCallback; - final class MyHandler extends Handler { public MyHandler(Looper looper) { super(looper, null, true); @@ -228,11 +229,11 @@ public class BatteryStatsImpl extends BatteryStats { } public interface ExternalStatsSync { - public static final int UPDATE_CPU = 0x01; - public static final int UPDATE_WIFI = 0x02; - public static final int UPDATE_RADIO = 0x04; - public static final int UPDATE_BT = 0x08; - public static final int UPDATE_ALL = UPDATE_CPU | UPDATE_WIFI | UPDATE_RADIO | UPDATE_BT; + int UPDATE_CPU = 0x01; + int UPDATE_WIFI = 0x02; + int UPDATE_RADIO = 0x04; + int UPDATE_BT = 0x08; + int UPDATE_ALL = UPDATE_CPU | UPDATE_WIFI | UPDATE_RADIO | UPDATE_BT; void scheduleSync(String reason, int flags); void scheduleCpuSyncDueToRemovedUid(int uid); @@ -572,8 +573,6 @@ public class BatteryStatsImpl extends BatteryStats { private int mMinLearnedBatteryCapacity = -1; private int mMaxLearnedBatteryCapacity = -1; - private final NetworkStats.Entry mTmpNetworkStatsEntry = new NetworkStats.Entry(); - private long[] mCpuFreqs; private PowerProfile mPowerProfile; @@ -637,19 +636,9 @@ public class BatteryStatsImpl extends BatteryStats { private void init(Clocks clocks) { mClocks = clocks; - mMobileNetworkStats = new NetworkStats[] { - new NetworkStats(mClocks.elapsedRealtime(), 50), - new NetworkStats(mClocks.elapsedRealtime(), 50), - new NetworkStats(mClocks.elapsedRealtime(), 50) - }; - mWifiNetworkStats = new NetworkStats[] { - new NetworkStats(mClocks.elapsedRealtime(), 50), - new NetworkStats(mClocks.elapsedRealtime(), 50), - new NetworkStats(mClocks.elapsedRealtime(), 50) - }; } - public static interface TimeBaseObs { + public interface TimeBaseObs { void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime); void onTimeStopped(long elapsedRealtime, long baseUptime, long baseRealtime); } @@ -4193,7 +4182,10 @@ public class BatteryStatsImpl extends BatteryStats { getUidStatsLocked(uid).noteMobileRadioApWakeupLocked(); } - public void noteMobileRadioPowerState(int powerState, long timestampNs, int uid) { + /** + * Updates the radio power state and returns true if an external stats collection should occur. + */ + public boolean noteMobileRadioPowerStateLocked(int powerState, long timestampNs, int uid) { final long elapsedRealtime = mClocks.elapsedRealtime(); final long uptime = mClocks.uptimeMillis(); if (mMobileRadioPowerState != powerState) { @@ -4230,13 +4222,15 @@ public class BatteryStatsImpl extends BatteryStats { mMobileRadioActivePerAppTimer.startRunningLocked(elapsedRealtime); } else { mMobileRadioActiveTimer.stopRunningLocked(realElapsedRealtimeMs); - updateMobileRadioStateLocked(realElapsedRealtimeMs, null); mMobileRadioActivePerAppTimer.stopRunningLocked(realElapsedRealtimeMs); + // Tell the caller to collect radio network/power stats. + return true; } } + return false; } - public void notePowerSaveMode(boolean enabled) { + public void notePowerSaveModeLocked(boolean enabled) { if (mPowerSaveModeEnabled != enabled) { int stepState = enabled ? STEP_LEVEL_MODE_POWER_SAVE : 0; mModStepMode |= (mCurStepMode&STEP_LEVEL_MODE_POWER_SAVE) ^ stepState; @@ -5236,28 +5230,26 @@ public class BatteryStatsImpl extends BatteryStats { public void noteNetworkInterfaceTypeLocked(String iface, int networkType) { if (TextUtils.isEmpty(iface)) return; - if (ConnectivityManager.isNetworkTypeMobile(networkType)) { - mMobileIfaces = includeInStringArray(mMobileIfaces, iface); - if (DEBUG) Slog.d(TAG, "Note mobile iface " + iface + ": " + mMobileIfaces); - } else { - mMobileIfaces = excludeFromStringArray(mMobileIfaces, iface); - if (DEBUG) Slog.d(TAG, "Note non-mobile iface " + iface + ": " + mMobileIfaces); - } - if (ConnectivityManager.isNetworkTypeWifi(networkType)) { - mWifiIfaces = includeInStringArray(mWifiIfaces, iface); - if (DEBUG) Slog.d(TAG, "Note wifi iface " + iface + ": " + mWifiIfaces); - } else { - mWifiIfaces = excludeFromStringArray(mWifiIfaces, iface); - if (DEBUG) Slog.d(TAG, "Note non-wifi iface " + iface + ": " + mWifiIfaces); + + synchronized (mModemNetworkLock) { + if (ConnectivityManager.isNetworkTypeMobile(networkType)) { + mModemIfaces = includeInStringArray(mModemIfaces, iface); + if (DEBUG) Slog.d(TAG, "Note mobile iface " + iface + ": " + mModemIfaces); + } else { + mModemIfaces = excludeFromStringArray(mModemIfaces, iface); + if (DEBUG) Slog.d(TAG, "Note non-mobile iface " + iface + ": " + mModemIfaces); + } } - } - public void noteNetworkStatsEnabledLocked() { - // During device boot, qtaguid isn't enabled until after the inital - // loading of battery stats. Now that they're enabled, take our initial - // snapshot for future delta calculation. - updateMobileRadioStateLocked(mClocks.elapsedRealtime(), null); - updateWifiStateLocked(null); + synchronized (mWifiNetworkLock) { + if (ConnectivityManager.isNetworkTypeWifi(networkType)) { + mWifiIfaces = includeInStringArray(mWifiIfaces, iface); + if (DEBUG) Slog.d(TAG, "Note wifi iface " + iface + ": " + mWifiIfaces); + } else { + mWifiIfaces = excludeFromStringArray(mWifiIfaces, iface); + if (DEBUG) Slog.d(TAG, "Note non-wifi iface " + iface + ": " + mWifiIfaces); + } + } } @Override public long getScreenOnTime(long elapsedRealtimeUs, int which) { @@ -8613,27 +8605,25 @@ public class BatteryStatsImpl extends BatteryStats { mPlatformIdleStateCallback = null; } - public void setPowerProfile(PowerProfile profile) { - synchronized (this) { - mPowerProfile = profile; + public void setPowerProfileLocked(PowerProfile profile) { + mPowerProfile = profile; - // We need to initialize the KernelCpuSpeedReaders to read from - // the first cpu of each core. Once we have the PowerProfile, we have access to this - // information. - final int numClusters = mPowerProfile.getNumCpuClusters(); - mKernelCpuSpeedReaders = new KernelCpuSpeedReader[numClusters]; - int firstCpuOfCluster = 0; - for (int i = 0; i < numClusters; i++) { - final int numSpeedSteps = mPowerProfile.getNumSpeedStepsInCpuCluster(i); - mKernelCpuSpeedReaders[i] = new KernelCpuSpeedReader(firstCpuOfCluster, - numSpeedSteps); - firstCpuOfCluster += mPowerProfile.getNumCoresInCpuCluster(i); - } + // We need to initialize the KernelCpuSpeedReaders to read from + // the first cpu of each core. Once we have the PowerProfile, we have access to this + // information. + final int numClusters = mPowerProfile.getNumCpuClusters(); + mKernelCpuSpeedReaders = new KernelCpuSpeedReader[numClusters]; + int firstCpuOfCluster = 0; + for (int i = 0; i < numClusters; i++) { + final int numSpeedSteps = mPowerProfile.getNumSpeedStepsInCpuCluster(i); + mKernelCpuSpeedReaders[i] = new KernelCpuSpeedReader(firstCpuOfCluster, + numSpeedSteps); + firstCpuOfCluster += mPowerProfile.getNumCoresInCpuCluster(i); + } - if (mEstimatedBatteryCapacity == -1) { - // Initialize the estimated battery capacity to a known preset one. - mEstimatedBatteryCapacity = (int) mPowerProfile.getBatteryCapacity(); - } + if (mEstimatedBatteryCapacity == -1) { + // Initialize the estimated battery capacity to a known preset one. + mEstimatedBatteryCapacity = (int) mPowerProfile.getBatteryCapacity(); } } @@ -8641,7 +8631,7 @@ public class BatteryStatsImpl extends BatteryStats { mCallback = cb; } - public void setRadioScanningTimeout(long timeout) { + public void setRadioScanningTimeoutLocked(long timeout) { if (mPhoneSignalScanningTimer != null) { mPhoneSignalScanningTimer.setTimeout(timeout); } @@ -9333,277 +9323,293 @@ public class BatteryStatsImpl extends BatteryStats { } } - private String[] mMobileIfaces = EmptyArray.STRING; + private final NetworkStatsFactory mNetworkStatsFactory = new NetworkStatsFactory(); + private final Pools.Pool mNetworkStatsPool = new Pools.SynchronizedPool<>(6); + + private final Object mWifiNetworkLock = new Object(); + + @GuardedBy("mWifiNetworkLock") private String[] mWifiIfaces = EmptyArray.STRING; - private final NetworkStatsFactory mNetworkStatsFactory = new NetworkStatsFactory(); + @GuardedBy("mWifiNetworkLock") + private NetworkStats mLastWifiNetworkStats = new NetworkStats(0, -1); - private static final int NETWORK_STATS_LAST = 0; - private static final int NETWORK_STATS_NEXT = 1; - private static final int NETWORK_STATS_DELTA = 2; + private final Object mModemNetworkLock = new Object(); - private NetworkStats[] mMobileNetworkStats; - private NetworkStats[] mWifiNetworkStats; + @GuardedBy("mModemNetworkLock") + private String[] mModemIfaces = EmptyArray.STRING; - /** - * Retrieves the delta of network stats for the given network ifaces. Uses networkStatsBuffer - * as a buffer of NetworkStats objects to cycle through when computing deltas. - */ - private NetworkStats getNetworkStatsDeltaLocked(String[] ifaces, - NetworkStats[] networkStatsBuffer) - throws IOException { - if (!SystemProperties.getBoolean(NetworkManagementSocketTagger.PROP_QTAGUID_ENABLED, - false)) { - return null; - } + @GuardedBy("mModemNetworkLock") + private NetworkStats mLastModemNetworkStats = new NetworkStats(0, -1); - final NetworkStats stats = mNetworkStatsFactory.readNetworkStatsDetail(NetworkStats.UID_ALL, - ifaces, NetworkStats.TAG_NONE, networkStatsBuffer[NETWORK_STATS_NEXT]); - networkStatsBuffer[NETWORK_STATS_DELTA] = NetworkStats.subtract(stats, - networkStatsBuffer[NETWORK_STATS_LAST], null, null, - networkStatsBuffer[NETWORK_STATS_DELTA]); - networkStatsBuffer[NETWORK_STATS_NEXT] = networkStatsBuffer[NETWORK_STATS_LAST]; - networkStatsBuffer[NETWORK_STATS_LAST] = stats; - return networkStatsBuffer[NETWORK_STATS_DELTA]; + private NetworkStats readNetworkStatsLocked(String[] ifaces) { + try { + if (!ArrayUtils.isEmpty(ifaces)) { + return mNetworkStatsFactory.readNetworkStatsDetail(NetworkStats.UID_ALL, ifaces, + NetworkStats.TAG_NONE, mNetworkStatsPool.acquire()); + } + } catch (IOException e) { + Slog.e(TAG, "failed to read network stats for ifaces: " + Arrays.toString(ifaces)); + } + return null; } /** * Distribute WiFi energy info and network traffic to apps. * @param info The energy information from the WiFi controller. */ - public void updateWifiStateLocked(@Nullable final WifiActivityEnergyInfo info) { + public void updateWifiState(@Nullable final WifiActivityEnergyInfo info) { if (DEBUG_ENERGY) { - Slog.d(TAG, "Updating wifi stats"); + Slog.d(TAG, "Updating wifi stats: " + Arrays.toString(mWifiIfaces)); } - final long elapsedRealtimeMs = mClocks.elapsedRealtime(); + // Grab a separate lock to acquire the network stats, which may do I/O. NetworkStats delta = null; - try { - if (!ArrayUtils.isEmpty(mWifiIfaces)) { - delta = getNetworkStatsDeltaLocked(mWifiIfaces, mWifiNetworkStats); + synchronized (mWifiNetworkLock) { + final NetworkStats latestStats = readNetworkStatsLocked(mWifiIfaces); + if (latestStats != null) { + delta = NetworkStats.subtract(latestStats, mLastWifiNetworkStats, null, null, + mNetworkStatsPool.acquire()); + mNetworkStatsPool.release(mLastWifiNetworkStats); + mLastWifiNetworkStats = latestStats; } - } catch (IOException e) { - Slog.wtf(TAG, "Failed to get wifi network stats", e); - return; } - if (!mOnBatteryInternal) { - return; - } - - SparseLongArray rxPackets = new SparseLongArray(); - SparseLongArray txPackets = new SparseLongArray(); - long totalTxPackets = 0; - long totalRxPackets = 0; - if (delta != null) { - final int size = delta.size(); - for (int i = 0; i < size; i++) { - final NetworkStats.Entry entry = delta.getValues(i, mTmpNetworkStatsEntry); - - if (DEBUG_ENERGY) { - Slog.d(TAG, "Wifi uid " + entry.uid + ": delta rx=" + entry.rxBytes - + " tx=" + entry.txBytes + " rxPackets=" + entry.rxPackets - + " txPackets=" + entry.txPackets); + synchronized (this) { + if (!mOnBatteryInternal) { + if (delta != null) { + mNetworkStatsPool.release(delta); } + return; + } - if (entry.rxBytes == 0 && entry.txBytes == 0) { - // Skip the lookup below since there is no work to do. - continue; - } + final long elapsedRealtimeMs = mClocks.elapsedRealtime(); + SparseLongArray rxPackets = new SparseLongArray(); + SparseLongArray txPackets = new SparseLongArray(); + long totalTxPackets = 0; + long totalRxPackets = 0; + if (delta != null) { + NetworkStats.Entry entry = new NetworkStats.Entry(); + final int size = delta.size(); + for (int i = 0; i < size; i++) { + entry = delta.getValues(i, entry); - final Uid u = getUidStatsLocked(mapUid(entry.uid)); - if (entry.rxBytes != 0) { - u.noteNetworkActivityLocked(NETWORK_WIFI_RX_DATA, entry.rxBytes, - entry.rxPackets); - if (entry.set == NetworkStats.SET_DEFAULT) { // Background transfers - u.noteNetworkActivityLocked(NETWORK_WIFI_BG_RX_DATA, entry.rxBytes, - entry.rxPackets); + if (DEBUG_ENERGY) { + Slog.d(TAG, "Wifi uid " + entry.uid + ": delta rx=" + entry.rxBytes + + " tx=" + entry.txBytes + " rxPackets=" + entry.rxPackets + + " txPackets=" + entry.txPackets); } - mNetworkByteActivityCounters[NETWORK_WIFI_RX_DATA].addCountLocked( - entry.rxBytes); - mNetworkPacketActivityCounters[NETWORK_WIFI_RX_DATA].addCountLocked( - entry.rxPackets); - - rxPackets.put(u.getUid(), entry.rxPackets); - - // Sum the total number of packets so that the Rx Power can - // be evenly distributed amongst the apps. - totalRxPackets += entry.rxPackets; - } - if (entry.txBytes != 0) { - u.noteNetworkActivityLocked(NETWORK_WIFI_TX_DATA, entry.txBytes, - entry.txPackets); - if (entry.set == NetworkStats.SET_DEFAULT) { // Background transfers - u.noteNetworkActivityLocked(NETWORK_WIFI_BG_TX_DATA, entry.txBytes, - entry.txPackets); + if (entry.rxBytes == 0 && entry.txBytes == 0) { + // Skip the lookup below since there is no work to do. + continue; } - mNetworkByteActivityCounters[NETWORK_WIFI_TX_DATA].addCountLocked( - entry.txBytes); - mNetworkPacketActivityCounters[NETWORK_WIFI_TX_DATA].addCountLocked( - entry.txPackets); - txPackets.put(u.getUid(), entry.txPackets); + final Uid u = getUidStatsLocked(mapUid(entry.uid)); + if (entry.rxBytes != 0) { + u.noteNetworkActivityLocked(NETWORK_WIFI_RX_DATA, entry.rxBytes, + entry.rxPackets); + if (entry.set == NetworkStats.SET_DEFAULT) { // Background transfers + u.noteNetworkActivityLocked(NETWORK_WIFI_BG_RX_DATA, entry.rxBytes, + entry.rxPackets); + } + mNetworkByteActivityCounters[NETWORK_WIFI_RX_DATA].addCountLocked( + entry.rxBytes); + mNetworkPacketActivityCounters[NETWORK_WIFI_RX_DATA].addCountLocked( + entry.rxPackets); - // Sum the total number of packets so that the Tx Power can - // be evenly distributed amongst the apps. - totalTxPackets += entry.txPackets; - } - } - } + rxPackets.put(u.getUid(), entry.rxPackets); - if (info != null) { - mHasWifiReporting = true; + // Sum the total number of packets so that the Rx Power can + // be evenly distributed amongst the apps. + totalRxPackets += entry.rxPackets; + } - // Measured in mAms - final long txTimeMs = info.getControllerTxTimeMillis(); - final long rxTimeMs = info.getControllerRxTimeMillis(); - final long idleTimeMs = info.getControllerIdleTimeMillis(); - final long totalTimeMs = txTimeMs + rxTimeMs + idleTimeMs; + if (entry.txBytes != 0) { + u.noteNetworkActivityLocked(NETWORK_WIFI_TX_DATA, entry.txBytes, + entry.txPackets); + if (entry.set == NetworkStats.SET_DEFAULT) { // Background transfers + u.noteNetworkActivityLocked(NETWORK_WIFI_BG_TX_DATA, entry.txBytes, + entry.txPackets); + } + mNetworkByteActivityCounters[NETWORK_WIFI_TX_DATA].addCountLocked( + entry.txBytes); + mNetworkPacketActivityCounters[NETWORK_WIFI_TX_DATA].addCountLocked( + entry.txPackets); - long leftOverRxTimeMs = rxTimeMs; - long leftOverTxTimeMs = txTimeMs; + txPackets.put(u.getUid(), entry.txPackets); - if (DEBUG_ENERGY) { - Slog.d(TAG, "------ BEGIN WiFi power blaming ------"); - Slog.d(TAG, " Tx Time: " + txTimeMs + " ms"); - Slog.d(TAG, " Rx Time: " + rxTimeMs + " ms"); - Slog.d(TAG, " Idle Time: " + idleTimeMs + " ms"); - Slog.d(TAG, " Total Time: " + totalTimeMs + " ms"); + // Sum the total number of packets so that the Tx Power can + // be evenly distributed amongst the apps. + totalTxPackets += entry.txPackets; + } + } + mNetworkStatsPool.release(delta); + delta = null; } - long totalWifiLockTimeMs = 0; - long totalScanTimeMs = 0; - - // On the first pass, collect some totals so that we can normalize power - // calculations if we need to. - final int uidStatsSize = mUidStats.size(); - for (int i = 0; i < uidStatsSize; i++) { - final Uid uid = mUidStats.valueAt(i); - - // Sum the total scan power for all apps. - totalScanTimeMs += uid.mWifiScanTimer.getTimeSinceMarkLocked( - elapsedRealtimeMs * 1000) / 1000; + if (info != null) { + mHasWifiReporting = true; - // Sum the total time holding wifi lock for all apps. - totalWifiLockTimeMs += uid.mFullWifiLockTimer.getTimeSinceMarkLocked( - elapsedRealtimeMs * 1000) / 1000; - } + // Measured in mAms + final long txTimeMs = info.getControllerTxTimeMillis(); + final long rxTimeMs = info.getControllerRxTimeMillis(); + final long idleTimeMs = info.getControllerIdleTimeMillis(); + final long totalTimeMs = txTimeMs + rxTimeMs + idleTimeMs; - if (DEBUG_ENERGY && totalScanTimeMs > rxTimeMs) { - Slog.d(TAG, " !Estimated scan time > Actual rx time (" + totalScanTimeMs + " ms > " - + rxTimeMs + " ms). Normalizing scan time."); - } - if (DEBUG_ENERGY && totalScanTimeMs > txTimeMs) { - Slog.d(TAG, " !Estimated scan time > Actual tx time (" + totalScanTimeMs + " ms > " - + txTimeMs + " ms). Normalizing scan time."); - } + long leftOverRxTimeMs = rxTimeMs; + long leftOverTxTimeMs = txTimeMs; - // Actually assign and distribute power usage to apps. - for (int i = 0; i < uidStatsSize; i++) { - final Uid uid = mUidStats.valueAt(i); - - long scanTimeSinceMarkMs = uid.mWifiScanTimer.getTimeSinceMarkLocked( - elapsedRealtimeMs * 1000) / 1000; - if (scanTimeSinceMarkMs > 0) { - // Set the new mark so that next time we get new data since this point. - uid.mWifiScanTimer.setMark(elapsedRealtimeMs); + if (DEBUG_ENERGY) { + Slog.d(TAG, "------ BEGIN WiFi power blaming ------"); + Slog.d(TAG, " Tx Time: " + txTimeMs + " ms"); + Slog.d(TAG, " Rx Time: " + rxTimeMs + " ms"); + Slog.d(TAG, " Idle Time: " + idleTimeMs + " ms"); + Slog.d(TAG, " Total Time: " + totalTimeMs + " ms"); + } + + long totalWifiLockTimeMs = 0; + long totalScanTimeMs = 0; + + // On the first pass, collect some totals so that we can normalize power + // calculations if we need to. + final int uidStatsSize = mUidStats.size(); + for (int i = 0; i < uidStatsSize; i++) { + final Uid uid = mUidStats.valueAt(i); + + // Sum the total scan power for all apps. + totalScanTimeMs += uid.mWifiScanTimer.getTimeSinceMarkLocked( + elapsedRealtimeMs * 1000) / 1000; + + // Sum the total time holding wifi lock for all apps. + totalWifiLockTimeMs += uid.mFullWifiLockTimer.getTimeSinceMarkLocked( + elapsedRealtimeMs * 1000) / 1000; + } + + if (DEBUG_ENERGY && totalScanTimeMs > rxTimeMs) { + Slog.d(TAG, + " !Estimated scan time > Actual rx time (" + totalScanTimeMs + " ms > " + + rxTimeMs + " ms). Normalizing scan time."); + } + if (DEBUG_ENERGY && totalScanTimeMs > txTimeMs) { + Slog.d(TAG, + " !Estimated scan time > Actual tx time (" + totalScanTimeMs + " ms > " + + txTimeMs + " ms). Normalizing scan time."); + } + + // Actually assign and distribute power usage to apps. + for (int i = 0; i < uidStatsSize; i++) { + final Uid uid = mUidStats.valueAt(i); + + long scanTimeSinceMarkMs = uid.mWifiScanTimer.getTimeSinceMarkLocked( + elapsedRealtimeMs * 1000) / 1000; + if (scanTimeSinceMarkMs > 0) { + // Set the new mark so that next time we get new data since this point. + uid.mWifiScanTimer.setMark(elapsedRealtimeMs); + + long scanRxTimeSinceMarkMs = scanTimeSinceMarkMs; + long scanTxTimeSinceMarkMs = scanTimeSinceMarkMs; + + // Our total scan time is more than the reported Tx/Rx time. + // This is possible because the cost of a scan is approximate. + // Let's normalize the result so that we evenly blame each app + // scanning. + // + // This means that we may have apps that transmitted/received packets not be + // blamed for this, but this is fine as scans are relatively more expensive. + if (totalScanTimeMs > rxTimeMs) { + scanRxTimeSinceMarkMs = (rxTimeMs * scanRxTimeSinceMarkMs) / + totalScanTimeMs; + } + if (totalScanTimeMs > txTimeMs) { + scanTxTimeSinceMarkMs = (txTimeMs * scanTxTimeSinceMarkMs) / + totalScanTimeMs; + } - long scanRxTimeSinceMarkMs = scanTimeSinceMarkMs; - long scanTxTimeSinceMarkMs = scanTimeSinceMarkMs; + if (DEBUG_ENERGY) { + Slog.d(TAG, " ScanTime for UID " + uid.getUid() + ": Rx:" + + scanRxTimeSinceMarkMs + " ms Tx:" + + scanTxTimeSinceMarkMs + " ms)"); + } - // Our total scan time is more than the reported Tx/Rx time. - // This is possible because the cost of a scan is approximate. - // Let's normalize the result so that we evenly blame each app - // scanning. - // - // This means that we may have apps that transmitted/received packets not be - // blamed for this, but this is fine as scans are relatively more expensive. - if (totalScanTimeMs > rxTimeMs) { - scanRxTimeSinceMarkMs = (rxTimeMs * scanRxTimeSinceMarkMs) / - totalScanTimeMs; - } - if (totalScanTimeMs > txTimeMs) { - scanTxTimeSinceMarkMs = (txTimeMs * scanTxTimeSinceMarkMs) / - totalScanTimeMs; + ControllerActivityCounterImpl activityCounter = + uid.getOrCreateWifiControllerActivityLocked(); + activityCounter.getRxTimeCounter().addCountLocked(scanRxTimeSinceMarkMs); + activityCounter.getTxTimeCounters()[0].addCountLocked( + scanTxTimeSinceMarkMs); + leftOverRxTimeMs -= scanRxTimeSinceMarkMs; + leftOverTxTimeMs -= scanTxTimeSinceMarkMs; } - if (DEBUG_ENERGY) { - Slog.d(TAG, " ScanTime for UID " + uid.getUid() + ": Rx:" - + scanRxTimeSinceMarkMs + " ms Tx:" - + scanTxTimeSinceMarkMs + " ms)"); + // Distribute evenly the power consumed while Idle to each app holding a WiFi + // lock. + final long wifiLockTimeSinceMarkMs = + uid.mFullWifiLockTimer.getTimeSinceMarkLocked( + elapsedRealtimeMs * 1000) / 1000; + if (wifiLockTimeSinceMarkMs > 0) { + // Set the new mark so that next time we get new data since this point. + uid.mFullWifiLockTimer.setMark(elapsedRealtimeMs); + + final long myIdleTimeMs = (wifiLockTimeSinceMarkMs * idleTimeMs) + / totalWifiLockTimeMs; + if (DEBUG_ENERGY) { + Slog.d(TAG, " IdleTime for UID " + uid.getUid() + ": " + + myIdleTimeMs + " ms"); + } + uid.getOrCreateWifiControllerActivityLocked().getIdleTimeCounter() + .addCountLocked(myIdleTimeMs); } - - ControllerActivityCounterImpl activityCounter = - uid.getOrCreateWifiControllerActivityLocked(); - activityCounter.getRxTimeCounter().addCountLocked(scanRxTimeSinceMarkMs); - activityCounter.getTxTimeCounters()[0].addCountLocked(scanTxTimeSinceMarkMs); - leftOverRxTimeMs -= scanRxTimeSinceMarkMs; - leftOverTxTimeMs -= scanTxTimeSinceMarkMs; } - // Distribute evenly the power consumed while Idle to each app holding a WiFi - // lock. - final long wifiLockTimeSinceMarkMs = uid.mFullWifiLockTimer.getTimeSinceMarkLocked( - elapsedRealtimeMs * 1000) / 1000; - if (wifiLockTimeSinceMarkMs > 0) { - // Set the new mark so that next time we get new data since this point. - uid.mFullWifiLockTimer.setMark(elapsedRealtimeMs); + if (DEBUG_ENERGY) { + Slog.d(TAG, " New RxPower: " + leftOverRxTimeMs + " ms"); + Slog.d(TAG, " New TxPower: " + leftOverTxTimeMs + " ms"); + } - final long myIdleTimeMs = (wifiLockTimeSinceMarkMs * idleTimeMs) - / totalWifiLockTimeMs; + // Distribute the remaining Tx power appropriately between all apps that transmitted + // packets. + for (int i = 0; i < txPackets.size(); i++) { + final Uid uid = getUidStatsLocked(txPackets.keyAt(i)); + final long myTxTimeMs = (txPackets.valueAt(i) * leftOverTxTimeMs) + / totalTxPackets; if (DEBUG_ENERGY) { - Slog.d(TAG, " IdleTime for UID " + uid.getUid() + ": " - + myIdleTimeMs + " ms"); + Slog.d(TAG, " TxTime for UID " + uid.getUid() + ": " + myTxTimeMs + " ms"); } - uid.getOrCreateWifiControllerActivityLocked().getIdleTimeCounter() - .addCountLocked(myIdleTimeMs); + uid.getOrCreateWifiControllerActivityLocked().getTxTimeCounters()[0] + .addCountLocked(myTxTimeMs); } - } - - if (DEBUG_ENERGY) { - Slog.d(TAG, " New RxPower: " + leftOverRxTimeMs + " ms"); - Slog.d(TAG, " New TxPower: " + leftOverTxTimeMs + " ms"); - } - // Distribute the remaining Tx power appropriately between all apps that transmitted - // packets. - for (int i = 0; i < txPackets.size(); i++) { - final Uid uid = getUidStatsLocked(txPackets.keyAt(i)); - final long myTxTimeMs = (txPackets.valueAt(i) * leftOverTxTimeMs) / totalTxPackets; - if (DEBUG_ENERGY) { - Slog.d(TAG, " TxTime for UID " + uid.getUid() + ": " + myTxTimeMs + " ms"); + // Distribute the remaining Rx power appropriately between all apps that received + // packets. + for (int i = 0; i < rxPackets.size(); i++) { + final Uid uid = getUidStatsLocked(rxPackets.keyAt(i)); + final long myRxTimeMs = (rxPackets.valueAt(i) * leftOverRxTimeMs) + / totalRxPackets; + if (DEBUG_ENERGY) { + Slog.d(TAG, " RxTime for UID " + uid.getUid() + ": " + myRxTimeMs + " ms"); + } + uid.getOrCreateWifiControllerActivityLocked().getRxTimeCounter() + .addCountLocked(myRxTimeMs); } - uid.getOrCreateWifiControllerActivityLocked().getTxTimeCounters()[0] - .addCountLocked(myTxTimeMs); - } - // Distribute the remaining Rx power appropriately between all apps that received - // packets. - for (int i = 0; i < rxPackets.size(); i++) { - final Uid uid = getUidStatsLocked(rxPackets.keyAt(i)); - final long myRxTimeMs = (rxPackets.valueAt(i) * leftOverRxTimeMs) / totalRxPackets; - if (DEBUG_ENERGY) { - Slog.d(TAG, " RxTime for UID " + uid.getUid() + ": " + myRxTimeMs + " ms"); - } - uid.getOrCreateWifiControllerActivityLocked().getRxTimeCounter() - .addCountLocked(myRxTimeMs); - } + // Any left over power use will be picked up by the WiFi category in BatteryStatsHelper. - // Any left over power use will be picked up by the WiFi category in BatteryStatsHelper. - // Update WiFi controller stats. - mWifiActivity.getRxTimeCounter().addCountLocked(info.getControllerRxTimeMillis()); - mWifiActivity.getTxTimeCounters()[0].addCountLocked(info.getControllerTxTimeMillis()); - mWifiActivity.getIdleTimeCounter().addCountLocked(info.getControllerIdleTimeMillis()); + // Update WiFi controller stats. + mWifiActivity.getRxTimeCounter().addCountLocked(info.getControllerRxTimeMillis()); + mWifiActivity.getTxTimeCounters()[0].addCountLocked( + info.getControllerTxTimeMillis()); + mWifiActivity.getIdleTimeCounter().addCountLocked( + info.getControllerIdleTimeMillis()); - // POWER_WIFI_CONTROLLER_OPERATING_VOLTAGE is measured in mV, so convert to V. - final double opVolt = mPowerProfile.getAveragePower( - PowerProfile.POWER_WIFI_CONTROLLER_OPERATING_VOLTAGE) / 1000.0; - if (opVolt != 0) { - // We store the power drain as mAms. - mWifiActivity.getPowerCounter().addCountLocked( - (long)(info.getControllerEnergyUsed() / opVolt)); + // POWER_WIFI_CONTROLLER_OPERATING_VOLTAGE is measured in mV, so convert to V. + final double opVolt = mPowerProfile.getAveragePower( + PowerProfile.POWER_WIFI_CONTROLLER_OPERATING_VOLTAGE) / 1000.0; + if (opVolt != 0) { + // We store the power drain as mAms. + mWifiActivity.getPowerCounter().addCountLocked( + (long) (info.getControllerEnergyUsed() / opVolt)); + } } } } @@ -9611,133 +9617,148 @@ public class BatteryStatsImpl extends BatteryStats { /** * Distribute Cell radio energy info and network traffic to apps. */ - public void updateMobileRadioStateLocked(final long elapsedRealtimeMs, - final ModemActivityInfo activityInfo) { + public void updateMobileRadioState(@Nullable final ModemActivityInfo activityInfo) { if (DEBUG_ENERGY) { Slog.d(TAG, "Updating mobile radio stats with " + activityInfo); } + // Grab a separate lock to acquire the network stats, which may do I/O. NetworkStats delta = null; - try { - if (!ArrayUtils.isEmpty(mMobileIfaces)) { - delta = getNetworkStatsDeltaLocked(mMobileIfaces, mMobileNetworkStats); + synchronized (mModemNetworkLock) { + final NetworkStats latestStats = readNetworkStatsLocked(mModemIfaces); + if (latestStats != null) { + delta = NetworkStats.subtract(latestStats, mLastModemNetworkStats, null, null, + mNetworkStatsPool.acquire()); + mNetworkStatsPool.release(mLastModemNetworkStats); + mLastModemNetworkStats = latestStats; } - } catch (IOException e) { - Slog.wtf(TAG, "Failed to get mobile network stats", e); - return; } - if (!mOnBatteryInternal) { - return; - } - - long radioTime = mMobileRadioActivePerAppTimer.getTimeSinceMarkLocked( - elapsedRealtimeMs * 1000); - mMobileRadioActivePerAppTimer.setMark(elapsedRealtimeMs); - - long totalRxPackets = 0; - long totalTxPackets = 0; - if (delta != null) { - final int size = delta.size(); - for (int i = 0; i < size; i++) { - final NetworkStats.Entry entry = delta.getValues(i, mTmpNetworkStatsEntry); - if (entry.rxPackets == 0 && entry.txPackets == 0) { - continue; - } - - if (DEBUG_ENERGY) { - Slog.d(TAG, "Mobile uid " + entry.uid + ": delta rx=" + entry.rxBytes - + " tx=" + entry.txBytes + " rxPackets=" + entry.rxPackets - + " txPackets=" + entry.txPackets); - } - - totalRxPackets += entry.rxPackets; - totalTxPackets += entry.txPackets; - - final Uid u = getUidStatsLocked(mapUid(entry.uid)); - u.noteNetworkActivityLocked(NETWORK_MOBILE_RX_DATA, entry.rxBytes, entry.rxPackets); - u.noteNetworkActivityLocked(NETWORK_MOBILE_TX_DATA, entry.txBytes, entry.txPackets); - if (entry.set == NetworkStats.SET_DEFAULT) { // Background transfers - u.noteNetworkActivityLocked(NETWORK_MOBILE_BG_RX_DATA, - entry.rxBytes, entry.rxPackets); - u.noteNetworkActivityLocked(NETWORK_MOBILE_BG_TX_DATA, - entry.txBytes, entry.txPackets); + synchronized (this) { + if (!mOnBatteryInternal) { + if (delta != null) { + mNetworkStatsPool.release(delta); } - - mNetworkByteActivityCounters[NETWORK_MOBILE_RX_DATA].addCountLocked( - entry.rxBytes); - mNetworkByteActivityCounters[NETWORK_MOBILE_TX_DATA].addCountLocked( - entry.txBytes); - mNetworkPacketActivityCounters[NETWORK_MOBILE_RX_DATA].addCountLocked( - entry.rxPackets); - mNetworkPacketActivityCounters[NETWORK_MOBILE_TX_DATA].addCountLocked( - entry.txPackets); + return; } - // Now distribute proportional blame to the apps that did networking. - long totalPackets = totalRxPackets + totalTxPackets; - if (totalPackets > 0) { + final long elapsedRealtimeMs = SystemClock.elapsedRealtime(); + long radioTime = mMobileRadioActivePerAppTimer.getTimeSinceMarkLocked( + elapsedRealtimeMs * 1000); + mMobileRadioActivePerAppTimer.setMark(elapsedRealtimeMs); + + long totalRxPackets = 0; + long totalTxPackets = 0; + if (delta != null) { + NetworkStats.Entry entry = new NetworkStats.Entry(); + final int size = delta.size(); for (int i = 0; i < size; i++) { - final NetworkStats.Entry entry = delta.getValues(i, mTmpNetworkStatsEntry); + entry = delta.getValues(i, entry); if (entry.rxPackets == 0 && entry.txPackets == 0) { continue; } - final Uid u = getUidStatsLocked(mapUid(entry.uid)); + if (DEBUG_ENERGY) { + Slog.d(TAG, "Mobile uid " + entry.uid + ": delta rx=" + entry.rxBytes + + " tx=" + entry.txBytes + " rxPackets=" + entry.rxPackets + + " txPackets=" + entry.txPackets); + } - // Distribute total radio active time in to this app. - final long appPackets = entry.rxPackets + entry.txPackets; - final long appRadioTime = (radioTime * appPackets) / totalPackets; - u.noteMobileRadioActiveTimeLocked(appRadioTime); + totalRxPackets += entry.rxPackets; + totalTxPackets += entry.txPackets; + + final Uid u = getUidStatsLocked(mapUid(entry.uid)); + u.noteNetworkActivityLocked(NETWORK_MOBILE_RX_DATA, entry.rxBytes, + entry.rxPackets); + u.noteNetworkActivityLocked(NETWORK_MOBILE_TX_DATA, entry.txBytes, + entry.txPackets); + if (entry.set == NetworkStats.SET_DEFAULT) { // Background transfers + u.noteNetworkActivityLocked(NETWORK_MOBILE_BG_RX_DATA, + entry.rxBytes, entry.rxPackets); + u.noteNetworkActivityLocked(NETWORK_MOBILE_BG_TX_DATA, + entry.txBytes, entry.txPackets); + } - // Remove this app from the totals, so that we don't lose any time - // due to rounding. - radioTime -= appRadioTime; - totalPackets -= appPackets; + mNetworkByteActivityCounters[NETWORK_MOBILE_RX_DATA].addCountLocked( + entry.rxBytes); + mNetworkByteActivityCounters[NETWORK_MOBILE_TX_DATA].addCountLocked( + entry.txBytes); + mNetworkPacketActivityCounters[NETWORK_MOBILE_RX_DATA].addCountLocked( + entry.rxPackets); + mNetworkPacketActivityCounters[NETWORK_MOBILE_TX_DATA].addCountLocked( + entry.txPackets); + } - if (activityInfo != null) { - ControllerActivityCounterImpl activityCounter = - u.getOrCreateModemControllerActivityLocked(); - if (totalRxPackets > 0 && entry.rxPackets > 0) { - final long rxMs = (entry.rxPackets * activityInfo.getRxTimeMillis()) - / totalRxPackets; - activityCounter.getRxTimeCounter().addCountLocked(rxMs); + // Now distribute proportional blame to the apps that did networking. + long totalPackets = totalRxPackets + totalTxPackets; + if (totalPackets > 0) { + for (int i = 0; i < size; i++) { + entry = delta.getValues(i, entry); + if (entry.rxPackets == 0 && entry.txPackets == 0) { + continue; } - if (totalTxPackets > 0 && entry.txPackets > 0) { - for (int lvl = 0; lvl < ModemActivityInfo.TX_POWER_LEVELS; lvl++) { - long txMs = entry.txPackets * activityInfo.getTxTimeMillis()[lvl]; - txMs /= totalTxPackets; - activityCounter.getTxTimeCounters()[lvl].addCountLocked(txMs); + final Uid u = getUidStatsLocked(mapUid(entry.uid)); + + // Distribute total radio active time in to this app. + final long appPackets = entry.rxPackets + entry.txPackets; + final long appRadioTime = (radioTime * appPackets) / totalPackets; + u.noteMobileRadioActiveTimeLocked(appRadioTime); + + // Remove this app from the totals, so that we don't lose any time + // due to rounding. + radioTime -= appRadioTime; + totalPackets -= appPackets; + + if (activityInfo != null) { + ControllerActivityCounterImpl activityCounter = + u.getOrCreateModemControllerActivityLocked(); + if (totalRxPackets > 0 && entry.rxPackets > 0) { + final long rxMs = (entry.rxPackets * activityInfo.getRxTimeMillis()) + / totalRxPackets; + activityCounter.getRxTimeCounter().addCountLocked(rxMs); + } + + if (totalTxPackets > 0 && entry.txPackets > 0) { + for (int lvl = 0; lvl < ModemActivityInfo.TX_POWER_LEVELS; lvl++) { + long txMs = + entry.txPackets * activityInfo.getTxTimeMillis()[lvl]; + txMs /= totalTxPackets; + activityCounter.getTxTimeCounters()[lvl].addCountLocked(txMs); + } } } } } - } - if (radioTime > 0) { - // Whoops, there is some radio time we can't blame on an app! - mMobileRadioActiveUnknownTime.addCountLocked(radioTime); - mMobileRadioActiveUnknownCount.addCountLocked(1); - } - } + if (radioTime > 0) { + // Whoops, there is some radio time we can't blame on an app! + mMobileRadioActiveUnknownTime.addCountLocked(radioTime); + mMobileRadioActiveUnknownCount.addCountLocked(1); + } - if (activityInfo != null) { - mHasModemReporting = true; - mModemActivity.getIdleTimeCounter().addCountLocked(activityInfo.getIdleTimeMillis()); - mModemActivity.getRxTimeCounter().addCountLocked(activityInfo.getRxTimeMillis()); - for (int lvl = 0; lvl < ModemActivityInfo.TX_POWER_LEVELS; lvl++) { - mModemActivity.getTxTimeCounters()[lvl] - .addCountLocked(activityInfo.getTxTimeMillis()[lvl]); + mNetworkStatsPool.release(delta); + delta = null; } - // POWER_MODEM_CONTROLLER_OPERATING_VOLTAGE is measured in mV, so convert to V. - final double opVolt = mPowerProfile.getAveragePower( - PowerProfile.POWER_MODEM_CONTROLLER_OPERATING_VOLTAGE) / 1000.0; - if (opVolt != 0) { - // We store the power drain as mAms. - mModemActivity.getPowerCounter().addCountLocked( - (long) (activityInfo.getEnergyUsed() / opVolt)); + if (activityInfo != null) { + mHasModemReporting = true; + mModemActivity.getIdleTimeCounter().addCountLocked( + activityInfo.getIdleTimeMillis()); + mModemActivity.getRxTimeCounter().addCountLocked(activityInfo.getRxTimeMillis()); + for (int lvl = 0; lvl < ModemActivityInfo.TX_POWER_LEVELS; lvl++) { + mModemActivity.getTxTimeCounters()[lvl] + .addCountLocked(activityInfo.getTxTimeMillis()[lvl]); + } + + // POWER_MODEM_CONTROLLER_OPERATING_VOLTAGE is measured in mV, so convert to V. + final double opVolt = mPowerProfile.getAveragePower( + PowerProfile.POWER_MODEM_CONTROLLER_OPERATING_VOLTAGE) / 1000.0; + if (opVolt != 0) { + // We store the power drain as mAms. + mModemActivity.getPowerCounter().addCountLocked( + (long) (activityInfo.getEnergyUsed() / opVolt)); + } } } } diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 243906260593..e30f00656852 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -17,6 +17,8 @@ package com.android.server.am; import static com.android.internal.os.BatteryStatsImpl.ExternalStatsSync.UPDATE_CPU; +import static com.android.internal.os.BatteryStatsImpl.ExternalStatsSync.UPDATE_RADIO; +import static com.android.internal.os.BatteryStatsImpl.ExternalStatsSync.UPDATE_WIFI; import android.annotation.Nullable; import android.bluetooth.BluetoothActivityEnergyInfo; @@ -230,10 +232,12 @@ public final class BatteryStatsService extends IBatteryStats.Stub public void publish(Context context) { mContext = context; - mStats.setRadioScanningTimeout(mContext.getResources().getInteger( - com.android.internal.R.integer.config_radioScanningTimeout) - * 1000L); - mStats.setPowerProfile(new PowerProfile(context)); + synchronized (mStats) { + mStats.setRadioScanningTimeoutLocked(mContext.getResources().getInteger( + com.android.internal.R.integer.config_radioScanningTimeout) + * 1000L); + mStats.setPowerProfileLocked(new PowerProfile(context)); + } ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder()); } @@ -244,9 +248,11 @@ public final class BatteryStatsService extends IBatteryStats.Stub public void initPowerManagement() { final PowerManagerInternal powerMgr = LocalServices.getService(PowerManagerInternal.class); powerMgr.registerLowPowerModeObserver(this); - mStats.notePowerSaveMode( - powerMgr.getLowPowerState(ServiceType.BATTERY_STATS) - .batterySaverEnabled); + synchronized (mStats) { + mStats.notePowerSaveModeLocked( + powerMgr.getLowPowerState(ServiceType.BATTERY_STATS) + .batterySaverEnabled); + } (new WakeupReasonThread()).start(); } @@ -279,7 +285,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub @Override public void onLowPowerModeChanged(PowerSaveState result) { synchronized (mStats) { - mStats.notePowerSaveMode(result.batterySaverEnabled); + mStats.notePowerSaveModeLocked(result.batterySaverEnabled); } } @@ -605,8 +611,13 @@ public final class BatteryStatsService extends IBatteryStats.Stub public void noteMobileRadioPowerState(int powerState, long timestampNs, int uid) { enforceCallingPermission(); + boolean update; synchronized (mStats) { - mStats.noteMobileRadioPowerState(powerState, timestampNs, uid); + update = mStats.noteMobileRadioPowerStateLocked(powerState, timestampNs, uid); + } + + if (update) { + mHandler.scheduleSync("modem-data", UPDATE_RADIO); } } @@ -758,7 +769,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM) ? "active" : "inactive"; mHandler.scheduleSync("wifi-data: " + type, - BatteryStatsImpl.ExternalStatsSync.UPDATE_WIFI); + UPDATE_WIFI); } mStats.noteWifiRadioPowerState(powerState, tsNanos, uid); } @@ -916,9 +927,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub @Override public void noteNetworkStatsEnabled() { enforceCallingPermission(); - synchronized (mStats) { - mStats.noteNetworkStatsEnabledLocked(); - } + mHandler.scheduleSync("network-stats-enabled", UPDATE_RADIO | UPDATE_WIFI); } @Override @@ -984,9 +993,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub return; } - synchronized (mStats) { - mStats.updateWifiStateLocked(info); - } + mStats.updateWifiState(info); } @Override @@ -1011,9 +1018,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub return; } - synchronized (mStats) { - mStats.updateMobileRadioStateLocked(SystemClock.elapsedRealtime(), info); - } + mStats.updateMobileRadioState(info); } public boolean isOnBattery() { @@ -1488,7 +1493,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub return; } - if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_WIFI) != 0) { + if ((updateFlags & UPDATE_WIFI) != 0) { if (mWifiManager == null) { mWifiManager = IWifiManager.Stub.asInterface( ServiceManager.getService(Context.WIFI_SERVICE)); @@ -1557,14 +1562,6 @@ public final class BatteryStatsService extends IBatteryStats.Stub mStats.updateKernelWakelocksLocked(); mStats.updateKernelMemoryBandwidthLocked(); - if (wifiInfo != null) { - if (wifiInfo.isValid()) { - mStats.updateWifiStateLocked(extractDelta(wifiInfo)); - } else { - Slog.e(TAG, "wifi info is invalid: " + wifiInfo); - } - } - if (bluetoothInfo != null) { if (bluetoothInfo.isValid()) { mStats.updateBluetoothStateLocked(bluetoothInfo); @@ -1572,14 +1569,21 @@ public final class BatteryStatsService extends IBatteryStats.Stub Slog.e(TAG, "bluetooth info is invalid: " + bluetoothInfo); } } + } - if (modemInfo != null) { - if (modemInfo.isValid()) { - mStats.updateMobileRadioStateLocked(SystemClock.elapsedRealtime(), - modemInfo); - } else { - Slog.e(TAG, "modem info is invalid: " + modemInfo); - } + if (wifiInfo != null) { + if (wifiInfo.isValid()) { + mStats.updateWifiState(extractDelta(wifiInfo)); + } else { + Slog.e(TAG, "wifi info is invalid: " + wifiInfo); + } + } + + if (modemInfo != null) { + if (modemInfo.isValid()) { + mStats.updateMobileRadioState(modemInfo); + } else { + Slog.e(TAG, "modem info is invalid: " + modemInfo); } } } -- 2.11.0