Don't allow negative GetFreeMemory.
The max allowed footprint is only updated after the GC. But we can
still allocate even if bytes_allocated > max_allowed_footprint_.
This means that we used to be able to get a negative value if
bytes_allocated > max_allowed_footprint_.
External bug:
https://code.google.com/p/android/issues/detail?id=72221
Change-Id: I4ef9a534e29211786e82cdcb2582c11ab37a348a
diff --git a/runtime/gc/heap.h b/runtime/gc/heap.h
index a34cd38..6d70a38 100644
--- a/runtime/gc/heap.h
+++ b/runtime/gc/heap.h
@@ -417,7 +417,10 @@
// Implements java.lang.Runtime.freeMemory.
size_t GetFreeMemory() const {
- return max_allowed_footprint_ - num_bytes_allocated_.LoadSequentiallyConsistent();
+ size_t byte_allocated = num_bytes_allocated_.LoadSequentiallyConsistent();
+ // Make sure we don't get a negative number since the max allowed footprint is only updated
+ // after the GC. But we can still allocate even if bytes_allocated > max_allowed_footprint_.
+ return std::max(max_allowed_footprint_, byte_allocated) - byte_allocated;
}
// get the space that corresponds to an object's address. Current implementation searches all