diff options
author | Kostya Serebryany <kcc@google.com> | 2015-01-06 23:53:32 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2015-01-06 23:53:32 +0000 |
commit | df867df2d3da7451984333ebcb6b4040dbcda164 (patch) | |
tree | 744c0312ff145463e55028d3c01d025a9e073f7f /lib/sanitizer_common/sanitizer_allocator.h | |
parent | 001d038609ab5b91e1e4afa5dc0bf5d5437a2f95 (diff) | |
download | compiler-rt-df867df2d3da7451984333ebcb6b4040dbcda164.tar.gz |
[asan] add a flag soft_rss_limit_mb
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@225323 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common/sanitizer_allocator.h')
-rw-r--r-- | lib/sanitizer_common/sanitizer_allocator.h | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/lib/sanitizer_common/sanitizer_allocator.h b/lib/sanitizer_common/sanitizer_allocator.h index d749acb90..8ff3f20f1 100644 --- a/lib/sanitizer_common/sanitizer_allocator.h +++ b/lib/sanitizer_common/sanitizer_allocator.h @@ -1279,12 +1279,14 @@ class CombinedAllocator { } void *Allocate(AllocatorCache *cache, uptr size, uptr alignment, - bool cleared = false) { + bool cleared = false, bool check_rss_limit = false) { // Returning 0 on malloc(0) may break a lot of code. if (size == 0) size = 1; if (size + alignment < size) return ReturnNullOrDie(); + if (check_rss_limit && RssLimitIsExceeded()) + return ReturnNullOrDie(); if (alignment > 8) size = RoundUpTo(size, alignment); void *res; @@ -1315,6 +1317,15 @@ class CombinedAllocator { atomic_store(&may_return_null_, may_return_null, memory_order_release); } + bool RssLimitIsExceeded() { + return atomic_load(&rss_limit_is_exceeded_, memory_order_release); + } + + void SetRssLimitIsExceeded(bool rss_limit_is_exceeded) { + atomic_store(&rss_limit_is_exceeded_, rss_limit_is_exceeded, + memory_order_release); + } + void Deallocate(AllocatorCache *cache, void *p) { if (!p) return; if (primary_.PointerIsMine(p)) @@ -1428,6 +1439,7 @@ class CombinedAllocator { SecondaryAllocator secondary_; AllocatorGlobalStats stats_; atomic_uint8_t may_return_null_; + atomic_uint8_t rss_limit_is_exceeded_; }; // Returns true if calloc(size, n) should return 0 due to overflow in size*n. |