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

Side by Side Diff: src/log.cc

Issue 640773002: Make Profiler::running_ atomic. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 2 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 | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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/log.h" 5 #include "src/log.h"
6 6
7 #include <cstdarg> 7 #include <cstdarg>
8 #include <sstream> 8 #include <sstream>
9 9
10 #include "src/v8.h" 10 #include "src/v8.h"
(...skipping 634 matching lines...) Expand 10 before | Expand all | Expand 10 after
645 int head_; // Index to the buffer head. 645 int head_; // Index to the buffer head.
646 base::Atomic32 tail_; // Index to the buffer tail. 646 base::Atomic32 tail_; // Index to the buffer tail.
647 bool overflow_; // Tell whether a buffer overflow has occurred. 647 bool overflow_; // Tell whether a buffer overflow has occurred.
648 // Sempahore used for buffer synchronization. 648 // Sempahore used for buffer synchronization.
649 base::Semaphore buffer_semaphore_; 649 base::Semaphore buffer_semaphore_;
650 650
651 // Tells whether profiler is engaged, that is, processing thread is stated. 651 // Tells whether profiler is engaged, that is, processing thread is stated.
652 bool engaged_; 652 bool engaged_;
653 653
654 // Tells whether worker thread should continue running. 654 // Tells whether worker thread should continue running.
655 bool running_; 655 base::Atomic32 running_;
656 656
657 // Tells whether we are currently recording tick samples. 657 // Tells whether we are currently recording tick samples.
658 bool paused_; 658 bool paused_;
659 }; 659 };
660 660
661 661
662 // 662 //
663 // Ticker used to provide ticks to the profiler and the sliding state 663 // Ticker used to provide ticks to the profiler and the sliding state
664 // window. 664 // window.
665 // 665 //
(...skipping 30 matching lines...) Expand all
696 // 696 //
697 // Profiler implementation. 697 // Profiler implementation.
698 // 698 //
699 Profiler::Profiler(Isolate* isolate) 699 Profiler::Profiler(Isolate* isolate)
700 : base::Thread(Options("v8:Profiler")), 700 : base::Thread(Options("v8:Profiler")),
701 isolate_(isolate), 701 isolate_(isolate),
702 head_(0), 702 head_(0),
703 overflow_(false), 703 overflow_(false),
704 buffer_semaphore_(0), 704 buffer_semaphore_(0),
705 engaged_(false), 705 engaged_(false),
706 running_(false),
707 paused_(false) { 706 paused_(false) {
708 base::NoBarrier_Store(&tail_, 0); 707 base::NoBarrier_Store(&tail_, 0);
708 base::NoBarrier_Store(&running_, 0);
709 } 709 }
710 710
711 711
712 void Profiler::Engage() { 712 void Profiler::Engage() {
713 if (engaged_) return; 713 if (engaged_) return;
714 engaged_ = true; 714 engaged_ = true;
715 715
716 std::vector<base::OS::SharedLibraryAddress> addresses = 716 std::vector<base::OS::SharedLibraryAddress> addresses =
717 base::OS::GetSharedLibraryAddresses(); 717 base::OS::GetSharedLibraryAddresses();
718 for (size_t i = 0; i < addresses.size(); ++i) { 718 for (size_t i = 0; i < addresses.size(); ++i) {
719 LOG(isolate_, SharedLibraryEvent( 719 LOG(isolate_, SharedLibraryEvent(
720 addresses[i].library_path, addresses[i].start, addresses[i].end)); 720 addresses[i].library_path, addresses[i].start, addresses[i].end));
721 } 721 }
722 722
723 // Start thread processing the profiler buffer. 723 // Start thread processing the profiler buffer.
724 running_ = true; 724 base::NoBarrier_Store(&running_, 1);
725 Start(); 725 Start();
726 726
727 // Register to get ticks. 727 // Register to get ticks.
728 Logger* logger = isolate_->logger(); 728 Logger* logger = isolate_->logger();
729 logger->ticker_->SetProfiler(this); 729 logger->ticker_->SetProfiler(this);
730 730
731 logger->ProfilerBeginEvent(); 731 logger->ProfilerBeginEvent();
732 } 732 }
733 733
734 734
735 void Profiler::Disengage() { 735 void Profiler::Disengage() {
736 if (!engaged_) return; 736 if (!engaged_) return;
737 737
738 // Stop receiving ticks. 738 // Stop receiving ticks.
739 isolate_->logger()->ticker_->ClearProfiler(); 739 isolate_->logger()->ticker_->ClearProfiler();
740 740
741 // Terminate the worker thread by setting running_ to false, 741 // Terminate the worker thread by setting running_ to false,
742 // inserting a fake element in the queue and then wait for 742 // inserting a fake element in the queue and then wait for
743 // the thread to terminate. 743 // the thread to terminate.
744 running_ = false; 744 base::NoBarrier_Store(&running_, 0);
745 TickSample sample; 745 TickSample sample;
746 // Reset 'paused_' flag, otherwise semaphore may not be signalled. 746 // Reset 'paused_' flag, otherwise semaphore may not be signalled.
747 resume(); 747 resume();
748 Insert(&sample); 748 Insert(&sample);
749 Join(); 749 Join();
750 750
751 LOG(isolate_, UncheckedStringEvent("profiler", "end")); 751 LOG(isolate_, UncheckedStringEvent("profiler", "end"));
752 } 752 }
753 753
754 754
755 void Profiler::Run() { 755 void Profiler::Run() {
756 TickSample sample; 756 TickSample sample;
757 bool overflow = Remove(&sample); 757 bool overflow = Remove(&sample);
758 while (running_) { 758 while (base::NoBarrier_Load(&running_)) {
759 LOG(isolate_, TickEvent(&sample, overflow)); 759 LOG(isolate_, TickEvent(&sample, overflow));
760 overflow = Remove(&sample); 760 overflow = Remove(&sample);
761 } 761 }
762 } 762 }
763 763
764 764
765 // 765 //
766 // Logger class implementation. 766 // Logger class implementation.
767 // 767 //
768 768
(...skipping 1169 matching lines...) Expand 10 before | Expand all | Expand 10 after
1938 if (jit_logger_) { 1938 if (jit_logger_) {
1939 removeCodeEventListener(jit_logger_); 1939 removeCodeEventListener(jit_logger_);
1940 delete jit_logger_; 1940 delete jit_logger_;
1941 jit_logger_ = NULL; 1941 jit_logger_ = NULL;
1942 } 1942 }
1943 1943
1944 return log_->Close(); 1944 return log_->Close();
1945 } 1945 }
1946 1946
1947 } } // namespace v8::internal 1947 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698