Index: src/log.cc |
diff --git a/src/log.cc b/src/log.cc |
index 1b350c4909478a2996d61755389217aafd0ab1a5..db1f3cf880e63f7a4794c39618770f81ea3b22cb 100644 |
--- a/src/log.cc |
+++ b/src/log.cc |
@@ -607,7 +607,7 @@ class Profiler: public base::Thread { |
if (paused_) |
return; |
- if (Succ(head_) == tail_) { |
+ if (Succ(head_) == static_cast<int>(base::NoBarrier_Load(&tail_))) { |
overflow_ = true; |
} else { |
buffer_[head_] = *sample; |
@@ -626,9 +626,10 @@ class Profiler: public base::Thread { |
// Waits for a signal and removes profiling data. |
bool Remove(TickSample* sample) { |
buffer_semaphore_.Wait(); // Wait for an element. |
- *sample = buffer_[tail_]; |
+ *sample = buffer_[base::NoBarrier_Load(&tail_)]; |
bool result = overflow_; |
- tail_ = Succ(tail_); |
+ base::NoBarrier_Store(&tail_, static_cast<base::Atomic32>( |
+ Succ(base::NoBarrier_Load(&tail_)))); |
overflow_ = false; |
return result; |
} |
@@ -642,7 +643,7 @@ class Profiler: public base::Thread { |
static const int kBufferSize = 128; |
TickSample buffer_[kBufferSize]; // Buffer storage. |
int head_; // Index to the buffer head. |
- int tail_; // Index to the buffer tail. |
+ base::Atomic32 tail_; // Index to the buffer tail. |
bool overflow_; // Tell whether a buffer overflow has occurred. |
// Sempahore used for buffer synchronization. |
base::Semaphore buffer_semaphore_; |
@@ -699,12 +700,13 @@ Profiler::Profiler(Isolate* isolate) |
: base::Thread(Options("v8:Profiler")), |
isolate_(isolate), |
head_(0), |
- tail_(0), |
overflow_(false), |
buffer_semaphore_(0), |
engaged_(false), |
running_(false), |
- paused_(false) {} |
+ paused_(false) { |
+ base::NoBarrier_Store(&tail_, 0); |
+} |
void Profiler::Engage() { |