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