| Index: content/browser/memory/memory_monitor_android.cc
|
| diff --git a/content/browser/memory/memory_monitor_android.cc b/content/browser/memory/memory_monitor_android.cc
|
| index 70c1e6dc4ca377cd3080b8545f38a1427a2b184b..ba73f7363bf5f30b91d711892f0381dc89c4f0b1 100644
|
| --- a/content/browser/memory/memory_monitor_android.cc
|
| +++ b/content/browser/memory/memory_monitor_android.cc
|
| @@ -7,12 +7,22 @@
|
| #include "base/android/context_utils.h"
|
| #include "base/android/jni_android.h"
|
| #include "base/memory/ptr_util.h"
|
| +#include "base/metrics/histogram_macros.h"
|
| +#include "content/browser/memory/memory_coordinator.h"
|
| #include "jni/MemoryMonitorAndroid_jni.h"
|
|
|
| namespace content {
|
|
|
| namespace {
|
| +
|
| const size_t kMBShift = 20;
|
| +
|
| +void RegisterComponentCallbacks() {
|
| + Java_MemoryMonitorAndroid_registerComponentCallbacks(
|
| + base::android::AttachCurrentThread(),
|
| + base::android::GetApplicationContext());
|
| +}
|
| +
|
| }
|
|
|
| // An implementation of MemoryMonitorAndroid::Delegate using the Android APIs.
|
| @@ -54,6 +64,34 @@ static void GetMemoryInfoCallback(
|
| info->total_mem = total_mem;
|
| }
|
|
|
| +// The maximum level of onTrimMemory (TRIM_MEMORY_COMPLETE).
|
| +const int kTrimMemoryLevelMax = 0x80;
|
| +
|
| +// Called by JNI.
|
| +static void OnTrimMemory(JNIEnv* env,
|
| + const base::android::JavaParamRef<jclass>& jcaller,
|
| + jint level) {
|
| + DCHECK(level >= 0 && level <= kTrimMemoryLevelMax);
|
| + auto state = MemoryCoordinator::GetInstance()->GetCurrentMemoryState();
|
| + switch (state) {
|
| + case base::MemoryState::NORMAL:
|
| + UMA_HISTOGRAM_ENUMERATION("Memory.Coordinator.TrimMemoryLevel.Normal",
|
| + level, kTrimMemoryLevelMax);
|
| + break;
|
| + case base::MemoryState::THROTTLED:
|
| + UMA_HISTOGRAM_ENUMERATION("Memory.Coordinator.TrimMemoryLevel.Throttled",
|
| + level, kTrimMemoryLevelMax);
|
| + break;
|
| + case base::MemoryState::SUSPENDED:
|
| + UMA_HISTOGRAM_ENUMERATION("Memory.Coordinator.TrimMemoryLevel.Suspended",
|
| + level, kTrimMemoryLevelMax);
|
| + break;
|
| + case base::MemoryState::UNKNOWN:
|
| + NOTREACHED();
|
| + break;
|
| + }
|
| +}
|
| +
|
| // static
|
| std::unique_ptr<MemoryMonitorAndroid> MemoryMonitorAndroid::Create() {
|
| auto delegate = base::WrapUnique(new MemoryMonitorAndroidDelegateImpl);
|
| @@ -68,6 +106,7 @@ bool MemoryMonitorAndroid::Register(JNIEnv* env) {
|
| MemoryMonitorAndroid::MemoryMonitorAndroid(std::unique_ptr<Delegate> delegate)
|
| : delegate_(std::move(delegate)) {
|
| DCHECK(delegate_.get());
|
| + RegisterComponentCallbacks();
|
| }
|
|
|
| MemoryMonitorAndroid::~MemoryMonitorAndroid() {}
|
|
|