13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved. 2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without 3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are 4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met: 5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions of source code must retain the above copyright 7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// notice, this list of conditions and the following disclaimer. 8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions in binary form must reproduce the above 9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// copyright notice, this list of conditions and the following 10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// disclaimer in the documentation and/or other materials provided 11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// with the distribution. 12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Neither the name of Google Inc. nor the names of its 13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// contributors may be used to endorse or promote products derived 14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// from this software without specific prior written permission. 15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifndef V8_LOG_H_ 29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_LOG_H_ 30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 31257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#include "allocation.h" 323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include "objects.h" 33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "platform.h" 34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "log-utils.h" 35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 { 37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal { 38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Logger is used for collecting logging information from V8 during 40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// execution. The result is dumped to a file. 41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Available command line flags: 43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --log 45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Minimal logging (no API, code, or GC sample events), default is off. 46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --log-all 48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Log all events to the file, default is off. This is the same as combining 49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --log-api, --log-code, --log-gc, and --log-regexp. 50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --log-api 52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Log API events to the logfile, default is off. --log-api implies --log. 53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --log-code 55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Log code (create, move, and delete) events to the logfile, default is off. 56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --log-code implies --log. 57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --log-gc 59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Log GC heap samples after each GC that can be processed by hp2ps, default 60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// is off. --log-gc implies --log. 61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --log-regexp 63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Log creation and use of regular expressions, Default is off. 64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --log-regexp implies --log. 65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --logfile <filename> 67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Specify the name of the logfile, default is "v8.log". 68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// --prof 70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Collect statistical profiling information (ticks), default is off. The 71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// tick profiler requires code events, so --prof implies --log-code. 72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Forward declarations. 74257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass LogMessageBuilder; 75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Profiler; 76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Semaphore; 77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass SlidingStateWindow; 78257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass Ticker; 79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef LOG 8144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define LOG(isolate, Call) \ 8244f0eee88ff00398ff7f715fab053374d808c90dSteve Block do { \ 8344f0eee88ff00398ff7f715fab053374d808c90dSteve Block v8::internal::Logger* logger = \ 8444f0eee88ff00398ff7f715fab053374d808c90dSteve Block (isolate)->logger(); \ 8544f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (logger->is_logging()) \ 8644f0eee88ff00398ff7f715fab053374d808c90dSteve Block logger->Call; \ 87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } while (false) 88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 89257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#define LOG_EVENTS_AND_TAGS_LIST(V) \ 90257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(CODE_CREATION_EVENT, "code-creation") \ 91257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(CODE_MOVE_EVENT, "code-move") \ 92257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(CODE_DELETE_EVENT, "code-delete") \ 93257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(CODE_MOVING_GC, "code-moving-gc") \ 94257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(SHARED_FUNC_MOVE_EVENT, "sfi-move") \ 95257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(SNAPSHOT_POSITION_EVENT, "snapshot-pos") \ 96257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(SNAPSHOT_CODE_NAME_EVENT, "snapshot-code-name") \ 97257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(TICK_EVENT, "tick") \ 98257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(REPEAT_META_EVENT, "repeat") \ 99257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(BUILTIN_TAG, "Builtin") \ 100257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(CALL_DEBUG_BREAK_TAG, "CallDebugBreak") \ 101257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(CALL_DEBUG_PREPARE_STEP_IN_TAG, "CallDebugPrepareStepIn") \ 102257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(CALL_IC_TAG, "CallIC") \ 103257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(CALL_INITIALIZE_TAG, "CallInitialize") \ 104257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(CALL_MEGAMORPHIC_TAG, "CallMegamorphic") \ 105257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(CALL_MISS_TAG, "CallMiss") \ 106257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(CALL_NORMAL_TAG, "CallNormal") \ 107257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(CALL_PRE_MONOMORPHIC_TAG, "CallPreMonomorphic") \ 108257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(KEYED_CALL_DEBUG_BREAK_TAG, "KeyedCallDebugBreak") \ 109257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(KEYED_CALL_DEBUG_PREPARE_STEP_IN_TAG, \ 110257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch "KeyedCallDebugPrepareStepIn") \ 111257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(KEYED_CALL_IC_TAG, "KeyedCallIC") \ 112257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(KEYED_CALL_INITIALIZE_TAG, "KeyedCallInitialize") \ 113257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(KEYED_CALL_MEGAMORPHIC_TAG, "KeyedCallMegamorphic") \ 114257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(KEYED_CALL_MISS_TAG, "KeyedCallMiss") \ 115257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(KEYED_CALL_NORMAL_TAG, "KeyedCallNormal") \ 116257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(KEYED_CALL_PRE_MONOMORPHIC_TAG, "KeyedCallPreMonomorphic") \ 117257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(CALLBACK_TAG, "Callback") \ 118257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(EVAL_TAG, "Eval") \ 119257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(FUNCTION_TAG, "Function") \ 120257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(KEYED_LOAD_IC_TAG, "KeyedLoadIC") \ 121257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(KEYED_LOAD_MEGAMORPHIC_IC_TAG, "KeyedLoadMegamorphicIC") \ 122257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(KEYED_EXTERNAL_ARRAY_LOAD_IC_TAG, "KeyedExternalArrayLoadIC") \ 123257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(KEYED_STORE_IC_TAG, "KeyedStoreIC") \ 124257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(KEYED_STORE_MEGAMORPHIC_IC_TAG, "KeyedStoreMegamorphicIC") \ 125257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(KEYED_EXTERNAL_ARRAY_STORE_IC_TAG, "KeyedExternalArrayStoreIC") \ 126257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(LAZY_COMPILE_TAG, "LazyCompile") \ 127257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(LOAD_IC_TAG, "LoadIC") \ 128257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(REG_EXP_TAG, "RegExp") \ 129257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(SCRIPT_TAG, "Script") \ 130257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(STORE_IC_TAG, "StoreIC") \ 131257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(STUB_TAG, "Stub") \ 132257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(NATIVE_FUNCTION_TAG, "Function") \ 133257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(NATIVE_LAZY_COMPILE_TAG, "LazyCompile") \ 134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(NATIVE_SCRIPT_TAG, "Script") 1356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Note that 'NATIVE_' cases for functions and scripts are mapped onto 1366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// original tags when writing to the log. 1376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 13944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass Sampler; 14044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 14144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass Logger { 143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define DECLARE_ENUM(enum_item, ignore) enum_item, 145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block enum LogEventsAndTags { 146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block LOG_EVENTS_AND_TAGS_LIST(DECLARE_ENUM) 147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block NUMBER_OF_LOG_EVENTS 148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block }; 149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef DECLARE_ENUM 150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Acquires resources for logging if the right flags are set. 1523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool SetUp(); 153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 15444f0eee88ff00398ff7f715fab053374d808c90dSteve Block void EnsureTickerStarted(); 15544f0eee88ff00398ff7f715fab053374d808c90dSteve Block void EnsureTickerStopped(); 15644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 15744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Sampler* sampler(); 158b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Frees resources acquired in SetUp. 1603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // When a temporary file is used for the log, returns its stream descriptor, 1613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // leaving the file open. 1623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch FILE* TearDown(); 163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Enable the computation of a sliding window of states. 16544f0eee88ff00398ff7f715fab053374d808c90dSteve Block void EnableSlidingStateWindow(); 166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Emits an event with a string value -> (name, value). 16844f0eee88ff00398ff7f715fab053374d808c90dSteve Block void StringEvent(const char* name, const char* value); 169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Emits an event with an int value -> (name, value). 17144f0eee88ff00398ff7f715fab053374d808c90dSteve Block void IntEvent(const char* name, int value); 17244f0eee88ff00398ff7f715fab053374d808c90dSteve Block void IntPtrTEvent(const char* name, intptr_t value); 173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Emits an event with an handle value -> (name, location). 17544f0eee88ff00398ff7f715fab053374d808c90dSteve Block void HandleEvent(const char* name, Object** location); 176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Emits memory management events for C allocated structures. 17844f0eee88ff00398ff7f715fab053374d808c90dSteve Block void NewEvent(const char* name, void* object, size_t size); 17944f0eee88ff00398ff7f715fab053374d808c90dSteve Block void DeleteEvent(const char* name, void* object); 18044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 18144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Static versions of the above, operate on current isolate's logger. 18244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Used in TRACK_MEMORY(TypeName) defined in globals.h 18344f0eee88ff00398ff7f715fab053374d808c90dSteve Block static void NewEventStatic(const char* name, void* object, size_t size); 18444f0eee88ff00398ff7f715fab053374d808c90dSteve Block static void DeleteEventStatic(const char* name, void* object); 185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Emits an event with a tag, and some resource usage information. 187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // -> (name, tag, <rusage information>). 188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Currently, the resource usage information is a process time stamp 189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // and a real time timestamp. 19044f0eee88ff00398ff7f715fab053374d808c90dSteve Block void ResourceEvent(const char* name, const char* tag); 191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Emits an event that an undefined property was read from an 193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // object. 19444f0eee88ff00398ff7f715fab053374d808c90dSteve Block void SuspectReadEvent(String* name, Object* obj); 195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Emits an event when a message is put on or read from a debugging queue. 197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // DebugTag lets us put a call-site specific label on the event. 19844f0eee88ff00398ff7f715fab053374d808c90dSteve Block void DebugTag(const char* call_site_tag); 19944f0eee88ff00398ff7f715fab053374d808c90dSteve Block void DebugEvent(const char* event_type, Vector<uint16_t> parameter); 200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // ==== Events logged by --log-api. ==== 20344f0eee88ff00398ff7f715fab053374d808c90dSteve Block void ApiNamedSecurityCheck(Object* key); 20444f0eee88ff00398ff7f715fab053374d808c90dSteve Block void ApiIndexedSecurityCheck(uint32_t index); 20544f0eee88ff00398ff7f715fab053374d808c90dSteve Block void ApiNamedPropertyAccess(const char* tag, JSObject* holder, Object* name); 20644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void ApiIndexedPropertyAccess(const char* tag, 20744f0eee88ff00398ff7f715fab053374d808c90dSteve Block JSObject* holder, 20844f0eee88ff00398ff7f715fab053374d808c90dSteve Block uint32_t index); 20944f0eee88ff00398ff7f715fab053374d808c90dSteve Block void ApiObjectAccess(const char* tag, JSObject* obj); 21044f0eee88ff00398ff7f715fab053374d808c90dSteve Block void ApiEntryCall(const char* name); 211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // ==== Events logged by --log-code. ==== 214d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block // Emits a code event for a callback function. 21544f0eee88ff00398ff7f715fab053374d808c90dSteve Block void CallbackEvent(String* name, Address entry_point); 21644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void GetterCallbackEvent(String* name, Address entry_point); 21744f0eee88ff00398ff7f715fab053374d808c90dSteve Block void SetterCallbackEvent(String* name, Address entry_point); 218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Emits a code create event. 21944f0eee88ff00398ff7f715fab053374d808c90dSteve Block void CodeCreateEvent(LogEventsAndTags tag, 22044f0eee88ff00398ff7f715fab053374d808c90dSteve Block Code* code, const char* source); 22144f0eee88ff00398ff7f715fab053374d808c90dSteve Block void CodeCreateEvent(LogEventsAndTags tag, 22244f0eee88ff00398ff7f715fab053374d808c90dSteve Block Code* code, String* name); 22344f0eee88ff00398ff7f715fab053374d808c90dSteve Block void CodeCreateEvent(LogEventsAndTags tag, 22444f0eee88ff00398ff7f715fab053374d808c90dSteve Block Code* code, 22544f0eee88ff00398ff7f715fab053374d808c90dSteve Block SharedFunctionInfo* shared, 22644f0eee88ff00398ff7f715fab053374d808c90dSteve Block String* name); 22744f0eee88ff00398ff7f715fab053374d808c90dSteve Block void CodeCreateEvent(LogEventsAndTags tag, 22844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Code* code, 22944f0eee88ff00398ff7f715fab053374d808c90dSteve Block SharedFunctionInfo* shared, 23044f0eee88ff00398ff7f715fab053374d808c90dSteve Block String* source, int line); 23144f0eee88ff00398ff7f715fab053374d808c90dSteve Block void CodeCreateEvent(LogEventsAndTags tag, Code* code, int args_count); 23244f0eee88ff00398ff7f715fab053374d808c90dSteve Block void CodeMovingGCEvent(); 233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Emits a code create event for a RegExp. 23444f0eee88ff00398ff7f715fab053374d808c90dSteve Block void RegExpCodeCreateEvent(Code* code, String* source); 235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Emits a code move event. 23644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void CodeMoveEvent(Address from, Address to); 237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Emits a code delete event. 23844f0eee88ff00398ff7f715fab053374d808c90dSteve Block void CodeDeleteEvent(Address from); 239e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 24044f0eee88ff00398ff7f715fab053374d808c90dSteve Block void SharedFunctionInfoMoveEvent(Address from, Address to); 241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 24244f0eee88ff00398ff7f715fab053374d808c90dSteve Block void SnapshotPositionEvent(Address addr, int pos); 243e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // ==== Events logged by --log-gc. ==== 245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Heap sampling events: start, end, and individual types. 24644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void HeapSampleBeginEvent(const char* space, const char* kind); 24744f0eee88ff00398ff7f715fab053374d808c90dSteve Block void HeapSampleEndEvent(const char* space, const char* kind); 24844f0eee88ff00398ff7f715fab053374d808c90dSteve Block void HeapSampleItemEvent(const char* type, int number, int bytes); 24944f0eee88ff00398ff7f715fab053374d808c90dSteve Block void HeapSampleJSConstructorEvent(const char* constructor, 25044f0eee88ff00398ff7f715fab053374d808c90dSteve Block int number, int bytes); 25144f0eee88ff00398ff7f715fab053374d808c90dSteve Block void HeapSampleJSRetainersEvent(const char* constructor, 252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const char* event); 25344f0eee88ff00398ff7f715fab053374d808c90dSteve Block void HeapSampleJSProducerEvent(const char* constructor, 25444f0eee88ff00398ff7f715fab053374d808c90dSteve Block Address* stack); 25544f0eee88ff00398ff7f715fab053374d808c90dSteve Block void HeapSampleStats(const char* space, const char* kind, 25644f0eee88ff00398ff7f715fab053374d808c90dSteve Block intptr_t capacity, intptr_t used); 25744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 25844f0eee88ff00398ff7f715fab053374d808c90dSteve Block void SharedLibraryEvent(const char* library_path, 25944f0eee88ff00398ff7f715fab053374d808c90dSteve Block uintptr_t start, 26044f0eee88ff00398ff7f715fab053374d808c90dSteve Block uintptr_t end); 26144f0eee88ff00398ff7f715fab053374d808c90dSteve Block void SharedLibraryEvent(const wchar_t* library_path, 26244f0eee88ff00398ff7f715fab053374d808c90dSteve Block uintptr_t start, 26344f0eee88ff00398ff7f715fab053374d808c90dSteve Block uintptr_t end); 264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // ==== Events logged by --log-regexp ==== 266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Regexp compilation and execution events. 267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 26844f0eee88ff00398ff7f715fab053374d808c90dSteve Block void RegExpCompileEvent(Handle<JSRegExp> regexp, bool in_cache); 269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Log an event reported from generated code 27144f0eee88ff00398ff7f715fab053374d808c90dSteve Block void LogRuntime(Vector<const char> format, JSArray* args); 272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 27344f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool is_logging() { 2746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return logging_nesting_ > 0; 275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Pause/Resume collection of profiling data. 278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // When data collection is paused, CPU Tick events are discarded until 279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // data collection is Resumed. 2803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void PauseProfiler(); 2813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void ResumeProfiler(); 2823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool IsProfilerPaused(); 283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 284589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch void LogExistingFunction(Handle<SharedFunctionInfo> shared, 285589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch Handle<Code> code); 286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Logs all compiled functions found in the heap. 28744f0eee88ff00398ff7f715fab053374d808c90dSteve Block void LogCompiledFunctions(); 288d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block // Logs all accessor callbacks found in the heap. 28944f0eee88ff00398ff7f715fab053374d808c90dSteve Block void LogAccessorCallbacks(); 290d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block // Used for logging stubs found in the snapshot. 29144f0eee88ff00398ff7f715fab053374d808c90dSteve Block void LogCodeObjects(); 292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // Converts tag to a corresponding NATIVE_... if the script is native. 2946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block INLINE(static LogEventsAndTags ToNativeByScript(LogEventsAndTags, Script*)); 295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Profiler's sampling interval (in milliseconds). 2977549248b8e9ff356d1d3fa834020a789897aa139Ben Murdoch#if defined(ANDROID) 2987549248b8e9ff356d1d3fa834020a789897aa139Ben Murdoch // Phones and tablets have processors that are much slower than desktop 2997549248b8e9ff356d1d3fa834020a789897aa139Ben Murdoch // and laptop computers for which current heuristics are tuned. 3007549248b8e9ff356d1d3fa834020a789897aa139Ben Murdoch static const int kSamplingIntervalMs = 5; 3017549248b8e9ff356d1d3fa834020a789897aa139Ben Murdoch#else 302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static const int kSamplingIntervalMs = 1; 3037549248b8e9ff356d1d3fa834020a789897aa139Ben Murdoch#endif 304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 30544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Callback from Log, stops profiling in case of insufficient resources. 30644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void LogFailure(); 30744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 3086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block private: 309257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch class NameBuffer; 310257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch class NameMap; 311257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 31244f0eee88ff00398ff7f715fab053374d808c90dSteve Block Logger(); 31344f0eee88ff00398ff7f715fab053374d808c90dSteve Block ~Logger(); 3146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Emits the profiler's first message. 31644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void ProfilerBeginEvent(); 317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 318d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block // Emits callback event messages. 31944f0eee88ff00398ff7f715fab053374d808c90dSteve Block void CallbackEventInternal(const char* prefix, 32044f0eee88ff00398ff7f715fab053374d808c90dSteve Block const char* name, 32144f0eee88ff00398ff7f715fab053374d808c90dSteve Block Address entry_point); 322d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 323d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke // Internal configurable move event. 32444f0eee88ff00398ff7f715fab053374d808c90dSteve Block void MoveEventInternal(LogEventsAndTags event, Address from, Address to); 325d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke 326d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke // Internal configurable move event. 32744f0eee88ff00398ff7f715fab053374d808c90dSteve Block void DeleteEventInternal(LogEventsAndTags event, Address from); 328d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke 329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Emits the source code of a regexp. Used by regexp events. 33044f0eee88ff00398ff7f715fab053374d808c90dSteve Block void LogRegExpSource(Handle<JSRegExp> regexp); 331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu // Used for logging stubs found in the snapshot. 33344f0eee88ff00398ff7f715fab053374d808c90dSteve Block void LogCodeObject(Object* code_object); 3343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu 335f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch // Emits general information about generated code. 33644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void LogCodeInfo(); 337f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 338257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void RegisterSnapshotCodeName(Code* code, const char* name, int name_size); 339257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 340257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Low-level logging support. 341257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 342257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void LowLevelCodeCreateEvent(Code* code, const char* name, int name_size); 343257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 344257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void LowLevelCodeMoveEvent(Address from, Address to); 345257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 346257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void LowLevelCodeDeleteEvent(Address from); 347257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 348257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void LowLevelSnapshotPositionEvent(Address addr, int pos); 349257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 350257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void LowLevelLogWriteBytes(const char* bytes, int size); 351257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 352257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch template <typename T> 353257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void LowLevelLogWriteStruct(const T& s) { 354257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch char tag = T::kTag; 355257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch LowLevelLogWriteBytes(reinterpret_cast<const char*>(&tag), sizeof(tag)); 356257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch LowLevelLogWriteBytes(reinterpret_cast<const char*>(&s), sizeof(s)); 357257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 358f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Emits a profiler tick event. Used by the profiler thread. 36044f0eee88ff00398ff7f715fab053374d808c90dSteve Block void TickEvent(TickSample* sample, bool overflow); 361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 36244f0eee88ff00398ff7f715fab053374d808c90dSteve Block void ApiEvent(const char* name, ...); 363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Logs a StringEvent regardless of whether FLAG_log is true. 36544f0eee88ff00398ff7f715fab053374d808c90dSteve Block void UncheckedStringEvent(const char* name, const char* value); 366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // Logs an IntEvent regardless of whether FLAG_log is true. 36844f0eee88ff00398ff7f715fab053374d808c90dSteve Block void UncheckedIntEvent(const char* name, int value); 36944f0eee88ff00398ff7f715fab053374d808c90dSteve Block void UncheckedIntPtrTEvent(const char* name, intptr_t value); 370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Returns whether profiler's sampler is active. 37244f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool IsProfilerSamplerActive(); 373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The sampler used by the profiler and the sliding state window. 37544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Ticker* ticker_; 376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // When the statistical profile is active, profiler_ 378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // points to a Profiler, that handles collection 379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // of samples. 38044f0eee88ff00398ff7f715fab053374d808c90dSteve Block Profiler* profiler_; 381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // SlidingStateWindow instance keeping a sliding window of the most 383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // recent VM states. 38444f0eee88ff00398ff7f715fab053374d808c90dSteve Block SlidingStateWindow* sliding_state_window_; 38544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 38644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // An array of log events names. 38744f0eee88ff00398ff7f715fab053374d808c90dSteve Block const char* const* log_events_; 388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Internal implementation classes with access to 390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // private members. 391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block friend class EventLog; 39244f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class Isolate; 39344f0eee88ff00398ff7f715fab053374d808c90dSteve Block friend class LogMessageBuilder; 394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block friend class TimeLog; 395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block friend class Profiler; 396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block friend class SlidingStateWindow; 397d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block friend class StackTracer; 398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block friend class VMState; 399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block friend class LoggerTestHelper; 401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 40244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 40344f0eee88ff00398ff7f715fab053374d808c90dSteve Block int logging_nesting_; 40444f0eee88ff00398ff7f715fab053374d808c90dSteve Block int cpu_profiler_nesting_; 40544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 40644f0eee88ff00398ff7f715fab053374d808c90dSteve Block Log* log_; 40744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 408257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch NameBuffer* name_buffer_; 409257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 410257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch NameMap* address_to_name_map_; 411257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 41244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Guards against multiple calls to TearDown() that can happen in some tests. 4133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // 'true' between SetUp() and TearDown(). 41444f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool is_initialized_; 41544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 41644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Support for 'incremental addresses' in compressed logs: 41744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // LogMessageBuilder::AppendAddress(Address addr) 41844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Address last_address_; 41944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Logger::TickEvent(...) 42044f0eee88ff00398ff7f715fab053374d808c90dSteve Block Address prev_sp_; 42144f0eee88ff00398ff7f715fab053374d808c90dSteve Block Address prev_function_; 42244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Logger::MoveEventInternal(...) 42344f0eee88ff00398ff7f715fab053374d808c90dSteve Block Address prev_to_; 42444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Logger::FunctionCreateEvent(...) 42544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Address prev_code_; 4266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 4276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block friend class CpuProfiler; 428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 43144f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Process wide registry of samplers. 43244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass SamplerRegistry : public AllStatic { 43344f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 43444f0eee88ff00398ff7f715fab053374d808c90dSteve Block enum State { 43544f0eee88ff00398ff7f715fab053374d808c90dSteve Block HAS_NO_SAMPLERS, 43644f0eee88ff00398ff7f715fab053374d808c90dSteve Block HAS_SAMPLERS, 43744f0eee88ff00398ff7f715fab053374d808c90dSteve Block HAS_CPU_PROFILING_SAMPLERS 43844f0eee88ff00398ff7f715fab053374d808c90dSteve Block }; 43944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 44044f0eee88ff00398ff7f715fab053374d808c90dSteve Block typedef void (*VisitSampler)(Sampler*, void*); 44144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 44244f0eee88ff00398ff7f715fab053374d808c90dSteve Block static State GetState(); 44344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 44444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Iterates over all active samplers keeping the internal lock held. 44544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Returns whether there are any active samplers. 44644f0eee88ff00398ff7f715fab053374d808c90dSteve Block static bool IterateActiveSamplers(VisitSampler func, void* param); 44744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 44844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Adds/Removes an active sampler. 44944f0eee88ff00398ff7f715fab053374d808c90dSteve Block static void AddActiveSampler(Sampler* sampler); 45044f0eee88ff00398ff7f715fab053374d808c90dSteve Block static void RemoveActiveSampler(Sampler* sampler); 45144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 45244f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 45344f0eee88ff00398ff7f715fab053374d808c90dSteve Block static bool ActiveSamplersExist() { 45444f0eee88ff00398ff7f715fab053374d808c90dSteve Block return active_samplers_ != NULL && !active_samplers_->is_empty(); 45544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 45644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 45744f0eee88ff00398ff7f715fab053374d808c90dSteve Block static List<Sampler*>* active_samplers_; 45844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 45944f0eee88ff00398ff7f715fab053374d808c90dSteve Block DISALLOW_IMPLICIT_CONSTRUCTORS(SamplerRegistry); 46044f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 46144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 46244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Class that extracts stack trace, used for profiling. 464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass StackTracer : public AllStatic { 465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public: 46644f0eee88ff00398ff7f715fab053374d808c90dSteve Block static void Trace(Isolate* isolate, TickSample* sample); 467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}; 468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} } // namespace v8::internal 470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif // V8_LOG_H_ 473