// Copyright (c) 2012, 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_CODE_OBSERVERS_H_
#define VM_CODE_OBSERVERS_H_

#include "vm/globals.h"
#include "vm/allocation.h"

namespace dart {

// Object observing code creation events. Used by external profilers and
// debuggers to map address ranges to function names.
class CodeObserver {
 public:
  CodeObserver() { }

  virtual ~CodeObserver() { }

  // Returns true if this observer is active and should be notified
  // about newly created code objects.
  virtual bool IsActive() const = 0;

  // Notify code observer about a newly created code object with the
  // given properties.
  virtual void Notify(const char* name,
                      uword base,
                      uword prologue_offset,
                      uword size,
                      bool optimized) = 0;

 private:
  DISALLOW_COPY_AND_ASSIGN(CodeObserver);
};


class CodeObservers : public AllStatic {
 public:
  static void InitOnce();

  static void Register(CodeObserver* observer);

  // Notify all active code observers about a newly created code object.
  static void NotifyAll(const char* name,
                        uword base,
                        uword prologue_offset,
                        uword size,
                        bool optimized);

  // Returns true if there is at least one active code observer.
  static bool AreActive();

  static void DeleteAll();

 private:
  static intptr_t observers_length_;
  static CodeObserver** observers_;
};


}  // namespace dart

#endif  // VM_CODE_OBSERVERS_H_
