summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVarun Shah <varunshah@google.com>2019-12-06 17:26:41 -0800
committerVarun Shah <varunshah@google.com>2019-12-06 17:26:41 -0800
commit6b993a7408b64e9bf09cfa1a626f94752d6ed7f0 (patch)
tree5615106c779a6820663a3f7c459e52721864b265
parent55ae88164962ee6f139b9580cc829cb10afe212f (diff)
Ensure UsageStats data is read correctly.
Add documentation that the IntervalStats object passed into the read methods in UsageStatsDatabase should ideally be used only as a temporary reading object unless the caller specifically has other use-cases. Also updated all the internal calls to match this behavior. Bug: n/a Test: atest UsageStatsDatabaseTest Change-Id: Id3aa2575fa29bf5adc6a52ee8e75690aecf50b8e
-rw-r--r--services/usage/java/com/android/server/usage/UsageStatsDatabase.java17
1 files changed, 15 insertions, 2 deletions
diff --git a/services/usage/java/com/android/server/usage/UsageStatsDatabase.java b/services/usage/java/com/android/server/usage/UsageStatsDatabase.java
index 1996dd4f6545..ef9a73b794f7 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsDatabase.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsDatabase.java
@@ -229,8 +229,8 @@ public class UsageStatsDatabase {
}
try {
- IntervalStats stats = new IntervalStats();
for (int i = start; i < fileCount - 1; i++) {
+ final IntervalStats stats = new IntervalStats();
readLocked(files.valueAt(i), stats);
if (!checkinAction.checkin(stats)) {
return false;
@@ -848,10 +848,10 @@ public class UsageStatsDatabase {
}
}
- final IntervalStats stats = new IntervalStats();
final ArrayList<T> results = new ArrayList<>();
for (int i = startIndex; i <= endIndex; i++) {
final AtomicFile f = intervalStats.valueAt(i);
+ final IntervalStats stats = new IntervalStats();
if (DEBUG) {
Slog.d(TAG, "Reading stat file " + f.getBaseFile().getAbsolutePath());
@@ -1061,6 +1061,11 @@ public class UsageStatsDatabase {
}
}
+ /**
+ * Note: the data read from the given file will add to the IntervalStats object passed into this
+ * method. It is up to the caller to ensure that this is the desired behavior - if not, the
+ * caller should ensure that the data in the reused object is being cleared.
+ */
private void readLocked(AtomicFile file, IntervalStats statsOut)
throws IOException, RuntimeException {
if (mCurrentVersion <= 3) {
@@ -1072,6 +1077,10 @@ public class UsageStatsDatabase {
/**
* Returns {@code true} if any stats were omitted while reading, {@code false} otherwise.
+ * <p/>
+ * Note: the data read from the given file will add to the IntervalStats object passed into this
+ * method. It is up to the caller to ensure that this is the desired behavior - if not, the
+ * caller should ensure that the data in the reused object is being cleared.
*/
private static boolean readLocked(AtomicFile file, IntervalStats statsOut, int version,
PackagesTokenData packagesTokenData) throws IOException, RuntimeException {
@@ -1098,6 +1107,10 @@ public class UsageStatsDatabase {
/**
* Returns {@code true} if any stats were omitted while reading, {@code false} otherwise.
+ * <p/>
+ * Note: the data read from the given file will add to the IntervalStats object passed into this
+ * method. It is up to the caller to ensure that this is the desired behavior - if not, the
+ * caller should ensure that the data in the reused object is being cleared.
*/
private static boolean readLocked(InputStream in, IntervalStats statsOut, int version,
PackagesTokenData packagesTokenData) throws RuntimeException {