// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#ifndef RUNTIME_VM_METRICS_H_
#define RUNTIME_VM_METRICS_H_

#include "vm/allocation.h"

namespace dart {

class Isolate;
class JSONStream;

// Metrics for each isolate.
#define ISOLATE_METRIC_LIST(V)                                                 \
  V(MetricHeapOldUsed, HeapOldUsed, "heap.old.used", kByte)                    \
  V(MaxMetric, HeapOldUsedMax, "heap.old.used.max", kByte)                     \
  V(MetricHeapOldCapacity, HeapOldCapacity, "heap.old.capacity", kByte)        \
  V(MaxMetric, HeapOldCapacityMax, "heap.old.capacity.max", kByte)             \
  V(MetricHeapOldExternal, HeapOldExternal, "heap.old.external", kByte)        \
  V(MetricHeapNewUsed, HeapNewUsed, "heap.new.used", kByte)                    \
  V(MaxMetric, HeapNewUsedMax, "heap.new.used.max", kByte)                     \
  V(MetricHeapNewCapacity, HeapNewCapacity, "heap.new.capacity", kByte)        \
  V(MaxMetric, HeapNewCapacityMax, "heap.new.capacity.max", kByte)             \
  V(MetricHeapNewExternal, HeapNewExternal, "heap.new.external", kByte)        \
  V(MetricHeapUsed, HeapGlobalUsed, "heap.global.used", kByte)                 \
  V(MaxMetric, HeapGlobalUsedMax, "heap.global.used.max", kByte)               \

#define VM_METRIC_LIST(V)                                                      \
  V(MetricIsolateCount, IsolateCount, "vm.isolate.count", kCounter)

class Metric {
 public:
  enum Unit {
    kCounter,
    kByte,
  };

  Metric();

  static void InitOnce();

  static void Cleanup();

  // Initialize and register a metric for an isolate.
  void Init(Isolate* isolate,
            const char* name,
            const char* description,
            Unit unit);

  // Initialize and register a metric for the VM.
  void Init(const char* name,
            const char* description,
            Unit unit);

  virtual ~Metric();

#ifndef PRODUCT
  void PrintJSON(JSONStream* stream);
#endif  // !PRODUCT

  // Returns a zone allocated string.
  static char* ValueToString(int64_t value, Unit unit);

  // Returns a zone allocated string.
  char* ToString();

  int64_t value() const { return value_; }
  void set_value(int64_t value) { value_ = value; }

  void increment() { value_++; }

  Metric* next() const { return next_; }
  void set_next(Metric* next) {
    next_ = next;
  }

  const char* name() const { return name_; }
  const char* description() const { return description_; }
  Unit unit() const { return unit_; }

  // Will be NULL for Metric that is VM-global.
  Isolate* isolate() const { return isolate_; }

  static Metric* vm_head() { return vm_list_head_; }

 protected:
  // Override to get a callback when value is serialized to JSON.
  // Use this for metrics that produce their value on demand.
  virtual int64_t Value() const { return value(); }

 private:
  Isolate* isolate_;
  const char* name_;
  const char* description_;
  Unit unit_;
  int64_t value_;
  Metric* next_;

  static bool NameExists(Metric* head, const char* name);

  void RegisterWithIsolate();
  void DeregisterWithIsolate();
  void RegisterWithVM();
  void DeregisterWithVM();

  static Metric* vm_list_head_;
  DISALLOW_COPY_AND_ASSIGN(Metric);
};


// A Metric class that reports the maximum value observed.
// Initial maximum is kMinInt64.
class MaxMetric : public Metric {
 public:
  MaxMetric();

  void SetValue(int64_t new_value);
};


// A Metric class that reports the minimum value observed.
// Initial minimum is kMaxInt64.
class MinMetric : public Metric {
 public:
  MinMetric();

  void SetValue(int64_t new_value);
};


class MetricHeapOldUsed : public Metric {
 protected:
  virtual int64_t Value() const;
};


class MetricHeapOldCapacity : public Metric {
 protected:
  virtual int64_t Value() const;
};


class MetricHeapOldExternal : public Metric {
 protected:
  virtual int64_t Value() const;
};


class MetricHeapNewUsed : public Metric {
 protected:
  virtual int64_t Value() const;
};


class MetricHeapNewCapacity : public Metric {
 protected:
  virtual int64_t Value() const;
};


class MetricHeapNewExternal : public Metric {
 protected:
  virtual int64_t Value() const;
};


class MetricIsolateCount : public Metric {
 protected:
  virtual int64_t Value() const;
};


class MetricHeapUsed : public Metric {
 protected:
  virtual int64_t Value() const;
};

}  // namespace dart

#endif  // RUNTIME_VM_METRICS_H_
