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:
Brad Fitzpatrick
2010-10-11 12:05:14 -07:00
committed by Android Git Automerger

View File

@@ -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;
} }