Merge "Avoid ANRs in dumpCacheInfo" into tm-dev am: 8dc0bab75e am: 50ee494d30

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/18717283

Change-Id: I6b68521b6692ff796e47f3cd2a394307a113ef1e
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Lee Shombert
2022-06-07 23:17:48 +00:00
committed by Automerger Merge Worker

View File

@@ -33,6 +33,7 @@ import com.android.internal.util.FastPrintWriter;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
@@ -1444,7 +1445,6 @@ public class PropertyInvalidatedCache<Query, Result> {
mCache.size(), mMaxEntries, mHighWaterMark, mMissOverflow)); mCache.size(), mMaxEntries, mHighWaterMark, mMissOverflow));
pw.println(TextUtils.formatSimple(" Enabled: %s", mDisabled ? "false" : "true")); pw.println(TextUtils.formatSimple(" Enabled: %s", mDisabled ? "false" : "true"));
pw.println(""); pw.println("");
pw.flush();
// No specific cache was requested. This is the default, and no details // No specific cache was requested. This is the default, and no details
// should be dumped. // should be dumped.
@@ -1463,7 +1463,6 @@ public class PropertyInvalidatedCache<Query, Result> {
pw.println(TextUtils.formatSimple(" Key: %s\n Value: %s\n", key, value)); pw.println(TextUtils.formatSimple(" Key: %s\n Value: %s\n", key, value));
} }
pw.flush();
} }
} }
@@ -1488,13 +1487,8 @@ public class PropertyInvalidatedCache<Query, Result> {
* provided ParcelFileDescriptor. Optional switches allow the caller to choose * provided ParcelFileDescriptor. Optional switches allow the caller to choose
* specific caches (selection is by cache name or property name); if these switches * specific caches (selection is by cache name or property name); if these switches
* are used then the output includes both cache statistics and cache entries. * are used then the output includes both cache statistics and cache entries.
* @hide
*/ */
public static void dumpCacheInfo(@NonNull ParcelFileDescriptor pfd, @NonNull String[] args) { private static void dumpCacheInfo(@NonNull PrintWriter pw, @NonNull String[] args) {
try (
FileOutputStream fout = new FileOutputStream(pfd.getFileDescriptor());
PrintWriter pw = new FastPrintWriter(fout);
) {
if (!sEnabled) { if (!sEnabled) {
pw.println(" Caching is disabled in this process."); pw.println(" Caching is disabled in this process.");
return; return;
@@ -1516,6 +1510,31 @@ public class PropertyInvalidatedCache<Query, Result> {
PropertyInvalidatedCache currentCache = activeCaches.get(i); PropertyInvalidatedCache currentCache = activeCaches.get(i);
currentCache.dumpContents(pw, detail, args); currentCache.dumpContents(pw, detail, args);
} }
}
/**
* Without arguments, this dumps statistics from every cache in the process to the
* provided ParcelFileDescriptor. Optional switches allow the caller to choose
* specific caches (selection is by cache name or property name); if these switches
* are used then the output includes both cache statistics and cache entries.
* @hide
*/
public static void dumpCacheInfo(@NonNull ParcelFileDescriptor pfd, @NonNull String[] args) {
// Create a PrintWriter that uses a byte array. The code can safely write to
// this array without fear of blocking. The completed byte array will be sent
// to the caller after all the data has been collected and all locks have been
// released.
ByteArrayOutputStream barray = new ByteArrayOutputStream();
PrintWriter bout = new PrintWriter(barray);
dumpCacheInfo(bout, args);
bout.close();
try {
// Send the final byte array to the output. This happens outside of all locks.
var out = new FileOutputStream(pfd.getFileDescriptor());
barray.writeTo(out);
out.close();
barray.close();
} catch (IOException e) { } catch (IOException e) {
Log.e(TAG, "Failed to dump PropertyInvalidatedCache instances"); Log.e(TAG, "Failed to dump PropertyInvalidatedCache instances");
} }