summaryrefslogtreecommitdiffstats
path: root/services/java
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2012-04-06 11:12:08 -0700
committerJeff Sharkey <jsharkey@android.com>2012-04-06 13:38:29 -0700
commitb52e3e55098c4a6e3dbfe19885895411cfb38911 (patch)
tree2b40b88a64184c36d5a3794b8dab7450cc9d99eb /services/java
parent5713c9cfa9a0ed7625c8a48925a5c33b2c070460 (diff)
downloadframeworks_base-b52e3e55098c4a6e3dbfe19885895411cfb38911.zip
frameworks_base-b52e3e55098c4a6e3dbfe19885895411cfb38911.tar.gz
frameworks_base-b52e3e55098c4a6e3dbfe19885895411cfb38911.tar.bz2
INetworkStatsSession with lifecycle for caching.
Users outside system_server now explicitly communicate their lifecycle, which keeps a strong-reference chain to any fully loaded NetworkStatsCollection histories. Bug: 6236498 Change-Id: I8e22739b6e89a626b676967a736d7117fd000778
Diffstat (limited to 'services/java')
-rw-r--r--services/java/com/android/server/net/NetworkPolicyManagerService.java2
-rw-r--r--services/java/com/android/server/net/NetworkStatsRecorder.java5
-rw-r--r--services/java/com/android/server/net/NetworkStatsService.java94
3 files changed, 71 insertions, 30 deletions
diff --git a/services/java/com/android/server/net/NetworkPolicyManagerService.java b/services/java/com/android/server/net/NetworkPolicyManagerService.java
index b0657a6..77addd6 100644
--- a/services/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -1740,7 +1740,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
private long getTotalBytes(NetworkTemplate template, long start, long end) {
try {
- return mNetworkStats.getSummaryForNetwork(template, start, end).getTotalBytes();
+ return mNetworkStats.getNetworkTotalBytes(template, start, end);
} catch (RuntimeException e) {
Slog.w(TAG, "problem reading network stats: " + e);
return 0;
diff --git a/services/java/com/android/server/net/NetworkStatsRecorder.java b/services/java/com/android/server/net/NetworkStatsRecorder.java
index 290bd2c..540f606 100644
--- a/services/java/com/android/server/net/NetworkStatsRecorder.java
+++ b/services/java/com/android/server/net/NetworkStatsRecorder.java
@@ -221,6 +221,11 @@ public class NetworkStatsRecorder {
if (mLastSnapshot != null) {
mLastSnapshot = mLastSnapshot.withoutUid(uid);
}
+
+ final NetworkStatsCollection complete = mComplete != null ? mComplete.get() : null;
+ if (complete != null) {
+ complete.removeUid(uid);
+ }
}
/**
diff --git a/services/java/com/android/server/net/NetworkStatsService.java b/services/java/com/android/server/net/NetworkStatsService.java
index b847673..f7ba329 100644
--- a/services/java/com/android/server/net/NetworkStatsService.java
+++ b/services/java/com/android/server/net/NetworkStatsService.java
@@ -70,6 +70,7 @@ import android.content.IntentFilter;
import android.net.IConnectivityManager;
import android.net.INetworkManagementEventObserver;
import android.net.INetworkStatsService;
+import android.net.INetworkStatsSession;
import android.net.LinkProperties;
import android.net.NetworkIdentity;
import android.net.NetworkInfo;
@@ -412,40 +413,75 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
}
@Override
- public NetworkStatsHistory getHistoryForNetwork(NetworkTemplate template, int fields) {
- return mDevStatsCached.getHistory(template, UID_ALL, SET_ALL, TAG_NONE, fields);
- }
+ public INetworkStatsSession openSession() {
+ mContext.enforceCallingOrSelfPermission(READ_NETWORK_USAGE_HISTORY, TAG);
- @Override
- public NetworkStats getSummaryForNetwork(NetworkTemplate template, long start, long end) {
- return mDevStatsCached.getSummary(template, start, end);
- }
+ // return an IBinder which holds strong references to any loaded stats
+ // for its lifetime; when caller closes only weak references remain.
- @Override
- public NetworkStatsHistory getHistoryForUid(
- NetworkTemplate template, int uid, int set, int tag, int fields) {
- // TODO: transition to stats sessions to avoid WeakReferences
- if (tag == TAG_NONE) {
- return mUidRecorder.getOrLoadCompleteLocked().getHistory(
- template, uid, set, tag, fields);
- } else {
- return mUidTagRecorder.getOrLoadCompleteLocked().getHistory(
- template, uid, set, tag, fields);
- }
+ return new INetworkStatsSession.Stub() {
+ private NetworkStatsCollection mUidComplete;
+ private NetworkStatsCollection mUidTagComplete;
+
+ private NetworkStatsCollection getUidComplete() {
+ if (mUidComplete == null) {
+ mUidComplete = mUidRecorder.getOrLoadCompleteLocked();
+ }
+ return mUidComplete;
+ }
+
+ private NetworkStatsCollection getUidTagComplete() {
+ if (mUidTagComplete == null) {
+ mUidTagComplete = mUidTagRecorder.getOrLoadCompleteLocked();
+ }
+ return mUidTagComplete;
+ }
+
+ @Override
+ public NetworkStats getSummaryForNetwork(
+ NetworkTemplate template, long start, long end) {
+ return mDevStatsCached.getSummary(template, start, end);
+ }
+
+ @Override
+ public NetworkStatsHistory getHistoryForNetwork(NetworkTemplate template, int fields) {
+ return mDevStatsCached.getHistory(template, UID_ALL, SET_ALL, TAG_NONE, fields);
+ }
+
+ @Override
+ public NetworkStats getSummaryForAllUid(
+ NetworkTemplate template, long start, long end, boolean includeTags) {
+ final NetworkStats stats = getUidComplete().getSummary(template, start, end);
+ if (includeTags) {
+ final NetworkStats tagStats = getUidTagComplete()
+ .getSummary(template, start, end);
+ stats.combineAllValues(tagStats);
+ }
+ return stats;
+ }
+
+ @Override
+ public NetworkStatsHistory getHistoryForUid(
+ NetworkTemplate template, int uid, int set, int tag, int fields) {
+ if (tag == TAG_NONE) {
+ return getUidComplete().getHistory(template, uid, set, tag, fields);
+ } else {
+ return getUidTagComplete().getHistory(template, uid, set, tag, fields);
+ }
+ }
+
+ @Override
+ public void close() {
+ mUidComplete = null;
+ mUidTagComplete = null;
+ }
+ };
}
@Override
- public NetworkStats getSummaryForAllUid(
- NetworkTemplate template, long start, long end, boolean includeTags) {
- // TODO: transition to stats sessions to avoid WeakReferences
- final NetworkStats stats = mUidRecorder.getOrLoadCompleteLocked().getSummary(
- template, start, end);
- if (includeTags) {
- final NetworkStats tagStats = mUidTagRecorder.getOrLoadCompleteLocked().getSummary(
- template, start, end);
- stats.combineAllValues(tagStats);
- }
- return stats;
+ public long getNetworkTotalBytes(NetworkTemplate template, long start, long end) {
+ mContext.enforceCallingOrSelfPermission(READ_NETWORK_USAGE_HISTORY, TAG);
+ return mDevStatsCached.getSummary(template, start, end).getTotalBytes();
}
@Override