Fix native allocation watermark clamping.
The main issue causing the test to fail is that
native_footprint_gc_watermark_ becoming > growth_limit_ due to no
clamping.
Temporary runFinalization fix is calling runFinalization 2x.
Bug: 17371542
(cherry picked from commit 4c7fc5950853b0c368e2148db77ced7c4d3c303c)
Change-Id: I05b85e95560c32c33d53bc96abf87d5262007395
diff --git a/runtime/gc/heap.cc b/runtime/gc/heap.cc
index 78ef7ac..5d0d8d2 100644
--- a/runtime/gc/heap.cc
+++ b/runtime/gc/heap.cc
@@ -2829,7 +2829,7 @@
} else if (target_size < native_size + min_free_) {
target_size = native_size + min_free_;
}
- native_footprint_gc_watermark_ = target_size;
+ native_footprint_gc_watermark_ = std::min(growth_limit_, target_size);
}
collector::GarbageCollector* Heap::FindCollectorByGcType(collector::GcType gc_type) {
@@ -3083,9 +3083,11 @@
}
env->CallStaticVoidMethod(WellKnownClasses::java_lang_System,
WellKnownClasses::java_lang_System_runFinalization);
+ env->CallStaticVoidMethod(WellKnownClasses::java_lang_System,
+ WellKnownClasses::java_lang_System_runFinalization);
}
-void Heap::RegisterNativeAllocation(JNIEnv* env, int bytes) {
+void Heap::RegisterNativeAllocation(JNIEnv* env, size_t bytes) {
Thread* self = ThreadForEnv(env);
if (native_need_to_run_finalization_) {
RunFinalization(env);
@@ -3127,19 +3129,19 @@
}
}
-void Heap::RegisterNativeFree(JNIEnv* env, int bytes) {
- int expected_size, new_size;
+void Heap::RegisterNativeFree(JNIEnv* env, size_t bytes) {
+ size_t expected_size;
do {
expected_size = native_bytes_allocated_.LoadRelaxed();
- new_size = expected_size - bytes;
- if (UNLIKELY(new_size < 0)) {
+ if (UNLIKELY(bytes > expected_size)) {
ScopedObjectAccess soa(env);
env->ThrowNew(WellKnownClasses::java_lang_RuntimeException,
- StringPrintf("Attempted to free %d native bytes with only %d native bytes "
+ StringPrintf("Attempted to free %zd native bytes with only %zd native bytes "
"registered as allocated", bytes, expected_size).c_str());
break;
}
- } while (!native_bytes_allocated_.CompareExchangeWeakRelaxed(expected_size, new_size));
+ } while (!native_bytes_allocated_.CompareExchangeWeakRelaxed(expected_size,
+ expected_size - bytes));
}
size_t Heap::GetTotalMemory() const {