| // Copyright 2020 The Fuchsia 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 SRC_DEVELOPER_MEMORY_MONITOR_PRESSURE_NOTIFIER_H_ |
| #define SRC_DEVELOPER_MEMORY_MONITOR_PRESSURE_NOTIFIER_H_ |
| |
| #include <fuchsia/feedback/cpp/fidl.h> |
| #include <fuchsia/memorypressure/cpp/fidl.h> |
| #include <lib/fidl/cpp/binding_set.h> |
| #include <lib/sys/cpp/component_context.h> |
| |
| #include <vector> |
| |
| #include "src/developer/memory/monitor/pressure_observer.h" |
| |
| namespace monitor { |
| |
| struct WatcherState { |
| fuchsia::memorypressure::WatcherPtr proxy; |
| Level level_sent; |
| bool pending_callback; |
| bool needs_free; |
| }; |
| |
| class PressureNotifier : public fuchsia::memorypressure::Provider { |
| public: |
| explicit PressureNotifier(bool watch_for_changes, bool send_critical_pressure_crash_reports, |
| sys::ComponentContext* context = nullptr, |
| async_dispatcher_t* dispatcher = nullptr); |
| PressureNotifier(const PressureNotifier&) = delete; |
| PressureNotifier& operator=(const PressureNotifier&) = delete; |
| |
| // fuchsia::memorypressure::Provider interface |
| void RegisterWatcher(fidl::InterfaceHandle<fuchsia::memorypressure::Watcher> watcher) override; |
| |
| void Notify(); |
| |
| private: |
| void PostLevelChange(); |
| void ReleaseWatcher(fuchsia::memorypressure::Watcher* watcher); |
| void OnLevelChangedCallback(WatcherState* watcher); |
| void NotifyWatcher(WatcherState* watcher, Level level); |
| fuchsia::memorypressure::Level ConvertLevel(Level level) const; |
| |
| bool CanGenerateNewCrashReports(); |
| void FileCrashReport(); |
| |
| async::TaskClosureMethod<PressureNotifier, &PressureNotifier::PostLevelChange> post_task_{this}; |
| async_dispatcher_t* const provider_dispatcher_; |
| sys::ComponentContext* const context_; |
| fidl::BindingSet<fuchsia::memorypressure::Provider> bindings_; |
| std::vector<std::unique_ptr<WatcherState>> watchers_; |
| PressureObserver observer_; |
| |
| bool observed_normal_level_ = true; |
| zx::time prev_crash_report_time_ = zx::time(ZX_TIME_INFINITE_PAST); |
| zx::duration crash_report_interval_ = zx::min(30); |
| const bool send_critical_pressure_crash_reports_; |
| |
| friend class test::PressureNotifierUnitTest; |
| }; |
| |
| } // namespace monitor |
| |
| #endif // SRC_DEVELOPER_MEMORY_MONITOR_PRESSURE_NOTIFIER_H_ |