| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/base/platform/condition-variable.h" | 5 #include "src/base/platform/condition-variable.h" |
| 6 | 6 |
| 7 #include "src/base/platform/platform.h" | 7 #include "src/base/platform/platform.h" |
| 8 #include "src/base/platform/time.h" | 8 #include "src/base/platform/time.h" |
| 9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
| 10 | 10 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 EXPECT_FALSE(cv.WaitFor(&mutex, TimeDelta::FromMicroseconds(n))); | 25 EXPECT_FALSE(cv.WaitFor(&mutex, TimeDelta::FromMicroseconds(n))); |
| 26 } | 26 } |
| 27 } | 27 } |
| 28 | 28 |
| 29 | 29 |
| 30 namespace { | 30 namespace { |
| 31 | 31 |
| 32 class ThreadWithMutexAndConditionVariable V8_FINAL : public Thread { | 32 class ThreadWithMutexAndConditionVariable V8_FINAL : public Thread { |
| 33 public: | 33 public: |
| 34 ThreadWithMutexAndConditionVariable() | 34 ThreadWithMutexAndConditionVariable() |
| 35 : Thread("ThreadWithMutexAndConditionVariable"), | 35 : Thread(Options("ThreadWithMutexAndConditionVariable")), |
| 36 running_(false), finished_(false) {} | 36 running_(false), |
| 37 finished_(false) {} |
| 37 virtual ~ThreadWithMutexAndConditionVariable() {} | 38 virtual ~ThreadWithMutexAndConditionVariable() {} |
| 38 | 39 |
| 39 virtual void Run() V8_OVERRIDE { | 40 virtual void Run() V8_OVERRIDE { |
| 40 LockGuard<Mutex> lock_guard(&mutex_); | 41 LockGuard<Mutex> lock_guard(&mutex_); |
| 41 running_ = true; | 42 running_ = true; |
| 42 cv_.NotifyOne(); | 43 cv_.NotifyOne(); |
| 43 while (running_) { | 44 while (running_) { |
| 44 cv_.Wait(&mutex_); | 45 cv_.Wait(&mutex_); |
| 45 } | 46 } |
| 46 finished_ = true; | 47 finished_ = true; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 103 EXPECT_TRUE(threads[n].finished_); | 104 EXPECT_TRUE(threads[n].finished_); |
| 104 } | 105 } |
| 105 } | 106 } |
| 106 | 107 |
| 107 | 108 |
| 108 namespace { | 109 namespace { |
| 109 | 110 |
| 110 class ThreadWithSharedMutexAndConditionVariable V8_FINAL : public Thread { | 111 class ThreadWithSharedMutexAndConditionVariable V8_FINAL : public Thread { |
| 111 public: | 112 public: |
| 112 ThreadWithSharedMutexAndConditionVariable() | 113 ThreadWithSharedMutexAndConditionVariable() |
| 113 : Thread("ThreadWithSharedMutexAndConditionVariable"), | 114 : Thread(Options("ThreadWithSharedMutexAndConditionVariable")), |
| 114 running_(false), finished_(false), cv_(NULL), mutex_(NULL) {} | 115 running_(false), |
| 116 finished_(false), |
| 117 cv_(NULL), |
| 118 mutex_(NULL) {} |
| 115 virtual ~ThreadWithSharedMutexAndConditionVariable() {} | 119 virtual ~ThreadWithSharedMutexAndConditionVariable() {} |
| 116 | 120 |
| 117 virtual void Run() V8_OVERRIDE { | 121 virtual void Run() V8_OVERRIDE { |
| 118 LockGuard<Mutex> lock_guard(mutex_); | 122 LockGuard<Mutex> lock_guard(mutex_); |
| 119 running_ = true; | 123 running_ = true; |
| 120 cv_->NotifyAll(); | 124 cv_->NotifyAll(); |
| 121 while (running_) { | 125 while (running_) { |
| 122 cv_->Wait(mutex_); | 126 cv_->Wait(mutex_); |
| 123 } | 127 } |
| 124 finished_ = true; | 128 finished_ = true; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 209 for (int n = 0; n < kThreadCount; ++n) { | 213 for (int n = 0; n < kThreadCount; ++n) { |
| 210 threads[n].Join(); | 214 threads[n].Join(); |
| 211 } | 215 } |
| 212 } | 216 } |
| 213 | 217 |
| 214 | 218 |
| 215 namespace { | 219 namespace { |
| 216 | 220 |
| 217 class LoopIncrementThread V8_FINAL : public Thread { | 221 class LoopIncrementThread V8_FINAL : public Thread { |
| 218 public: | 222 public: |
| 219 LoopIncrementThread(int rem, | 223 LoopIncrementThread(int rem, int* counter, int limit, int thread_count, |
| 220 int* counter, | 224 ConditionVariable* cv, Mutex* mutex) |
| 221 int limit, | 225 : Thread(Options("LoopIncrementThread")), |
| 222 int thread_count, | 226 rem_(rem), |
| 223 ConditionVariable* cv, | 227 counter_(counter), |
| 224 Mutex* mutex) | 228 limit_(limit), |
| 225 : Thread("LoopIncrementThread"), rem_(rem), counter_(counter), | 229 thread_count_(thread_count), |
| 226 limit_(limit), thread_count_(thread_count), cv_(cv), mutex_(mutex) { | 230 cv_(cv), |
| 231 mutex_(mutex) { |
| 227 EXPECT_LT(rem, thread_count); | 232 EXPECT_LT(rem, thread_count); |
| 228 EXPECT_EQ(0, limit % thread_count); | 233 EXPECT_EQ(0, limit % thread_count); |
| 229 } | 234 } |
| 230 | 235 |
| 231 virtual void Run() V8_OVERRIDE { | 236 virtual void Run() V8_OVERRIDE { |
| 232 int last_count = -1; | 237 int last_count = -1; |
| 233 while (true) { | 238 while (true) { |
| 234 LockGuard<Mutex> lock_guard(mutex_); | 239 LockGuard<Mutex> lock_guard(mutex_); |
| 235 int count = *counter_; | 240 int count = *counter_; |
| 236 while (count % thread_count_ != rem_ && count < limit_) { | 241 while (count % thread_count_ != rem_ && count < limit_) { |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 delete threads[n]; | 292 delete threads[n]; |
| 288 } | 293 } |
| 289 delete[] threads; | 294 delete[] threads; |
| 290 | 295 |
| 291 EXPECT_EQ(limit, counter); | 296 EXPECT_EQ(limit, counter); |
| 292 } | 297 } |
| 293 } | 298 } |
| 294 | 299 |
| 295 } // namespace base | 300 } // namespace base |
| 296 } // namespace v8 | 301 } // namespace v8 |
| OLD | NEW |