OLD | NEW |
(Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #import "ios/chrome/app/application_delegate/memory_warning_helper.h" |
| 6 |
| 7 #include "base/memory/memory_pressure_listener.h" |
| 8 #include "base/metrics/histogram.h" |
| 9 #include "ios/chrome/browser/crash_report/breakpad_helper.h" |
| 10 #import "ios/chrome/browser/metrics/previous_session_info.h" |
| 11 |
| 12 namespace { |
| 13 // The number of seconds to wait after a memory warning to clear the flag used |
| 14 // to detect Out Of Memory crashes. |
| 15 // NOTE: From local tests on various devices, this interval ranges between 1 and |
| 16 // 3 seconds. It is set to 5 to ensure all out of memory crashes are identified, |
| 17 // even if this may lead to overcounting them. |
| 18 const CFTimeInterval kOutOfMemoryResetTimeInterval = 5; |
| 19 } |
| 20 |
| 21 @interface MemoryWarningHelper () { |
| 22 // The time at which to reset the OOM crash flag in the user defaults. This |
| 23 // is used to handle receiving multiple memory warnings in short |
| 24 // succession. |
| 25 CFAbsoluteTime _outOfMemoryResetTime; |
| 26 } |
| 27 // Resets the OOM crash flag from the user defaults. |
| 28 - (void)resetOutOfMemoryFlagIfNecessary; |
| 29 @end |
| 30 |
| 31 @implementation MemoryWarningHelper |
| 32 |
| 33 @synthesize foregroundMemoryWarningCount = _foregroundMemoryWarningCount; |
| 34 |
| 35 - (void)handleMemoryPressure { |
| 36 // Notify the system that the memory is critical and something should be done. |
| 37 base::MemoryPressureListener::NotifyMemoryPressure( |
| 38 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL); |
| 39 |
| 40 ++_foregroundMemoryWarningCount; |
| 41 // Register that we might die because of memory. If we are still alive in |
| 42 // |kOutOfMemoryResetTimeInterval| seconds, reset the flag. |
| 43 [[PreviousSessionInfo sharedInstance] setMemoryWarningFlag]; |
| 44 _outOfMemoryResetTime = |
| 45 CFAbsoluteTimeGetCurrent() + kOutOfMemoryResetTimeInterval; |
| 46 |
| 47 // Add information to breakpad. |
| 48 breakpad_helper::SetMemoryWarningCount(_foregroundMemoryWarningCount); |
| 49 breakpad_helper::SetMemoryWarningInProgress(true); |
| 50 |
| 51 dispatch_after(kOutOfMemoryResetTimeInterval, dispatch_get_main_queue(), ^{ |
| 52 [self resetOutOfMemoryFlagIfNecessary]; |
| 53 }); |
| 54 } |
| 55 |
| 56 - (void)resetOutOfMemoryFlagIfNecessary { |
| 57 if (CFAbsoluteTimeGetCurrent() < _outOfMemoryResetTime) |
| 58 return; |
| 59 _outOfMemoryResetTime = 0; |
| 60 [[PreviousSessionInfo sharedInstance] resetMemoryWarningFlag]; |
| 61 breakpad_helper::SetMemoryWarningInProgress(false); |
| 62 } |
| 63 |
| 64 - (void)resetForegroundMemoryWarningCount { |
| 65 _foregroundMemoryWarningCount = 0; |
| 66 } |
| 67 |
| 68 @end |
OLD | NEW |