Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1343)

Side by Side Diff: src/profile-generator.cc

Issue 259803002: Add timestamps to CPU profile samples. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fix race Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/profile-generator.h ('k') | src/sampler.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
352 } 352 }
353 353
354 354
355 CpuProfile::CpuProfile(const char* title, bool record_samples) 355 CpuProfile::CpuProfile(const char* title, bool record_samples)
356 : title_(title), 356 : title_(title),
357 record_samples_(record_samples), 357 record_samples_(record_samples),
358 start_time_(TimeTicks::HighResolutionNow()) { 358 start_time_(TimeTicks::HighResolutionNow()) {
359 } 359 }
360 360
361 361
362 void CpuProfile::AddPath(const Vector<CodeEntry*>& path) { 362 void CpuProfile::AddPath(TimeTicks timestamp, const Vector<CodeEntry*>& path) {
363 ProfileNode* top_frame_node = top_down_.AddPathFromEnd(path); 363 ProfileNode* top_frame_node = top_down_.AddPathFromEnd(path);
364 if (record_samples_) samples_.Add(top_frame_node); 364 if (record_samples_) {
365 timestamps_.Add(timestamp);
366 samples_.Add(top_frame_node);
367 }
365 } 368 }
366 369
367 370
368 void CpuProfile::CalculateTotalTicksAndSamplingRate() { 371 void CpuProfile::CalculateTotalTicksAndSamplingRate() {
369 end_time_ = TimeTicks::HighResolutionNow(); 372 end_time_ = TimeTicks::HighResolutionNow();
370 } 373 }
371 374
372 375
373 void CpuProfile::Print() { 376 void CpuProfile::Print() {
374 OS::Print("[Top down]:\n"); 377 OS::Print("[Top down]:\n");
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 if (profile == finished_profiles_[i]) { 541 if (profile == finished_profiles_[i]) {
539 finished_profiles_.Remove(i); 542 finished_profiles_.Remove(i);
540 return; 543 return;
541 } 544 }
542 } 545 }
543 UNREACHABLE(); 546 UNREACHABLE();
544 } 547 }
545 548
546 549
547 void CpuProfilesCollection::AddPathToCurrentProfiles( 550 void CpuProfilesCollection::AddPathToCurrentProfiles(
548 const Vector<CodeEntry*>& path) { 551 TimeTicks timestamp, const Vector<CodeEntry*>& path) {
549 // As starting / stopping profiles is rare relatively to this 552 // As starting / stopping profiles is rare relatively to this
550 // method, we don't bother minimizing the duration of lock holding, 553 // method, we don't bother minimizing the duration of lock holding,
551 // e.g. copying contents of the list to a local vector. 554 // e.g. copying contents of the list to a local vector.
552 current_profiles_semaphore_.Wait(); 555 current_profiles_semaphore_.Wait();
553 for (int i = 0; i < current_profiles_.length(); ++i) { 556 for (int i = 0; i < current_profiles_.length(); ++i) {
554 current_profiles_[i]->AddPath(path); 557 current_profiles_[i]->AddPath(timestamp, path);
555 } 558 }
556 current_profiles_semaphore_.Signal(); 559 current_profiles_semaphore_.Signal();
557 } 560 }
558 561
559 562
560 CodeEntry* CpuProfilesCollection::NewCodeEntry( 563 CodeEntry* CpuProfilesCollection::NewCodeEntry(
561 Logger::LogEventsAndTags tag, 564 Logger::LogEventsAndTags tag,
562 const char* name, 565 const char* name,
563 const char* name_prefix, 566 const char* name_prefix,
564 const char* resource_name, 567 const char* resource_name,
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
667 no_symbolized_entries = false; 670 no_symbolized_entries = false;
668 break; 671 break;
669 } 672 }
670 } 673 }
671 // If no frames were symbolized, put the VM state entry in. 674 // If no frames were symbolized, put the VM state entry in.
672 if (no_symbolized_entries) { 675 if (no_symbolized_entries) {
673 *entry++ = EntryForVMState(sample.state); 676 *entry++ = EntryForVMState(sample.state);
674 } 677 }
675 } 678 }
676 679
677 profiles_->AddPathToCurrentProfiles(entries); 680 profiles_->AddPathToCurrentProfiles(sample.timestamp, entries);
678 } 681 }
679 682
680 683
681 CodeEntry* ProfileGenerator::EntryForVMState(StateTag tag) { 684 CodeEntry* ProfileGenerator::EntryForVMState(StateTag tag) {
682 switch (tag) { 685 switch (tag) {
683 case GC: 686 case GC:
684 return gc_entry_; 687 return gc_entry_;
685 case JS: 688 case JS:
686 case COMPILER: 689 case COMPILER:
687 // DOM events handlers are reported as OTHER / EXTERNAL entries. 690 // DOM events handlers are reported as OTHER / EXTERNAL entries.
688 // To avoid confusing people, let's put all these entries into 691 // To avoid confusing people, let's put all these entries into
689 // one bucket. 692 // one bucket.
690 case OTHER: 693 case OTHER:
691 case EXTERNAL: 694 case EXTERNAL:
692 return program_entry_; 695 return program_entry_;
693 case IDLE: 696 case IDLE:
694 return idle_entry_; 697 return idle_entry_;
695 default: return NULL; 698 default: return NULL;
696 } 699 }
697 } 700 }
698 701
699 } } // namespace v8::internal 702 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/profile-generator.h ('k') | src/sampler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698