OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 void TokenEnumerator::TokenRemoved(Object** token_location) { | 79 void TokenEnumerator::TokenRemoved(Object** token_location) { |
80 for (int i = 0; i < token_locations_.length(); ++i) { | 80 for (int i = 0; i < token_locations_.length(); ++i) { |
81 if (token_locations_[i] == token_location && !token_removed_[i]) { | 81 if (token_locations_[i] == token_location && !token_removed_[i]) { |
82 token_removed_[i] = true; | 82 token_removed_[i] = true; |
83 return; | 83 return; |
84 } | 84 } |
85 } | 85 } |
86 } | 86 } |
87 | 87 |
88 | 88 |
| 89 StringsStorage::StringsStorage() |
| 90 : names_(StringsMatch) { |
| 91 } |
| 92 |
| 93 |
| 94 StringsStorage::~StringsStorage() { |
| 95 for (HashMap::Entry* p = names_.Start(); |
| 96 p != NULL; |
| 97 p = names_.Next(p)) { |
| 98 DeleteArray(reinterpret_cast<const char*>(p->value)); |
| 99 } |
| 100 } |
| 101 |
| 102 |
| 103 const char* StringsStorage::GetName(String* name) { |
| 104 if (name->IsString()) { |
| 105 char* c_name = |
| 106 name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL).Detach(); |
| 107 HashMap::Entry* cache_entry = names_.Lookup(c_name, name->Hash(), true); |
| 108 if (cache_entry->value == NULL) { |
| 109 // New entry added. |
| 110 cache_entry->value = c_name; |
| 111 } else { |
| 112 DeleteArray(c_name); |
| 113 } |
| 114 return reinterpret_cast<const char*>(cache_entry->value); |
| 115 } |
| 116 return ""; |
| 117 } |
| 118 |
| 119 |
89 const char* CodeEntry::kEmptyNamePrefix = ""; | 120 const char* CodeEntry::kEmptyNamePrefix = ""; |
90 unsigned CodeEntry::next_call_uid_ = 1; | 121 unsigned CodeEntry::next_call_uid_ = 1; |
91 | 122 |
92 | 123 |
93 void CodeEntry::CopyData(const CodeEntry& source) { | 124 void CodeEntry::CopyData(const CodeEntry& source) { |
94 call_uid_ = source.call_uid_; | 125 call_uid_ = source.call_uid_; |
95 tag_ = source.tag_; | 126 tag_ = source.tag_; |
96 name_prefix_ = source.name_prefix_; | 127 name_prefix_ = source.name_prefix_; |
97 name_ = source.name_; | 128 name_ = source.name_; |
98 resource_name_ = source.resource_name_; | 129 resource_name_ = source.resource_name_; |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
431 } | 462 } |
432 | 463 |
433 | 464 |
434 void CodeMap::Print() { | 465 void CodeMap::Print() { |
435 CodeTreePrinter printer; | 466 CodeTreePrinter printer; |
436 tree_.ForEach(&printer); | 467 tree_.ForEach(&printer); |
437 } | 468 } |
438 | 469 |
439 | 470 |
440 CpuProfilesCollection::CpuProfilesCollection() | 471 CpuProfilesCollection::CpuProfilesCollection() |
441 : function_and_resource_names_(StringsMatch), | 472 : profiles_uids_(UidsMatch), |
442 profiles_uids_(UidsMatch), | |
443 current_profiles_semaphore_(OS::CreateSemaphore(1)) { | 473 current_profiles_semaphore_(OS::CreateSemaphore(1)) { |
444 // Create list of unabridged profiles. | 474 // Create list of unabridged profiles. |
445 profiles_by_token_.Add(new List<CpuProfile*>()); | 475 profiles_by_token_.Add(new List<CpuProfile*>()); |
446 } | 476 } |
447 | 477 |
448 | 478 |
449 static void DeleteArgsCountName(char** name_ptr) { | 479 static void DeleteArgsCountName(char** name_ptr) { |
450 DeleteArray(*name_ptr); | 480 DeleteArray(*name_ptr); |
451 } | 481 } |
452 | 482 |
(...skipping 10 matching lines...) Expand all Loading... |
463 (*list_ptr)->Iterate(DeleteCpuProfile); | 493 (*list_ptr)->Iterate(DeleteCpuProfile); |
464 delete *list_ptr; | 494 delete *list_ptr; |
465 } | 495 } |
466 | 496 |
467 CpuProfilesCollection::~CpuProfilesCollection() { | 497 CpuProfilesCollection::~CpuProfilesCollection() { |
468 delete current_profiles_semaphore_; | 498 delete current_profiles_semaphore_; |
469 current_profiles_.Iterate(DeleteCpuProfile); | 499 current_profiles_.Iterate(DeleteCpuProfile); |
470 profiles_by_token_.Iterate(DeleteProfilesList); | 500 profiles_by_token_.Iterate(DeleteProfilesList); |
471 code_entries_.Iterate(DeleteCodeEntry); | 501 code_entries_.Iterate(DeleteCodeEntry); |
472 args_count_names_.Iterate(DeleteArgsCountName); | 502 args_count_names_.Iterate(DeleteArgsCountName); |
473 for (HashMap::Entry* p = function_and_resource_names_.Start(); | |
474 p != NULL; | |
475 p = function_and_resource_names_.Next(p)) { | |
476 DeleteArray(reinterpret_cast<const char*>(p->value)); | |
477 } | |
478 } | 503 } |
479 | 504 |
480 | 505 |
481 bool CpuProfilesCollection::StartProfiling(const char* title, unsigned uid) { | 506 bool CpuProfilesCollection::StartProfiling(const char* title, unsigned uid) { |
482 ASSERT(uid > 0); | 507 ASSERT(uid > 0); |
483 current_profiles_semaphore_->Wait(); | 508 current_profiles_semaphore_->Wait(); |
484 for (int i = 0; i < current_profiles_.length(); ++i) { | 509 for (int i = 0; i < current_profiles_.length(); ++i) { |
485 if (strcmp(current_profiles_[i]->title(), title) == 0) { | 510 if (strcmp(current_profiles_[i]->title(), title) == 0) { |
486 // Ignore attempts to start profile with the same title. | 511 // Ignore attempts to start profile with the same title. |
487 current_profiles_semaphore_->Signal(); | 512 current_profiles_semaphore_->Signal(); |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
659 } | 684 } |
660 | 685 |
661 | 686 |
662 CodeEntry* CpuProfilesCollection::NewCodeEntry(int security_token_id) { | 687 CodeEntry* CpuProfilesCollection::NewCodeEntry(int security_token_id) { |
663 CodeEntry* entry = new CodeEntry(security_token_id); | 688 CodeEntry* entry = new CodeEntry(security_token_id); |
664 code_entries_.Add(entry); | 689 code_entries_.Add(entry); |
665 return entry; | 690 return entry; |
666 } | 691 } |
667 | 692 |
668 | 693 |
669 const char* CpuProfilesCollection::GetName(String* name) { | |
670 if (name->IsString()) { | |
671 char* c_name = | |
672 name->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL).Detach(); | |
673 HashMap::Entry* cache_entry = | |
674 function_and_resource_names_.Lookup(c_name, | |
675 name->Hash(), | |
676 true); | |
677 if (cache_entry->value == NULL) { | |
678 // New entry added. | |
679 cache_entry->value = c_name; | |
680 } else { | |
681 DeleteArray(c_name); | |
682 } | |
683 return reinterpret_cast<const char*>(cache_entry->value); | |
684 } else { | |
685 return ""; | |
686 } | |
687 } | |
688 | |
689 | |
690 const char* CpuProfilesCollection::GetName(int args_count) { | 694 const char* CpuProfilesCollection::GetName(int args_count) { |
691 ASSERT(args_count >= 0); | 695 ASSERT(args_count >= 0); |
692 if (args_count_names_.length() <= args_count) { | 696 if (args_count_names_.length() <= args_count) { |
693 args_count_names_.AddBlock( | 697 args_count_names_.AddBlock( |
694 NULL, args_count - args_count_names_.length() + 1); | 698 NULL, args_count - args_count_names_.length() + 1); |
695 } | 699 } |
696 if (args_count_names_[args_count] == NULL) { | 700 if (args_count_names_[args_count] == NULL) { |
697 const int kMaximumNameLength = 32; | 701 const int kMaximumNameLength = 32; |
698 char* name = NewArray<char>(kMaximumNameLength); | 702 char* name = NewArray<char>(kMaximumNameLength); |
699 OS::SNPrintF(Vector<char>(name, kMaximumNameLength), "%d", args_count); | 703 OS::SNPrintF(Vector<char>(name, kMaximumNameLength), "%d", args_count); |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
803 *entry++ = EntryForVMState(sample.state); | 807 *entry++ = EntryForVMState(sample.state); |
804 } | 808 } |
805 } | 809 } |
806 | 810 |
807 profiles_->AddPathToCurrentProfiles(entries); | 811 profiles_->AddPathToCurrentProfiles(entries); |
808 } | 812 } |
809 | 813 |
810 } } // namespace v8::internal | 814 } } // namespace v8::internal |
811 | 815 |
812 #endif // ENABLE_LOGGING_AND_PROFILING | 816 #endif // ENABLE_LOGGING_AND_PROFILING |
OLD | NEW |