cpu-profiler.h revision 6ded16be15dd865a9b21ea304d5273c8be299c87
16ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Copyright 2010 the V8 project authors. All rights reserved. 26ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Redistribution and use in source and binary forms, with or without 36ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// modification, are permitted provided that the following conditions are 46ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// met: 56ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// 66ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// * Redistributions of source code must retain the above copyright 76ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// notice, this list of conditions and the following disclaimer. 86ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// * Redistributions in binary form must reproduce the above 96ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// copyright notice, this list of conditions and the following 106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// disclaimer in the documentation and/or other materials provided 116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// with the distribution. 126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// * Neither the name of Google Inc. nor the names of its 136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// contributors may be used to endorse or promote products derived 146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// from this software without specific prior written permission. 156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// 166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 256ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#ifndef V8_CPU_PROFILER_H_ 296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#define V8_CPU_PROFILER_H_ 306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#ifdef ENABLE_LOGGING_AND_PROFILING 326ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#include "circular-queue.h" 346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 356ded16be15dd865a9b21ea304d5273c8be299c87Steve Blocknamespace v8 { 366ded16be15dd865a9b21ea304d5273c8be299c87Steve Blocknamespace internal { 376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Forward declarations. 396ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CodeEntry; 406ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CodeMap; 416ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CpuProfile; 426ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CpuProfilesCollection; 436ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass ProfileGenerator; 446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#define CODE_EVENTS_TYPE_LIST(V) \ 476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block V(CODE_CREATION, CodeCreateEventRecord) \ 486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block V(CODE_MOVE, CodeMoveEventRecord) \ 496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block V(CODE_DELETE, CodeDeleteEventRecord) \ 506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block V(CODE_ALIAS, CodeAliasEventRecord) 516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 536ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CodeEventRecord { 546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public: 556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#define DECLARE_TYPE(type, ignore) type, 566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block enum Type { 576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block NONE = 0, 586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CODE_EVENTS_TYPE_LIST(DECLARE_TYPE) 596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block NUMBER_OF_TYPES 606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block }; 616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#undef DECLARE_TYPE 626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Type type; 646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block unsigned order; 656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 686ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CodeCreateEventRecord : public CodeEventRecord { 696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public: 706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Address start; 716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CodeEntry* entry; 726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block unsigned size; 736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block INLINE(void UpdateCodeMap(CodeMap* code_map)); 756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 786ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CodeMoveEventRecord : public CodeEventRecord { 796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public: 806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Address from; 816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Address to; 826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block INLINE(void UpdateCodeMap(CodeMap* code_map)); 846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 856ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 876ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CodeDeleteEventRecord : public CodeEventRecord { 886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public: 896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Address start; 906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block INLINE(void UpdateCodeMap(CodeMap* code_map)); 926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 956ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CodeAliasEventRecord : public CodeEventRecord { 966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public: 976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Address alias; 986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Address start; 996ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1006ded16be15dd865a9b21ea304d5273c8be299c87Steve Block INLINE(void UpdateCodeMap(CodeMap* code_map)); 1016ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 1026ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1036ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1046ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass TickSampleEventRecord BASE_EMBEDDED { 1056ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public: 1066ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // The first machine word of a TickSampleEventRecord must not ever 1076ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // become equal to SamplingCircularQueue::kClear. As both order and 1086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // TickSample's first field are not reliable in this sense (order 1096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // can overflow, TickSample can have all fields reset), we are 1106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // forced to use an artificial filler field. 1116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block int filler; 1126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block unsigned order; 1136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block TickSample sample; 1146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static TickSampleEventRecord* cast(void* value) { 1166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return reinterpret_cast<TickSampleEventRecord*>(value); 1176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 1186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block INLINE(static TickSampleEventRecord* init(void* value)); 1206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block private: 1226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block DISALLOW_IMPLICIT_CONSTRUCTORS(TickSampleEventRecord); 1236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 1246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1256ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// This class implements both the profile events processor thread and 1276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// methods called by event producers: VM and stack sampler threads. 1286ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass ProfilerEventsProcessor : public Thread { 1296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public: 1306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block explicit ProfilerEventsProcessor(ProfileGenerator* generator); 1316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block virtual ~ProfilerEventsProcessor() { } 1326ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // Thread control. 1346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block virtual void Run(); 1356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block inline void Stop() { running_ = false; } 1366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block INLINE(bool running()) { return running_; } 1376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // Events adding methods. Called by VM threads. 1396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block void CallbackCreateEvent(Logger::LogEventsAndTags tag, 1406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block const char* prefix, String* name, 1416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Address start); 1426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block void CodeCreateEvent(Logger::LogEventsAndTags tag, 1436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block String* name, 1446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block String* resource_name, int line_number, 1456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Address start, unsigned size); 1466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block void CodeCreateEvent(Logger::LogEventsAndTags tag, 1476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block const char* name, 1486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Address start, unsigned size); 1496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block void CodeCreateEvent(Logger::LogEventsAndTags tag, 1506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block int args_count, 1516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Address start, unsigned size); 1526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block void CodeMoveEvent(Address from, Address to); 1536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block void CodeDeleteEvent(Address from); 1546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block void FunctionCreateEvent(Address alias, Address start); 1556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block void FunctionMoveEvent(Address from, Address to); 1566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block void FunctionDeleteEvent(Address from); 1576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block void RegExpCodeCreateEvent(Logger::LogEventsAndTags tag, 1586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block const char* prefix, String* name, 1596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Address start, unsigned size); 1606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // Tick sample events are filled directly in the buffer of the circular 1626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // queue (because the structure is of fixed width, but usually not all 1636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // stack frame entries are filled.) This method returns a pointer to the 1646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // next record of the buffer. 1656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block INLINE(TickSample* TickSampleEvent()); 1666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block private: 1686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block union CodeEventsContainer { 1696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CodeEventRecord generic; 1706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#define DECLARE_CLASS(ignore, type) type type##_; 1716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CODE_EVENTS_TYPE_LIST(DECLARE_CLASS) 1726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#undef DECLARE_TYPE 1736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block }; 1746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // Called from events processing thread (Run() method.) 1766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block bool ProcessCodeEvent(unsigned* dequeue_order); 1776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block bool ProcessTicks(unsigned dequeue_order); 1786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block INLINE(static bool FilterOutCodeCreateEvent(Logger::LogEventsAndTags tag)); 1806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ProfileGenerator* generator_; 1826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block bool running_; 1836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CircularQueue<CodeEventsContainer> events_buffer_; 1846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block SamplingCircularQueue ticks_buffer_; 1856ded16be15dd865a9b21ea304d5273c8be299c87Steve Block unsigned enqueue_order_; 1866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 1876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} } // namespace v8::internal 1896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#define PROFILE(Call) \ 1926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block LOG(Call); \ 1936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block do { \ 1946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (v8::internal::CpuProfiler::is_profiling()) { \ 1956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block v8::internal::CpuProfiler::Call; \ 1966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } \ 1976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } while (false) 1986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#else 1996ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#define PROFILE(Call) LOG(Call) 2006ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#endif // ENABLE_LOGGING_AND_PROFILING 2016ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2026ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2036ded16be15dd865a9b21ea304d5273c8be299c87Steve Blocknamespace v8 { 2046ded16be15dd865a9b21ea304d5273c8be299c87Steve Blocknamespace internal { 2056ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2066ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockclass CpuProfiler { 2076ded16be15dd865a9b21ea304d5273c8be299c87Steve Block public: 2086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static void Setup(); 2096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static void TearDown(); 2106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#ifdef ENABLE_LOGGING_AND_PROFILING 2126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static void StartProfiling(const char* title); 2136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static void StartProfiling(String* title); 2146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static CpuProfile* StopProfiling(const char* title); 2156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static CpuProfile* StopProfiling(String* title); 2166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static int GetProfilesCount(); 2176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static CpuProfile* GetProfile(int index); 2186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static CpuProfile* FindProfile(unsigned uid); 2196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // Invoked from stack sampler (thread or signal handler.) 2216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static TickSample* TickSampleEvent(); 2226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // Must be called via PROFILE macro, otherwise will crash when 2246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block // profiling is not enabled. 2256ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static void CallbackEvent(String* name, Address entry_point); 2266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static void CodeCreateEvent(Logger::LogEventsAndTags tag, 2276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Code* code, const char* comment); 2286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static void CodeCreateEvent(Logger::LogEventsAndTags tag, 2296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Code* code, String* name); 2306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static void CodeCreateEvent(Logger::LogEventsAndTags tag, 2316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Code* code, String* name, 2326ded16be15dd865a9b21ea304d5273c8be299c87Steve Block String* source, int line); 2336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static void CodeCreateEvent(Logger::LogEventsAndTags tag, 2346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Code* code, int args_count); 2356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static void CodeMoveEvent(Address from, Address to); 2366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static void CodeDeleteEvent(Address from); 2376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static void FunctionCreateEvent(JSFunction* function); 2386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static void FunctionMoveEvent(Address from, Address to); 2396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static void FunctionDeleteEvent(Address from); 2406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static void GetterCallbackEvent(String* name, Address entry_point); 2416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static void RegExpCodeCreateEvent(Code* code, String* source); 2426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static void SetterCallbackEvent(String* name, Address entry_point); 2436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static INLINE(bool is_profiling()) { 2456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return singleton_ != NULL && singleton_->processor_ != NULL; 2466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 2476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block private: 2496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CpuProfiler(); 2506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ~CpuProfiler(); 2516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block void StartCollectingProfile(const char* title); 2526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block void StartCollectingProfile(String* title); 2536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block void StartProcessorIfNotStarted(); 2546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CpuProfile* StopCollectingProfile(const char* title); 2556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CpuProfile* StopCollectingProfile(String* title); 2566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block void StopProcessorIfLastProfile(); 2576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block CpuProfilesCollection* profiles_; 2596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block unsigned next_profile_uid_; 2606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ProfileGenerator* generator_; 2616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ProfilerEventsProcessor* processor_; 2626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block int saved_logging_nesting_; 2636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static CpuProfiler* singleton_; 2656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#else 2676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block static INLINE(bool is_profiling()) { return false; } 2686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#endif // ENABLE_LOGGING_AND_PROFILING 2696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block private: 2716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block DISALLOW_COPY_AND_ASSIGN(CpuProfiler); 2726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}; 2736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} } // namespace v8::internal 2756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#endif // V8_CPU_PROFILER_H_ 278