Throw BinderProxyMapSizeException when hitting limits.

To make it easier to cluster these errors.

Test: N/A
Change-Id: Id967c1d537ca655df2363bf38a798d632bf1b160
This commit is contained in:
Martijn Coenen
2021-07-06 10:03:38 +02:00
parent 3d6a8d31e1
commit d4f9da0795

View File

@@ -53,6 +53,12 @@ public final class BinderProxy implements IBinder {
private static volatile Binder.ProxyTransactListener sTransactListener = null;
private static class BinderProxyMapSizeException extends AssertionError {
BinderProxyMapSizeException(String s) {
super(s);
}
};
/**
* @see {@link Binder#setProxyTransactListener(listener)}.
*/
@@ -73,7 +79,10 @@ public final class BinderProxy implements IBinder {
private static final int LOG_MAIN_INDEX_SIZE = 8;
private static final int MAIN_INDEX_SIZE = 1 << LOG_MAIN_INDEX_SIZE;
private static final int MAIN_INDEX_MASK = MAIN_INDEX_SIZE - 1;
// Debuggable builds will throw an AssertionError if the number of map entries exceeds:
/**
* Debuggable builds will throw an BinderProxyMapSizeException if the number of
* map entries exceeds:
*/
private static final int CRASH_AT_SIZE = 20_000;
/**
@@ -228,7 +237,8 @@ public final class BinderProxy implements IBinder {
dumpProxyInterfaceCounts();
dumpPerUidProxyCounts();
Runtime.getRuntime().gc();
throw new AssertionError("Binder ProxyMap has too many entries: "
throw new BinderProxyMapSizeException(
"Binder ProxyMap has too many entries: "
+ totalSize + " (total), " + totalUnclearedSize + " (uncleared), "
+ unclearedSize() + " (uncleared after GC). BinderProxy leak?");
} else if (totalSize > 3 * totalUnclearedSize / 2) {