// 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 RUNTIME_VM_CODE_OBSERVERS_H_ #define RUNTIME_VM_CODE_OBSERVERS_H_ #include "vm/allocation.h" #include "vm/globals.h" #include "include/dart_api.h" #if !defined(PRODUCT) namespace dart { class CodeComments; // 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, const CodeComments* comments) = 0; private: DISALLOW_COPY_AND_ASSIGN(CodeObserver); }; class Mutex; class CodeObservers : public AllStatic { public: static void Init(); static void RegisterExternal(Dart_CodeObserver observer); 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, const CodeComments* comments); // Returns true if there is at least one active code observer. static bool AreActive(); static void Cleanup(); static Mutex* mutex() { return mutex_; } private: static Mutex* mutex_; static intptr_t observers_length_; static CodeObserver** observers_; }; } // namespace dart #endif // !defined(PRODUCT) #endif // RUNTIME_VM_CODE_OBSERVERS_H_