diff options
Diffstat (limited to 'lib/sanitizer_common/sanitizer_quarantine.h')
-rw-r--r-- | lib/sanitizer_common/sanitizer_quarantine.h | 32 |
1 files changed, 9 insertions, 23 deletions
diff --git a/lib/sanitizer_common/sanitizer_quarantine.h b/lib/sanitizer_common/sanitizer_quarantine.h index 1a0d9545b..3d74ef2b6 100644 --- a/lib/sanitizer_common/sanitizer_quarantine.h +++ b/lib/sanitizer_common/sanitizer_quarantine.h @@ -49,31 +49,18 @@ class Quarantine { } void Init(uptr size, uptr cache_size) { - // Thread local quarantine size can be zero only when global quarantine size - // is zero (it allows us to perform just one atomic read per Put() call). - CHECK((size == 0 && cache_size == 0) || cache_size != 0); - - atomic_store(&max_size_, size, memory_order_relaxed); + atomic_store(&max_size_, size, memory_order_release); atomic_store(&min_size_, size / 10 * 9, - memory_order_relaxed); // 90% of max size. - atomic_store(&max_cache_size_, cache_size, memory_order_relaxed); + memory_order_release); // 90% of max size. + max_cache_size_ = cache_size; } - uptr GetSize() const { return atomic_load(&max_size_, memory_order_relaxed); } - uptr GetCacheSize() const { - return atomic_load(&max_cache_size_, memory_order_relaxed); - } + uptr GetSize() const { return atomic_load(&max_size_, memory_order_acquire); } + uptr GetCacheSize() const { return max_cache_size_; } void Put(Cache *c, Callback cb, Node *ptr, uptr size) { - uptr cache_size = GetCacheSize(); - if (cache_size) { - c->Enqueue(cb, ptr, size); - } else { - // cache_size == 0 only when size == 0 (see Init). - cb.Recycle(ptr); - } - // Check cache size anyway to accommodate for runtime cache_size change. - if (c->Size() > cache_size) + c->Enqueue(cb, ptr, size); + if (c->Size() > max_cache_size_) Drain(c, cb); } @@ -96,7 +83,7 @@ class Quarantine { char pad0_[kCacheLineSize]; atomic_uintptr_t max_size_; atomic_uintptr_t min_size_; - atomic_uintptr_t max_cache_size_; + uptr max_cache_size_; char pad1_[kCacheLineSize]; SpinMutex cache_mutex_; SpinMutex recycle_mutex_; @@ -105,7 +92,7 @@ class Quarantine { void NOINLINE Recycle(Callback cb) { Cache tmp; - uptr min_size = atomic_load(&min_size_, memory_order_relaxed); + uptr min_size = atomic_load(&min_size_, memory_order_acquire); { SpinMutexLock l(&cache_mutex_); while (cache_.Size() > min_size) { @@ -218,7 +205,6 @@ class QuarantineCache { return b; } }; - } // namespace __sanitizer #endif // SANITIZER_QUARANTINE_H |