// Copyright (c) 2013, 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_HEAP_HISTOGRAM_H_
#define VM_HEAP_HISTOGRAM_H_

#include "platform/assert.h"
#include "vm/flags.h"
#include "vm/globals.h"
#include "vm/raw_object.h"

namespace dart {

class JSONStream;

DECLARE_FLAG(bool, print_object_histogram);

// ObjectHistogram is used to compute an average object histogram over
// the lifetime of an isolate and then print the histogram when the isolate
// is shut down. Information is gathered at the back-edge of each major GC
// event. When an object histogram is collected for an isolate, an extra major
// GC is performed just prior to shutdown.
class ObjectHistogram {
 public:
  explicit ObjectHistogram(Isolate* isolate);
  ~ObjectHistogram();

  // Called when a new class is registered in the isolate.
  void RegisterClass(const Class& cls);

  // Collect sample for the histogram. Called at back-edge of major GC.
  void Collect();

  // Print the histogram on stdout.
  void Print();

  void PrintToJSONStream(JSONStream* stream);

 private:
  // Add obj to histogram
  void Add(RawObject* obj);

  // For each class an Element keeps track of the accounting.
  class Element : public ValueObject {
   public:
    void Add(int size) {
      count_++;
      size_ += size;
    }
    intptr_t class_id_;
    intptr_t count_;
    intptr_t size_;
  };

  // Compare function for sorting result.
  static int compare(const Element** a, const Element** b);

  // This function returns a malloced array. Caller is responsible for calling
  // free().
  Element** GetSortedArray(intptr_t* array_length);

  intptr_t major_gc_count_;
  intptr_t table_length_;
  Element* table_;
  Isolate* isolate_;

  friend class ObjectHistogramVisitor;

  DISALLOW_COPY_AND_ASSIGN(ObjectHistogram);
};

}  // namespace dart

#endif  // VM_HEAP_HISTOGRAM_H_

