// Copyright 2018 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.

// This file contains a helper for gathering metrics timing info.

#ifndef SRC_STORAGE_LIB_VFS_CPP_TICKER_H_
#define SRC_STORAGE_LIB_VFS_CPP_TICKER_H_

#ifdef __Fuchsia__
#include <lib/zx/time.h>
#endif

// Compile-time option to enable metrics collection globally. On by default.
#define ENABLE_METRICS

#if defined(__Fuchsia__) && defined(ENABLE_METRICS)
#define FS_WITH_METRICS
#endif

namespace fs {

#ifdef FS_WITH_METRICS

// Helper class for getting the duration of events.
using Duration = zx::ticks;

class Ticker {
 public:
  explicit Ticker() : ticks_(zx::ticks::now()) {}

  // Returns the time since the Ticker was constructed.
  Duration End() const { return zx::ticks::now() - ticks_; }

 private:
  zx::ticks ticks_;
};

#else

// Null implementation for host-side code.
class Duration {};

class Ticker {
 public:
  Ticker(bool) {}
  Duration End() const { return Duration(); }
};

#endif

}  // namespace fs

#endif  // SRC_STORAGE_LIB_VFS_CPP_TICKER_H_
