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