| // Copyright 2019 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. |
| |
| #include "src/developer/memory/metrics/watcher.h" |
| |
| #include <lib/async/cpp/task.h> |
| #include <lib/trace/event.h> |
| #include <lib/zx/time.h> |
| #include <stdio.h> |
| #include <unistd.h> |
| |
| namespace memory { |
| |
| Watcher::Watcher(zx::duration poll_frequency, uint64_t high_water_threshold, |
| async_dispatcher_t* dispatcher, CaptureFn capture_cb, HighWaterFn high_water_cb) |
| : least_free_bytes_(UINT64_MAX), |
| poll_frequency_(poll_frequency), |
| high_water_threshold_(high_water_threshold), |
| dispatcher_(dispatcher), |
| capture_cb_(std::move(capture_cb)), |
| high_water_cb_(std::move(high_water_cb)) { |
| task_.PostDelayed(dispatcher_, zx::usec(1)); |
| } |
| |
| void Watcher::CaptureMemory() { |
| TRACE_DURATION("memory_metrics", "Watcher::CaptureMemory"); |
| Capture c; |
| capture_cb_(&c, KMEM); |
| auto free_bytes = c.kmem().free_bytes; |
| if ((free_bytes + high_water_threshold_) <= least_free_bytes_) { |
| // Note: memory could have changed between the two captures, so we check |
| // again. |
| capture_cb_(&c, VMO); |
| free_bytes = c.kmem().free_bytes; |
| if ((free_bytes + high_water_threshold_) <= least_free_bytes_) { |
| least_free_bytes_ = free_bytes; |
| high_water_cb_(c); |
| } |
| } |
| task_.PostDelayed(dispatcher_, poll_frequency_); |
| } |
| |
| } // namespace memory |