diff options
-rw-r--r-- | lib/sanitizer_common/sanitizer_quarantine.h | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/lib/sanitizer_common/sanitizer_quarantine.h b/lib/sanitizer_common/sanitizer_quarantine.h index c06d518f0..ec90d2d68 100644 --- a/lib/sanitizer_common/sanitizer_quarantine.h +++ b/lib/sanitizer_common/sanitizer_quarantine.h @@ -89,9 +89,18 @@ class Quarantine { } } recycle_mutex_.Unlock(); - while (QuarantineBatch *b = tmp.DequeueBatch()) { - for (uptr i = 0; i < b->count; i++) + DoRecycle(&tmp, cb); + } + + void NOINLINE DoRecycle(Cache *c, Callback cb) { + while (QuarantineBatch *b = c->DequeueBatch()) { + const uptr kPrefetch = 16; + for (uptr i = 0; i < kPrefetch; i++) + PREFETCH(b->batch[i]); + for (uptr i = 0; i < b->count; i++) { + PREFETCH(b->batch[i + kPrefetch]); cb.Recycle((Node*)b->batch[i]); + } cb.Deallocate(b); } } |