OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/profiler/profile-generator.h" | 5 #include "src/profiler/profile-generator.h" |
6 | 6 |
7 #include "src/ast/scopeinfo.h" | 7 #include "src/ast/scopeinfo.h" |
8 #include "src/debug/debug.h" | 8 #include "src/debug/debug.h" |
9 #include "src/deoptimizer.h" | 9 #include "src/deoptimizer.h" |
10 #include "src/global-handles.h" | 10 #include "src/global-handles.h" |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
242 void BeforeTraversingChild(ProfileNode*, ProfileNode*) { } | 242 void BeforeTraversingChild(ProfileNode*, ProfileNode*) { } |
243 | 243 |
244 void AfterAllChildrenTraversed(ProfileNode* node) { | 244 void AfterAllChildrenTraversed(ProfileNode* node) { |
245 delete node; | 245 delete node; |
246 } | 246 } |
247 | 247 |
248 void AfterChildTraversed(ProfileNode*, ProfileNode*) { } | 248 void AfterChildTraversed(ProfileNode*, ProfileNode*) { } |
249 }; | 249 }; |
250 | 250 |
251 | 251 |
252 ProfileTree::ProfileTree() | 252 ProfileTree::ProfileTree(Isolate* isolate) |
253 : root_entry_(Logger::FUNCTION_TAG, "(root)"), | 253 : root_entry_(Logger::FUNCTION_TAG, "(root)"), |
254 next_node_id_(1), | 254 next_node_id_(1), |
255 root_(new ProfileNode(this, &root_entry_)), | 255 root_(new ProfileNode(this, &root_entry_)), |
| 256 isolate_(isolate), |
256 next_function_id_(1), | 257 next_function_id_(1), |
257 function_ids_(ProfileNode::CodeEntriesMatch) {} | 258 function_ids_(ProfileNode::CodeEntriesMatch) {} |
258 | 259 |
259 | 260 |
260 ProfileTree::~ProfileTree() { | 261 ProfileTree::~ProfileTree() { |
261 DeleteNodesCallback cb; | 262 DeleteNodesCallback cb; |
262 TraverseDepthFirst(&cb); | 263 TraverseDepthFirst(&cb); |
263 } | 264 } |
264 | 265 |
265 | 266 |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 callback->AfterChildTraversed(parent.node, current.node); | 341 callback->AfterChildTraversed(parent.node, current.node); |
341 parent.next_child(); | 342 parent.next_child(); |
342 } | 343 } |
343 // Remove child from the stack. | 344 // Remove child from the stack. |
344 stack.RemoveLast(); | 345 stack.RemoveLast(); |
345 } | 346 } |
346 } | 347 } |
347 } | 348 } |
348 | 349 |
349 | 350 |
350 CpuProfile::CpuProfile(const char* title, bool record_samples) | 351 CpuProfile::CpuProfile(Isolate* isolate, const char* title, bool record_samples) |
351 : title_(title), | 352 : title_(title), |
352 record_samples_(record_samples), | 353 record_samples_(record_samples), |
353 start_time_(base::TimeTicks::HighResolutionNow()) { | 354 start_time_(base::TimeTicks::HighResolutionNow()), |
354 } | 355 top_down_(isolate) {} |
355 | 356 |
356 | 357 |
357 void CpuProfile::AddPath(base::TimeTicks timestamp, | 358 void CpuProfile::AddPath(base::TimeTicks timestamp, |
358 const Vector<CodeEntry*>& path, int src_line) { | 359 const Vector<CodeEntry*>& path, int src_line) { |
359 ProfileNode* top_frame_node = top_down_.AddPathFromEnd(path, src_line); | 360 ProfileNode* top_frame_node = top_down_.AddPathFromEnd(path, src_line); |
360 if (record_samples_) { | 361 if (record_samples_) { |
361 timestamps_.Add(timestamp); | 362 timestamps_.Add(timestamp); |
362 samples_.Add(top_frame_node); | 363 samples_.Add(top_frame_node); |
363 } | 364 } |
364 } | 365 } |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
433 | 434 |
434 | 435 |
435 void CodeMap::Print() { | 436 void CodeMap::Print() { |
436 CodeTreePrinter printer; | 437 CodeTreePrinter printer; |
437 tree_.ForEach(&printer); | 438 tree_.ForEach(&printer); |
438 } | 439 } |
439 | 440 |
440 | 441 |
441 CpuProfilesCollection::CpuProfilesCollection(Heap* heap) | 442 CpuProfilesCollection::CpuProfilesCollection(Heap* heap) |
442 : function_and_resource_names_(heap), | 443 : function_and_resource_names_(heap), |
443 current_profiles_semaphore_(1) { | 444 isolate_(heap->isolate()), |
444 } | 445 current_profiles_semaphore_(1) {} |
445 | 446 |
446 | 447 |
447 static void DeleteCodeEntry(CodeEntry** entry_ptr) { | 448 static void DeleteCodeEntry(CodeEntry** entry_ptr) { |
448 delete *entry_ptr; | 449 delete *entry_ptr; |
449 } | 450 } |
450 | 451 |
451 | 452 |
452 static void DeleteCpuProfile(CpuProfile** profile_ptr) { | 453 static void DeleteCpuProfile(CpuProfile** profile_ptr) { |
453 delete *profile_ptr; | 454 delete *profile_ptr; |
454 } | 455 } |
(...skipping 14 matching lines...) Expand all Loading... |
469 return false; | 470 return false; |
470 } | 471 } |
471 for (int i = 0; i < current_profiles_.length(); ++i) { | 472 for (int i = 0; i < current_profiles_.length(); ++i) { |
472 if (strcmp(current_profiles_[i]->title(), title) == 0) { | 473 if (strcmp(current_profiles_[i]->title(), title) == 0) { |
473 // Ignore attempts to start profile with the same title... | 474 // Ignore attempts to start profile with the same title... |
474 current_profiles_semaphore_.Signal(); | 475 current_profiles_semaphore_.Signal(); |
475 // ... though return true to force it collect a sample. | 476 // ... though return true to force it collect a sample. |
476 return true; | 477 return true; |
477 } | 478 } |
478 } | 479 } |
479 current_profiles_.Add(new CpuProfile(title, record_samples)); | 480 current_profiles_.Add(new CpuProfile(isolate_, title, record_samples)); |
480 current_profiles_semaphore_.Signal(); | 481 current_profiles_semaphore_.Signal(); |
481 return true; | 482 return true; |
482 } | 483 } |
483 | 484 |
484 | 485 |
485 CpuProfile* CpuProfilesCollection::StopProfiling(const char* title) { | 486 CpuProfile* CpuProfilesCollection::StopProfiling(const char* title) { |
486 const int title_len = StrLength(title); | 487 const int title_len = StrLength(title); |
487 CpuProfile* profile = NULL; | 488 CpuProfile* profile = NULL; |
488 current_profiles_semaphore_.Wait(); | 489 current_profiles_semaphore_.Wait(); |
489 for (int i = current_profiles_.length() - 1; i >= 0; --i) { | 490 for (int i = current_profiles_.length() - 1; i >= 0; --i) { |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
685 case EXTERNAL: | 686 case EXTERNAL: |
686 return program_entry_; | 687 return program_entry_; |
687 case IDLE: | 688 case IDLE: |
688 return idle_entry_; | 689 return idle_entry_; |
689 default: return NULL; | 690 default: return NULL; |
690 } | 691 } |
691 } | 692 } |
692 | 693 |
693 } // namespace internal | 694 } // namespace internal |
694 } // namespace v8 | 695 } // namespace v8 |
OLD | NEW |