Merge change 5171 into donut

* changes:
  Track native processes and airplane mode.
This commit is contained in:
Android (Google) Code Review
2009-06-24 15:21:16 -07:00
6 changed files with 83 additions and 13 deletions

View File

@@ -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();

View File

@@ -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.
@@ -2807,6 +2830,26 @@ public final class BatteryStatsImpl extends BatteryStats {
return u.getProcessStatsLocked(name);
}
/**
* 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.

View File

@@ -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];
}

View File

@@ -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);

View File

@@ -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();

View File

@@ -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) {