| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef BASE_MEMORY_MEMORY_PRESSURE_MONITOR_MAC_H_ |
| #define BASE_MEMORY_MEMORY_PRESSURE_MONITOR_MAC_H_ |
| |
| #include <CoreFoundation/CFDate.h> |
| #include <dispatch/dispatch.h> |
| |
| #include "base/base_export.h" |
| #include "base/mac/scoped_cftyperef.h" |
| #include "base/mac/scoped_dispatch_object.h" |
| #include "base/macros.h" |
| #include "base/memory/memory_pressure_listener.h" |
| #include "base/memory/memory_pressure_monitor.h" |
| #include "base/message_loop/message_pump_mac.h" |
| #include "starboard/types.h" |
| |
| namespace base { |
| namespace mac { |
| |
| class TestMemoryPressureMonitor; |
| |
| // Declares the interface for the Mac MemoryPressureMonitor, which reports |
| // memory pressure events and status. |
| class BASE_EXPORT MemoryPressureMonitor : public base::MemoryPressureMonitor { |
| public: |
| MemoryPressureMonitor(); |
| ~MemoryPressureMonitor() override; |
| |
| // Returns the currently-observed memory pressure. |
| MemoryPressureLevel GetCurrentPressureLevel() override; |
| |
| void SetDispatchCallback(const DispatchCallback& callback) override; |
| |
| private: |
| friend TestMemoryPressureMonitor; |
| |
| static MemoryPressureLevel MemoryPressureLevelForMacMemoryPressureLevel( |
| int mac_memory_pressure_level); |
| static void OnRunLoopExit(CFRunLoopObserverRef observer, |
| CFRunLoopActivity activity, |
| void* info); |
| // Returns the raw memory pressure level from the macOS. Exposed for |
| // unit testing. |
| virtual int GetMacMemoryPressureLevel(); |
| |
| // Updates |last_pressure_level_| with the current memory pressure level. |
| void UpdatePressureLevel(); |
| |
| // Updates |last_pressure_level_| at the end of every run loop pass (modulo |
| // some number of seconds). |
| void UpdatePressureLevelOnRunLoopExit(); |
| |
| // Run |dispatch_callback| on memory pressure notifications from the OS. |
| void OnMemoryPressureChanged(dispatch_source_s* event_source, |
| const DispatchCallback& dispatch_callback); |
| |
| // Returns the number of seconds per UMA tick (for statistics recording). |
| // Exposed for testing. |
| static int GetSecondsPerUMATick(); |
| |
| // The dispatch source that generates memory pressure change notifications. |
| ScopedDispatchObject<dispatch_source_t> memory_level_event_source_; |
| |
| // The callback to call upon receiving a memory pressure change notification. |
| DispatchCallback dispatch_callback_; |
| |
| // Last UMA report time. |
| CFTimeInterval last_statistic_report_time_; |
| |
| // Most-recent memory pressure level. |
| MemoryPressureLevel last_pressure_level_; |
| |
| // Observer that tracks exits from the main run loop. |
| ScopedCFTypeRef<CFRunLoopObserverRef> exit_observer_; |
| |
| // Next time to update the memory pressure level when exiting the run loop. |
| CFTimeInterval next_run_loop_update_time_; |
| |
| // Seconds left over from the last UMA tick calculation (to be added to the |
| // next calculation). |
| CFTimeInterval subtick_seconds_; |
| |
| DISALLOW_COPY_AND_ASSIGN(MemoryPressureMonitor); |
| }; |
| |
| } // namespace mac |
| } // namespace base |
| |
| #endif // BASE_MEMORY_MEMORY_PRESSURE_MONITOR_MAC_H_ |