am 5804b4fd: Merge "StrictMode: check max-offenses-per-loop earlier, before allocations" into gingerbread
Merge commit '5804b4fd47bbeda55d12bd7dd6ae3bde72fb40a0' into gingerbread-plus-aosp * commit '5804b4fd47bbeda55d12bd7dd6ae3bde72fb40a0': StrictMode: check max-offenses-per-loop earlier, before allocations
This commit is contained in:
@@ -104,6 +104,10 @@ public final class StrictMode {
|
|||||||
// Only show an annoying dialog at most every 30 seconds
|
// Only show an annoying dialog at most every 30 seconds
|
||||||
private static final long MIN_DIALOG_INTERVAL_MS = 30000;
|
private static final long MIN_DIALOG_INTERVAL_MS = 30000;
|
||||||
|
|
||||||
|
// How many offending stacks to keep track of (and time) per loop
|
||||||
|
// of the Looper.
|
||||||
|
private static final int MAX_OFFENSES_PER_LOOP = 10;
|
||||||
|
|
||||||
// Thread-policy:
|
// Thread-policy:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -680,6 +684,17 @@ public final class StrictMode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final ThreadLocal<ArrayList<ViolationInfo>> violationsBeingTimed =
|
||||||
|
new ThreadLocal<ArrayList<ViolationInfo>>() {
|
||||||
|
@Override protected ArrayList<ViolationInfo> initialValue() {
|
||||||
|
return new ArrayList<ViolationInfo>();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private static boolean tooManyViolationsThisLoop() {
|
||||||
|
return violationsBeingTimed.get().size() >= MAX_OFFENSES_PER_LOOP;
|
||||||
|
}
|
||||||
|
|
||||||
private static class AndroidBlockGuardPolicy implements BlockGuard.Policy {
|
private static class AndroidBlockGuardPolicy implements BlockGuard.Policy {
|
||||||
private int mPolicyMask;
|
private int mPolicyMask;
|
||||||
|
|
||||||
@@ -707,6 +722,9 @@ public final class StrictMode {
|
|||||||
if ((mPolicyMask & DETECT_DISK_WRITE) == 0) {
|
if ((mPolicyMask & DETECT_DISK_WRITE) == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (tooManyViolationsThisLoop()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
BlockGuard.BlockGuardPolicyException e = new StrictModeDiskWriteViolation(mPolicyMask);
|
BlockGuard.BlockGuardPolicyException e = new StrictModeDiskWriteViolation(mPolicyMask);
|
||||||
e.fillInStackTrace();
|
e.fillInStackTrace();
|
||||||
startHandlingViolationException(e);
|
startHandlingViolationException(e);
|
||||||
@@ -717,6 +735,9 @@ public final class StrictMode {
|
|||||||
if ((mPolicyMask & DETECT_DISK_READ) == 0) {
|
if ((mPolicyMask & DETECT_DISK_READ) == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (tooManyViolationsThisLoop()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
BlockGuard.BlockGuardPolicyException e = new StrictModeDiskReadViolation(mPolicyMask);
|
BlockGuard.BlockGuardPolicyException e = new StrictModeDiskReadViolation(mPolicyMask);
|
||||||
e.fillInStackTrace();
|
e.fillInStackTrace();
|
||||||
startHandlingViolationException(e);
|
startHandlingViolationException(e);
|
||||||
@@ -727,6 +748,9 @@ public final class StrictMode {
|
|||||||
if ((mPolicyMask & DETECT_NETWORK) == 0) {
|
if ((mPolicyMask & DETECT_NETWORK) == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (tooManyViolationsThisLoop()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
BlockGuard.BlockGuardPolicyException e = new StrictModeNetworkViolation(mPolicyMask);
|
BlockGuard.BlockGuardPolicyException e = new StrictModeNetworkViolation(mPolicyMask);
|
||||||
e.fillInStackTrace();
|
e.fillInStackTrace();
|
||||||
startHandlingViolationException(e);
|
startHandlingViolationException(e);
|
||||||
@@ -747,13 +771,6 @@ public final class StrictMode {
|
|||||||
handleViolationWithTimingAttempt(info);
|
handleViolationWithTimingAttempt(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final ThreadLocal<ArrayList<ViolationInfo>> violationsBeingTimed =
|
|
||||||
new ThreadLocal<ArrayList<ViolationInfo>>() {
|
|
||||||
@Override protected ArrayList<ViolationInfo> initialValue() {
|
|
||||||
return new ArrayList<ViolationInfo>();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Attempts to fill in the provided ViolationInfo's
|
// Attempts to fill in the provided ViolationInfo's
|
||||||
// durationMillis field if this thread has a Looper we can use
|
// durationMillis field if this thread has a Looper we can use
|
||||||
// to measure with. We measure from the time of violation
|
// to measure with. We measure from the time of violation
|
||||||
@@ -780,7 +797,7 @@ public final class StrictMode {
|
|||||||
|
|
||||||
MessageQueue queue = Looper.myQueue();
|
MessageQueue queue = Looper.myQueue();
|
||||||
final ArrayList<ViolationInfo> records = violationsBeingTimed.get();
|
final ArrayList<ViolationInfo> records = violationsBeingTimed.get();
|
||||||
if (records.size() >= 10) {
|
if (records.size() >= MAX_OFFENSES_PER_LOOP) {
|
||||||
// Not worth measuring. Too many offenses in one loop.
|
// Not worth measuring. Too many offenses in one loop.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user