Index: src/log.h |
=================================================================== |
--- src/log.h (revision 7267) |
+++ src/log.h (working copy) |
@@ -77,13 +77,15 @@ |
#undef LOG |
#ifdef ENABLE_LOGGING_AND_PROFILING |
-#define LOG(Call) \ |
- do { \ |
- if (v8::internal::Logger::is_logging()) \ |
- v8::internal::Logger::Call; \ |
+#define LOG(isolate, Call) \ |
+ do { \ |
+ v8::internal::Logger* logger = \ |
+ (isolate)->logger(); \ |
+ if (logger->is_logging()) \ |
+ logger->Call; \ |
} while (false) |
#else |
-#define LOG(Call) ((void) 0) |
+#define LOG(isolate, Call) ((void) 0) |
#endif |
#define LOG_EVENTS_AND_TAGS_LIST(V) \ |
@@ -133,6 +135,9 @@ |
// original tags when writing to the log. |
+class Sampler; |
+ |
+ |
class Logger { |
public: |
#define DECLARE_ENUM(enum_item, ignore) enum_item, |
@@ -143,142 +148,147 @@ |
#undef DECLARE_ENUM |
// Acquires resources for logging if the right flags are set. |
- static bool Setup(); |
+ bool Setup(); |
- static void EnsureTickerStarted(); |
- static void EnsureTickerStopped(); |
+ void EnsureTickerStarted(); |
+ void EnsureTickerStopped(); |
+ Sampler* sampler(); |
+ |
// Frees resources acquired in Setup. |
- static void TearDown(); |
+ void TearDown(); |
// Enable the computation of a sliding window of states. |
- static void EnableSlidingStateWindow(); |
+ void EnableSlidingStateWindow(); |
// Emits an event with a string value -> (name, value). |
- static void StringEvent(const char* name, const char* value); |
+ void StringEvent(const char* name, const char* value); |
// Emits an event with an int value -> (name, value). |
- static void IntEvent(const char* name, int value); |
- static void IntPtrTEvent(const char* name, intptr_t value); |
+ void IntEvent(const char* name, int value); |
+ void IntPtrTEvent(const char* name, intptr_t value); |
// Emits an event with an handle value -> (name, location). |
- static void HandleEvent(const char* name, Object** location); |
+ void HandleEvent(const char* name, Object** location); |
// Emits memory management events for C allocated structures. |
- static void NewEvent(const char* name, void* object, size_t size); |
- static void DeleteEvent(const char* name, void* object); |
+ void NewEvent(const char* name, void* object, size_t size); |
+ void DeleteEvent(const char* name, void* object); |
+ // Static versions of the above, operate on current isolate's logger. |
+ // Used in TRACK_MEMORY(TypeName) defined in globals.h |
+ static void NewEventStatic(const char* name, void* object, size_t size); |
+ static void DeleteEventStatic(const char* name, void* object); |
+ |
// Emits an event with a tag, and some resource usage information. |
// -> (name, tag, <rusage information>). |
// Currently, the resource usage information is a process time stamp |
// and a real time timestamp. |
- static void ResourceEvent(const char* name, const char* tag); |
+ void ResourceEvent(const char* name, const char* tag); |
// Emits an event that an undefined property was read from an |
// object. |
- static void SuspectReadEvent(String* name, Object* obj); |
+ void SuspectReadEvent(String* name, Object* obj); |
// Emits an event when a message is put on or read from a debugging queue. |
// DebugTag lets us put a call-site specific label on the event. |
- static void DebugTag(const char* call_site_tag); |
- static void DebugEvent(const char* event_type, Vector<uint16_t> parameter); |
+ void DebugTag(const char* call_site_tag); |
+ void DebugEvent(const char* event_type, Vector<uint16_t> parameter); |
// ==== Events logged by --log-api. ==== |
- static void ApiNamedSecurityCheck(Object* key); |
- static void ApiIndexedSecurityCheck(uint32_t index); |
- static void ApiNamedPropertyAccess(const char* tag, |
- JSObject* holder, |
- Object* name); |
- static void ApiIndexedPropertyAccess(const char* tag, |
- JSObject* holder, |
- uint32_t index); |
- static void ApiObjectAccess(const char* tag, JSObject* obj); |
- static void ApiEntryCall(const char* name); |
+ void ApiNamedSecurityCheck(Object* key); |
+ void ApiIndexedSecurityCheck(uint32_t index); |
+ void ApiNamedPropertyAccess(const char* tag, JSObject* holder, Object* name); |
+ void ApiIndexedPropertyAccess(const char* tag, |
+ JSObject* holder, |
+ uint32_t index); |
+ void ApiObjectAccess(const char* tag, JSObject* obj); |
+ void ApiEntryCall(const char* name); |
// ==== Events logged by --log-code. ==== |
// Emits a code event for a callback function. |
- static void CallbackEvent(String* name, Address entry_point); |
- static void GetterCallbackEvent(String* name, Address entry_point); |
- static void SetterCallbackEvent(String* name, Address entry_point); |
+ void CallbackEvent(String* name, Address entry_point); |
+ void GetterCallbackEvent(String* name, Address entry_point); |
+ void SetterCallbackEvent(String* name, Address entry_point); |
// Emits a code create event. |
- static void CodeCreateEvent(LogEventsAndTags tag, |
- Code* code, const char* source); |
- static void CodeCreateEvent(LogEventsAndTags tag, |
- Code* code, String* name); |
- static void CodeCreateEvent(LogEventsAndTags tag, |
- Code* code, |
- SharedFunctionInfo* shared, |
- String* name); |
- static void CodeCreateEvent(LogEventsAndTags tag, |
- Code* code, |
- SharedFunctionInfo* shared, |
- String* source, int line); |
- static void CodeCreateEvent(LogEventsAndTags tag, Code* code, int args_count); |
- static void CodeMovingGCEvent(); |
+ void CodeCreateEvent(LogEventsAndTags tag, |
+ Code* code, const char* source); |
+ void CodeCreateEvent(LogEventsAndTags tag, |
+ Code* code, String* name); |
+ void CodeCreateEvent(LogEventsAndTags tag, |
+ Code* code, |
+ SharedFunctionInfo* shared, |
+ String* name); |
+ void CodeCreateEvent(LogEventsAndTags tag, |
+ Code* code, |
+ SharedFunctionInfo* shared, |
+ String* source, int line); |
+ void CodeCreateEvent(LogEventsAndTags tag, Code* code, int args_count); |
+ void CodeMovingGCEvent(); |
// Emits a code create event for a RegExp. |
- static void RegExpCodeCreateEvent(Code* code, String* source); |
+ void RegExpCodeCreateEvent(Code* code, String* source); |
// Emits a code move event. |
- static void CodeMoveEvent(Address from, Address to); |
+ void CodeMoveEvent(Address from, Address to); |
// Emits a code delete event. |
- static void CodeDeleteEvent(Address from); |
+ void CodeDeleteEvent(Address from); |
- static void SharedFunctionInfoMoveEvent(Address from, Address to); |
+ void SharedFunctionInfoMoveEvent(Address from, Address to); |
- static void SnapshotPositionEvent(Address addr, int pos); |
+ void SnapshotPositionEvent(Address addr, int pos); |
// ==== Events logged by --log-gc. ==== |
// Heap sampling events: start, end, and individual types. |
- static void HeapSampleBeginEvent(const char* space, const char* kind); |
- static void HeapSampleEndEvent(const char* space, const char* kind); |
- static void HeapSampleItemEvent(const char* type, int number, int bytes); |
- static void HeapSampleJSConstructorEvent(const char* constructor, |
- int number, int bytes); |
- static void HeapSampleJSRetainersEvent(const char* constructor, |
+ void HeapSampleBeginEvent(const char* space, const char* kind); |
+ void HeapSampleEndEvent(const char* space, const char* kind); |
+ void HeapSampleItemEvent(const char* type, int number, int bytes); |
+ void HeapSampleJSConstructorEvent(const char* constructor, |
+ int number, int bytes); |
+ void HeapSampleJSRetainersEvent(const char* constructor, |
const char* event); |
- static void HeapSampleJSProducerEvent(const char* constructor, |
- Address* stack); |
- static void HeapSampleStats(const char* space, const char* kind, |
- intptr_t capacity, intptr_t used); |
+ void HeapSampleJSProducerEvent(const char* constructor, |
+ Address* stack); |
+ void HeapSampleStats(const char* space, const char* kind, |
+ intptr_t capacity, intptr_t used); |
- static void SharedLibraryEvent(const char* library_path, |
- uintptr_t start, |
- uintptr_t end); |
- static void SharedLibraryEvent(const wchar_t* library_path, |
- uintptr_t start, |
- uintptr_t end); |
+ void SharedLibraryEvent(const char* library_path, |
+ uintptr_t start, |
+ uintptr_t end); |
+ void SharedLibraryEvent(const wchar_t* library_path, |
+ uintptr_t start, |
+ uintptr_t end); |
// ==== Events logged by --log-regexp ==== |
// Regexp compilation and execution events. |
- static void RegExpCompileEvent(Handle<JSRegExp> regexp, bool in_cache); |
+ void RegExpCompileEvent(Handle<JSRegExp> regexp, bool in_cache); |
// Log an event reported from generated code |
- static void LogRuntime(Vector<const char> format, JSArray* args); |
+ void LogRuntime(Vector<const char> format, JSArray* args); |
#ifdef ENABLE_LOGGING_AND_PROFILING |
- static bool is_logging() { |
+ bool is_logging() { |
return logging_nesting_ > 0; |
} |
// Pause/Resume collection of profiling data. |
// When data collection is paused, CPU Tick events are discarded until |
// data collection is Resumed. |
- static void PauseProfiler(int flags, int tag); |
- static void ResumeProfiler(int flags, int tag); |
- static int GetActiveProfilerModules(); |
+ void PauseProfiler(int flags, int tag); |
+ void ResumeProfiler(int flags, int tag); |
+ int GetActiveProfilerModules(); |
// If logging is performed into a memory buffer, allows to |
// retrieve previously written messages. See v8.h. |
- static int GetLogLines(int from_pos, char* dest_buf, int max_size); |
+ int GetLogLines(int from_pos, char* dest_buf, int max_size); |
// Logs all compiled functions found in the heap. |
- static void LogCompiledFunctions(); |
+ void LogCompiledFunctions(); |
// Logs all accessor callbacks found in the heap. |
- static void LogAccessorCallbacks(); |
+ void LogAccessorCallbacks(); |
// Used for logging stubs found in the snapshot. |
- static void LogCodeObjects(); |
+ void LogCodeObjects(); |
// Converts tag to a corresponding NATIVE_... if the script is native. |
INLINE(static LogEventsAndTags ToNativeByScript(LogEventsAndTags, Script*)); |
@@ -286,70 +296,74 @@ |
// Profiler's sampling interval (in milliseconds). |
static const int kSamplingIntervalMs = 1; |
+ // Callback from Log, stops profiling in case of insufficient resources. |
+ void LogFailure(); |
+ |
private: |
+ Logger(); |
+ ~Logger(); |
// Emits the profiler's first message. |
- static void ProfilerBeginEvent(); |
+ void ProfilerBeginEvent(); |
// Emits callback event messages. |
- static void CallbackEventInternal(const char* prefix, |
- const char* name, |
- Address entry_point); |
+ void CallbackEventInternal(const char* prefix, |
+ const char* name, |
+ Address entry_point); |
// Internal configurable move event. |
- static void MoveEventInternal(LogEventsAndTags event, |
- Address from, |
- Address to); |
+ void MoveEventInternal(LogEventsAndTags event, Address from, Address to); |
// Internal configurable move event. |
- static void DeleteEventInternal(LogEventsAndTags event, |
- Address from); |
+ void DeleteEventInternal(LogEventsAndTags event, Address from); |
// Emits the source code of a regexp. Used by regexp events. |
- static void LogRegExpSource(Handle<JSRegExp> regexp); |
+ void LogRegExpSource(Handle<JSRegExp> regexp); |
// Used for logging stubs found in the snapshot. |
- static void LogCodeObject(Object* code_object); |
+ void LogCodeObject(Object* code_object); |
// Emits general information about generated code. |
- static void LogCodeInfo(); |
+ void LogCodeInfo(); |
// Handles code creation when low-level profiling is active. |
- static void LowLevelCodeCreateEvent(Code* code, LogMessageBuilder* msg); |
+ void LowLevelCodeCreateEvent(Code* code, LogMessageBuilder* msg); |
// Emits a profiler tick event. Used by the profiler thread. |
- static void TickEvent(TickSample* sample, bool overflow); |
+ void TickEvent(TickSample* sample, bool overflow); |
- static void ApiEvent(const char* name, ...); |
+ void ApiEvent(const char* name, ...); |
// Logs a StringEvent regardless of whether FLAG_log is true. |
- static void UncheckedStringEvent(const char* name, const char* value); |
+ void UncheckedStringEvent(const char* name, const char* value); |
// Logs an IntEvent regardless of whether FLAG_log is true. |
- static void UncheckedIntEvent(const char* name, int value); |
- static void UncheckedIntPtrTEvent(const char* name, intptr_t value); |
+ void UncheckedIntEvent(const char* name, int value); |
+ void UncheckedIntPtrTEvent(const char* name, intptr_t value); |
- // Stops logging and profiling in case of insufficient resources. |
- static void StopLoggingAndProfiling(); |
- |
// Returns whether profiler's sampler is active. |
- static bool IsProfilerSamplerActive(); |
+ bool IsProfilerSamplerActive(); |
// The sampler used by the profiler and the sliding state window. |
- static Ticker* ticker_; |
+ Ticker* ticker_; |
// When the statistical profile is active, profiler_ |
// points to a Profiler, that handles collection |
// of samples. |
- static Profiler* profiler_; |
+ Profiler* profiler_; |
// SlidingStateWindow instance keeping a sliding window of the most |
// recent VM states. |
- static SlidingStateWindow* sliding_state_window_; |
+ SlidingStateWindow* sliding_state_window_; |
+ // An array of log events names. |
+ const char* const* log_events_; |
+ |
// Internal implementation classes with access to |
// private members. |
friend class EventLog; |
+ friend class Isolate; |
+ friend class LogMessageBuilder; |
friend class TimeLog; |
friend class Profiler; |
friend class SlidingStateWindow; |
@@ -358,21 +372,72 @@ |
friend class LoggerTestHelper; |
- static int logging_nesting_; |
- static int cpu_profiler_nesting_; |
- static int heap_profiler_nesting_; |
+ int logging_nesting_; |
+ int cpu_profiler_nesting_; |
+ int heap_profiler_nesting_; |
+ |
+ Log* log_; |
+ |
+ // Guards against multiple calls to TearDown() that can happen in some tests. |
+ // 'true' between Setup() and TearDown(). |
+ bool is_initialized_; |
+ |
+ // Support for 'incremental addresses' in compressed logs: |
+ // LogMessageBuilder::AppendAddress(Address addr) |
+ Address last_address_; |
+ // Logger::TickEvent(...) |
+ Address prev_sp_; |
+ Address prev_function_; |
+ // Logger::MoveEventInternal(...) |
+ Address prev_to_; |
+ // Logger::FunctionCreateEvent(...) |
+ Address prev_code_; |
+ |
friend class CpuProfiler; |
#else |
- static bool is_logging() { return false; } |
+ bool is_logging() { return false; } |
#endif |
}; |
+// Process wide registry of samplers. |
+class SamplerRegistry : public AllStatic { |
+ public: |
+ enum State { |
+ HAS_NO_SAMPLERS, |
+ HAS_SAMPLERS, |
+ HAS_CPU_PROFILING_SAMPLERS |
+ }; |
+ |
+ typedef void (*VisitSampler)(Sampler*, void*); |
+ |
+ static State GetState(); |
+ |
+ // Iterates over all active samplers keeping the internal lock held. |
+ // Returns whether there are any active samplers. |
+ static bool IterateActiveSamplers(VisitSampler func, void* param); |
+ |
+ // Adds/Removes an active sampler. |
+ static void AddActiveSampler(Sampler* sampler); |
+ static void RemoveActiveSampler(Sampler* sampler); |
+ |
+ private: |
+ static bool ActiveSamplersExist() { |
+ return active_samplers_ != NULL && !active_samplers_->is_empty(); |
+ } |
+ |
+ static Mutex* mutex_; // Protects the state below. |
+ static List<Sampler*>* active_samplers_; |
+ |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(SamplerRegistry); |
+}; |
+ |
+ |
// Class that extracts stack trace, used for profiling. |
class StackTracer : public AllStatic { |
public: |
- static void Trace(TickSample* sample); |
+ static void Trace(Isolate* isolate, TickSample* sample); |
}; |
} } // namespace v8::internal |