diff options
| author | 2009-06-24 15:21:16 -0700 | |
|---|---|---|
| committer | 2009-06-24 15:21:16 -0700 | |
| commit | 3e376a74b3edd8c311e8d69ca5baf986c9da4a06 (patch) | |
| tree | 6dc1d57f83e8b83ca05942668b3a5ab336a35cbe | |
| parent | 956070383945db5f842ec05e507fd0233705738c (diff) | |
| parent | 32dbefda71c50bf848da21fb5d1255273439f90d (diff) | |
Merge change 5171 into donut
* changes:
Track native processes and airplane mode.
6 files changed, 83 insertions, 13 deletions
diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl index ce32754990cf..4bac5933d7ed 100644 --- a/core/java/com/android/internal/app/IBatteryStats.aidl +++ b/core/java/com/android/internal/app/IBatteryStats.aidl @@ -37,6 +37,7 @@ interface IBatteryStats { void notePhoneOff(); void notePhoneSignalStrength(in SignalStrength signalStrength); void notePhoneDataConnectionState(int dataType, boolean hasData); + void noteAirplaneMode(boolean isAirplaneMode); void noteWifiOn(int uid); void noteWifiOff(int uid); void noteWifiRunning(); diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 58a3a83f8ebc..fc4a9c4fe999 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -191,6 +191,8 @@ public final class BatteryStatsImpl extends BatteryStats { private final Map<String, KernelWakelockStats> mProcWakelockFileStats = new HashMap<String, KernelWakelockStats>(); + private HashMap<String, Integer> mUidCache = new HashMap<String, Integer>(); + // For debugging public BatteryStatsImpl() { mFile = mBackupFile = null; @@ -714,6 +716,10 @@ public final class BatteryStatsImpl extends BatteryStats { } } + boolean isRunningLocked() { + return mNesting > 0; + } + void stopRunningLocked(BatteryStatsImpl stats) { // Ignore attempt to stop a timer that isn't running if (mNesting == 0) { @@ -1048,7 +1054,24 @@ public final class BatteryStatsImpl extends BatteryStats { mPhoneOnTimer.stopRunningLocked(this); } } - + + public void noteAirplaneModeLocked(boolean isAirplaneMode) { + final int bin = mPhoneSignalStrengthBin; + if (bin >= 0) { + if (!isAirplaneMode) { + if (!mPhoneSignalStrengthsTimer[bin].isRunningLocked()) { + mPhoneSignalStrengthsTimer[bin].startRunningLocked(this); + } + } else { + for (int i = 0; i < NUM_SIGNAL_STRENGTH_BINS; i++) { + while (mPhoneSignalStrengthsTimer[i].isRunningLocked()) { + mPhoneSignalStrengthsTimer[i].stopRunningLocked(this); + } + } + } + } + } + public void notePhoneSignalStrengthLocked(SignalStrength signalStrength) { // Bin the strength. int bin; @@ -2797,7 +2820,7 @@ public final class BatteryStatsImpl extends BatteryStats { public void removeUidStatsLocked(int uid) { mUidStats.remove(uid); } - + /** * Retrieve the statistics object for a particular process, creating * if needed. @@ -2808,6 +2831,26 @@ public final class BatteryStatsImpl extends BatteryStats { } /** + * Retrieve the statistics object for a particular process, given + * the name of the process. + * @param name process name + * @return the statistics object for the process + */ + public Uid.Proc getProcessStatsLocked(String name) { + int uid; + if (mUidCache.containsKey(name)) { + uid = mUidCache.get(name); + } else { + // TODO: Find the actual uid from /proc/pid/status. For now use the hashcode of the + // process name + uid = name.hashCode(); + mUidCache.put(name, uid); + } + Uid u = getUidStatsLocked(uid); + return u.getProcessStatsLocked(name); + } + + /** * Retrieve the statistics object for a particular process, creating * if needed. */ diff --git a/core/java/com/android/internal/os/PowerProfile.java b/core/java/com/android/internal/os/PowerProfile.java index a37bf6e3f446..4a8d8b182f90 100644 --- a/core/java/com/android/internal/os/PowerProfile.java +++ b/core/java/com/android/internal/os/PowerProfile.java @@ -219,12 +219,12 @@ public class PowerProfile { public double getAveragePower(String type, int level) { if (sPowerMap.containsKey(type)) { Object data = sPowerMap.get(type); - if (data instanceof double[]) { - final double[] values = (double[]) data; - if (values.length > level) { + if (data instanceof Double[]) { + final Double[] values = (Double[]) data; + if (values.length > level && level >= 0) { return values[level]; - } else if (values.length < 0) { - return values[0]; + } else if (level < 0) { + return 0; } else { return values[values.length - 1]; } diff --git a/services/java/com/android/server/TelephonyRegistry.java b/services/java/com/android/server/TelephonyRegistry.java index b601ecea6716..9f2856c694bb 100644 --- a/services/java/com/android/server/TelephonyRegistry.java +++ b/services/java/com/android/server/TelephonyRegistry.java @@ -462,6 +462,15 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { // private void broadcastServiceStateChanged(ServiceState state) { + long ident = Binder.clearCallingIdentity(); + try { + mBatteryStats.noteAirplaneMode(state.getState() == ServiceState.STATE_POWER_OFF); + } catch (RemoteException re) { + // Can't do much + } finally { + Binder.restoreCallingIdentity(ident); + } + Intent intent = new Intent(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED); Bundle data = new Bundle(); state.fillInNotifierBundle(data); diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index 16bb29db267e..62b4d5ef4635 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -61,6 +61,7 @@ import android.content.pm.ServiceInfo; import android.content.res.Configuration; import android.graphics.Bitmap; import android.net.Uri; +import android.os.BatteryStats; import android.os.Binder; import android.os.Bundle; import android.os.Environment; @@ -1517,7 +1518,9 @@ public final class ActivityManagerService extends ActivityManagerNative implemen } } - synchronized(mBatteryStatsService.getActiveStatistics()) { + final BatteryStatsImpl bstats = + (BatteryStatsImpl) mBatteryStatsService.getActiveStatistics(); + synchronized(bstats) { synchronized(mPidsSelfLocked) { if (haveNewCpuStats) { if (mBatteryStatsService.isOnBattery()) { @@ -1529,12 +1532,18 @@ public final class ActivityManagerService extends ActivityManagerNative implemen if (pr != null) { BatteryStatsImpl.Uid.Proc ps = pr.batteryStats; ps.addCpuTimeLocked(st.rel_utime, st.rel_stime); + } else { + BatteryStatsImpl.Uid.Proc ps = + bstats.getProcessStatsLocked(st.name); + if (ps != null) { + ps.addCpuTimeLocked(st.rel_utime, st.rel_stime); + } } } } } } - + if (mLastWriteTime < (now-BATTERY_STATS_TIME)) { mLastWriteTime = now; mBatteryStatsService.getActiveStatistics().writeLocked(); diff --git a/services/java/com/android/server/am/BatteryStatsService.java b/services/java/com/android/server/am/BatteryStatsService.java index 9a4b642213df..39a1ee050226 100644 --- a/services/java/com/android/server/am/BatteryStatsService.java +++ b/services/java/com/android/server/am/BatteryStatsService.java @@ -16,9 +16,6 @@ package com.android.server.am; -import com.android.internal.app.IBatteryStats; -import com.android.internal.os.BatteryStatsImpl; - import android.content.Context; import android.os.Binder; import android.os.IBinder; @@ -26,8 +23,12 @@ import android.os.Parcel; import android.os.Process; import android.os.ServiceManager; import android.telephony.SignalStrength; +import android.telephony.TelephonyManager; import android.util.Log; +import com.android.internal.app.IBatteryStats; +import com.android.internal.os.BatteryStatsImpl; + import java.io.FileDescriptor; import java.io.PrintWriter; @@ -191,7 +192,14 @@ public final class BatteryStatsService extends IBatteryStats.Stub { mStats.notePhoneDataConnectionStateLocked(dataType, hasData); } } - + + public void noteAirplaneMode(boolean airplaneMode) { + enforceCallingPermission(); + synchronized (mStats) { + mStats.noteAirplaneModeLocked(airplaneMode); + } + } + public void noteWifiOn(int uid) { enforceCallingPermission(); synchronized (mStats) { |