// 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 VM_METRICS_H_
#define 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();

  void PrintJSON(JSONStream* stream);

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