| // 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 |