| Index: src/cpu-profiler.h
|
| diff --git a/src/cpu-profiler.h b/src/cpu-profiler.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7c838fd2513b42df3bd9e291dacac019ae063dc0
|
| --- /dev/null
|
| +++ b/src/cpu-profiler.h
|
| @@ -0,0 +1,180 @@
|
| +// Copyright 2010 the V8 project authors. All rights reserved.
|
| +// Redistribution and use in source and binary forms, with or without
|
| +// modification, are permitted provided that the following conditions are
|
| +// met:
|
| +//
|
| +// * Redistributions of source code must retain the above copyright
|
| +// notice, this list of conditions and the following disclaimer.
|
| +// * Redistributions in binary form must reproduce the above
|
| +// copyright notice, this list of conditions and the following
|
| +// disclaimer in the documentation and/or other materials provided
|
| +// with the distribution.
|
| +// * Neither the name of Google Inc. nor the names of its
|
| +// contributors may be used to endorse or promote products derived
|
| +// from this software without specific prior written permission.
|
| +//
|
| +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| +
|
| +#ifndef V8_CPU_PROFILER_H_
|
| +#define V8_CPU_PROFILER_H_
|
| +
|
| +#include "circular-queue.h"
|
| +#include "profile-generator.h"
|
| +
|
| +namespace v8 {
|
| +namespace internal {
|
| +
|
| +
|
| +#define CODE_EVENTS_TYPE_LIST(V) \
|
| + V(CODE_CREATION, CodeCreateEventRecord) \
|
| + V(CODE_MOVE, CodeMoveEventRecord) \
|
| + V(CODE_DELETE, CodeDeleteEventRecord) \
|
| + V(CODE_ALIAS, CodeAliasEventRecord)
|
| +
|
| +
|
| +class CodeEventRecord {
|
| + public:
|
| +#define DECLARE_TYPE(type, ignore) type,
|
| + enum Type {
|
| + NONE = 0,
|
| + CODE_EVENTS_TYPE_LIST(DECLARE_TYPE)
|
| + NUMBER_OF_TYPES
|
| + };
|
| +#undef DECLARE_TYPE
|
| +
|
| + Type type;
|
| + unsigned order;
|
| +};
|
| +
|
| +
|
| +class CodeCreateEventRecord : public CodeEventRecord {
|
| + public:
|
| + Address start;
|
| + CodeEntry* entry;
|
| + unsigned size;
|
| +
|
| + INLINE(void UpdateCodeMap(CodeMap* code_map)) {
|
| + code_map->AddCode(start, entry, size);
|
| + }
|
| +};
|
| +
|
| +
|
| +class CodeMoveEventRecord : public CodeEventRecord {
|
| + public:
|
| + Address from;
|
| + Address to;
|
| +
|
| + INLINE(void UpdateCodeMap(CodeMap* code_map)) {
|
| + code_map->MoveCode(from, to);
|
| + }
|
| +};
|
| +
|
| +
|
| +class CodeDeleteEventRecord : public CodeEventRecord {
|
| + public:
|
| + Address start;
|
| +
|
| + INLINE(void UpdateCodeMap(CodeMap* code_map)) {
|
| + code_map->DeleteCode(start);
|
| + }
|
| +};
|
| +
|
| +
|
| +class CodeAliasEventRecord : public CodeEventRecord {
|
| + public:
|
| + Address alias;
|
| + Address start;
|
| +
|
| + INLINE(void UpdateCodeMap(CodeMap* code_map)) {
|
| + code_map->AddAlias(alias, start);
|
| + }
|
| +};
|
| +
|
| +
|
| +class TickSampleEventRecord {
|
| + public:
|
| + // In memory, the first machine word of a TickSampleEventRecord will be the
|
| + // first entry of TickSample, that is -- a program counter field.
|
| + // TickSample is put first, because 'order' can become equal to
|
| + // SamplingCircularQueue::kClear, while program counter can't.
|
| + TickSample sample;
|
| + unsigned order;
|
| +
|
| + private:
|
| + // Disable instantiation.
|
| + TickSampleEventRecord();
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TickSampleEventRecord);
|
| +};
|
| +
|
| +
|
| +// This class implements both the profile events processor thread and
|
| +// methods called by event producers: VM and stack sampler threads.
|
| +class ProfilerEventsProcessor : public Thread {
|
| + public:
|
| + explicit ProfilerEventsProcessor(ProfileGenerator* generator);
|
| + virtual ~ProfilerEventsProcessor() { }
|
| +
|
| + // Thread control.
|
| + virtual void Run();
|
| + inline void Stop() { running_ = false; }
|
| +
|
| + // Events adding methods. Called by VM threads.
|
| + void CodeCreateEvent(Logger::LogEventsAndTags tag,
|
| + String* name,
|
| + String* resource_name, int line_number,
|
| + Address start, unsigned size);
|
| + void CodeCreateEvent(Logger::LogEventsAndTags tag,
|
| + const char* name,
|
| + Address start, unsigned size);
|
| + void CodeCreateEvent(Logger::LogEventsAndTags tag,
|
| + int args_count,
|
| + Address start, unsigned size);
|
| + void CodeMoveEvent(Address from, Address to);
|
| + void CodeDeleteEvent(Address from);
|
| + void FunctionCreateEvent(Address alias, Address start);
|
| + void FunctionMoveEvent(Address from, Address to);
|
| + void FunctionDeleteEvent(Address from);
|
| +
|
| + // Tick sampler registration. Called by sampler thread or signal handler.
|
| + inline void SetUpSamplesProducer() { ticks_buffer_.SetUpProducer(); }
|
| + // Tick sample events are filled directly in the buffer of the circular
|
| + // queue (because the structure is of fixed width, but usually not all
|
| + // stack frame entries are filled.) This method returns a pointer to the
|
| + // next record of the buffer.
|
| + INLINE(TickSample* TickSampleEvent());
|
| + inline void TearDownSamplesProducer() { ticks_buffer_.TearDownProducer(); }
|
| +
|
| + private:
|
| + union CodeEventsContainer {
|
| + CodeEventRecord generic;
|
| +#define DECLARE_CLASS(ignore, type) type type##_;
|
| + CODE_EVENTS_TYPE_LIST(DECLARE_CLASS)
|
| +#undef DECLARE_TYPE
|
| + };
|
| +
|
| + // Called from events processing thread (Run() method.)
|
| + bool ProcessCodeEvent(unsigned* dequeue_order);
|
| + bool ProcessTicks(unsigned dequeue_order);
|
| +
|
| + ProfileGenerator* generator_;
|
| + bool running_;
|
| + CircularQueue<CodeEventsContainer> events_buffer_;
|
| + SamplingCircularQueue ticks_buffer_;
|
| + unsigned enqueue_order_;
|
| +};
|
| +
|
| +
|
| +} } // namespace v8::internal
|
| +
|
| +#endif // V8_CPU_PROFILER_H_
|
|
|