| Index: src/profile-generator.h
|
| diff --git a/src/profile-generator.h b/src/profile-generator.h
|
| index c0454cb821f6902b35f7e480023d2fab0bdd07e1..78e64a958e6e89eaf0a133fa7339b57e2adb5d64 100644
|
| --- a/src/profile-generator.h
|
| +++ b/src/profile-generator.h
|
| @@ -33,6 +33,7 @@
|
| namespace v8 {
|
| namespace internal {
|
|
|
| +#ifdef ENABLE_CPP_PROFILES_PROCESSOR
|
|
|
| class CodeEntry {
|
| public:
|
| @@ -44,6 +45,8 @@ class CodeEntry {
|
|
|
| INLINE(bool is_js_function());
|
| INLINE(const char* name()) { return name_; }
|
| + INLINE(const char* resource_name()) { return name_; }
|
| + INLINE(int line_number()) { return line_number_; }
|
|
|
| private:
|
| Logger::LogEventsAndTags tag_;
|
| @@ -67,7 +70,7 @@ class ProfileNode {
|
| INLINE(CodeEntry* entry() const) { return entry_; }
|
| INLINE(unsigned total_ticks() const) { return total_ticks_; }
|
| INLINE(unsigned self_ticks() const) { return self_ticks_; }
|
| - void GetChildren(List<ProfileNode*>* children);
|
| + INLINE(const List<ProfileNode*>* children() const) { return &children_list_; }
|
|
|
| void Print(int indent);
|
|
|
| @@ -85,14 +88,13 @@ class ProfileNode {
|
| unsigned self_ticks_;
|
| // CodeEntry* -> ProfileNode*
|
| HashMap children_;
|
| -
|
| - friend class ProfileTree;
|
| + List<ProfileNode*> children_list_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(ProfileNode);
|
| };
|
|
|
|
|
| -class ProfileTree BASE_EMBEDDED {
|
| +class ProfileTree {
|
| public:
|
| ProfileTree() : root_(new ProfileNode(NULL)) { }
|
| ~ProfileTree();
|
| @@ -101,7 +103,7 @@ class ProfileTree BASE_EMBEDDED {
|
| void AddPathFromStart(const Vector<CodeEntry*>& path);
|
| void CalculateTotalTicks();
|
|
|
| - ProfileNode* root() { return root_; }
|
| + ProfileNode* root() const { return root_; }
|
|
|
| void ShortPrint();
|
| void Print() {
|
| @@ -120,18 +122,24 @@ class ProfileTree BASE_EMBEDDED {
|
|
|
| class CpuProfile {
|
| public:
|
| - CpuProfile() { }
|
| + CpuProfile(const char* title, unsigned uid)
|
| + : title_(title), uid_(uid) { }
|
| +
|
| // Add pc -> ... -> main() call path to the profile.
|
| void AddPath(const Vector<CodeEntry*>& path);
|
| void CalculateTotalTicks();
|
|
|
| - INLINE(ProfileTree* top_down()) { return &top_down_; }
|
| - INLINE(ProfileTree* bottom_up()) { return &bottom_up_; }
|
| + INLINE(const char* title() const) { return title_; }
|
| + INLINE(unsigned uid() const) { return uid_; }
|
| + INLINE(const ProfileTree* top_down() const) { return &top_down_; }
|
| + INLINE(const ProfileTree* bottom_up() const) { return &bottom_up_; }
|
|
|
| void ShortPrint();
|
| void Print();
|
|
|
| private:
|
| + const char* title_;
|
| + unsigned uid_;
|
| ProfileTree top_down_;
|
| ProfileTree bottom_up_;
|
|
|
| @@ -139,7 +147,7 @@ class CpuProfile {
|
| };
|
|
|
|
|
| -class CodeMap BASE_EMBEDDED {
|
| +class CodeMap {
|
| public:
|
| CodeMap() { }
|
| INLINE(void AddCode(Address addr, CodeEntry* entry, unsigned size));
|
| @@ -148,6 +156,8 @@ class CodeMap BASE_EMBEDDED {
|
| void AddAlias(Address alias, Address addr);
|
| CodeEntry* FindEntry(Address addr);
|
|
|
| + void Print();
|
| +
|
| private:
|
| struct CodeEntryInfo {
|
| CodeEntryInfo(CodeEntry* an_entry, unsigned a_size)
|
| @@ -167,6 +177,11 @@ class CodeMap BASE_EMBEDDED {
|
| };
|
| typedef SplayTree<CodeTreeConfig> CodeTree;
|
|
|
| + class CodeTreePrinter {
|
| + public:
|
| + void Call(const Address& key, const CodeEntryInfo& value);
|
| + };
|
| +
|
| CodeTree tree_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(CodeMap);
|
| @@ -178,14 +193,24 @@ class CpuProfilesCollection {
|
| CpuProfilesCollection();
|
| ~CpuProfilesCollection();
|
|
|
| - void AddProfile(unsigned uid);
|
| + bool StartProfiling(const char* title, unsigned uid);
|
| + bool StartProfiling(String* title, unsigned uid);
|
| + CpuProfile* StopProfiling(const char* title);
|
| + CpuProfile* StopProfiling(String* title);
|
| + INLINE(List<CpuProfile*>* profiles()) { return &profiles_; }
|
| + CpuProfile* GetProfile(unsigned uid);
|
| + inline bool is_last_profile();
|
|
|
| CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag,
|
| String* name, String* resource_name, int line_number);
|
| CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag, const char* name);
|
| CodeEntry* NewCodeEntry(Logger::LogEventsAndTags tag, int args_count);
|
|
|
| - INLINE(CpuProfile* profile()) { return profiles_.last(); }
|
| + // Called from profile generator thread.
|
| + void AddPathToCurrentProfiles(const Vector<CodeEntry*>& path);
|
| +
|
| + // This will be moved to V8 API.
|
| + static const int kNoLineNumberInfo = -1;
|
|
|
| private:
|
| const char* GetName(String* name);
|
| @@ -196,12 +221,22 @@ class CpuProfilesCollection {
|
| reinterpret_cast<char*>(key2)) == 0;
|
| }
|
|
|
| + INLINE(static bool CpuProfilesMatch(void* key1, void* key2)) {
|
| + return key1 == key2;
|
| + }
|
| +
|
| // String::Hash -> const char*
|
| HashMap function_and_resource_names_;
|
| // args_count -> char*
|
| List<char*> args_count_names_;
|
| List<CodeEntry*> code_entries_;
|
| List<CpuProfile*> profiles_;
|
| + // uid -> CpuProfile*
|
| + HashMap profiles_uids_;
|
| +
|
| + // Accessed by VM thread and profile generator thread.
|
| + List<CpuProfile*> current_profiles_;
|
| + Semaphore* current_profiles_semaphore_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(CpuProfilesCollection);
|
| };
|
| @@ -233,14 +268,13 @@ class ProfileGenerator {
|
| INLINE(CodeMap* code_map()) { return &code_map_; }
|
|
|
| private:
|
| - INLINE(CpuProfile* profile()) { return profiles_->profile(); }
|
| -
|
| CpuProfilesCollection* profiles_;
|
| CodeMap code_map_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(ProfileGenerator);
|
| };
|
|
|
| +#endif // ENABLE_CPP_PROFILES_PROCESSOR
|
|
|
| } } // namespace v8::internal
|
|
|
|
|