OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #ifndef RUNTIME_VM_THREAD_BARRIER_H_ | 5 #ifndef RUNTIME_VM_THREAD_BARRIER_H_ |
6 #define RUNTIME_VM_THREAD_BARRIER_H_ | 6 #define RUNTIME_VM_THREAD_BARRIER_H_ |
7 | 7 |
8 #include "vm/globals.h" | 8 #include "vm/globals.h" |
9 #include "vm/os_thread.h" | 9 #include "vm/os_thread.h" |
10 #include "vm/lockers.h" | 10 #include "vm/lockers.h" |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 // barrier.Exit(); | 42 // barrier.Exit(); |
43 // | 43 // |
44 // Note that the calls to Sync() "line up" in time, but there is no such | 44 // Note that the calls to Sync() "line up" in time, but there is no such |
45 // guarantee for Exit(). | 45 // guarantee for Exit(). |
46 // | 46 // |
47 class ThreadBarrier { | 47 class ThreadBarrier { |
48 public: | 48 public: |
49 explicit ThreadBarrier(intptr_t num_threads, | 49 explicit ThreadBarrier(intptr_t num_threads, |
50 Monitor* monitor, | 50 Monitor* monitor, |
51 Monitor* done_monitor) | 51 Monitor* done_monitor) |
52 : num_threads_(num_threads), | 52 : num_threads_(num_threads), |
53 monitor_(monitor), | 53 monitor_(monitor), |
54 remaining_(num_threads), | 54 remaining_(num_threads), |
55 parity_(false), | 55 parity_(false), |
56 done_monitor_(done_monitor), | 56 done_monitor_(done_monitor), |
57 done_(false) { | 57 done_(false) { |
58 ASSERT(remaining_ > 0); | 58 ASSERT(remaining_ > 0); |
59 } | 59 } |
60 | 60 |
61 void Sync() { | 61 void Sync() { |
62 MonitorLocker ml(monitor_); | 62 MonitorLocker ml(monitor_); |
63 ASSERT(remaining_ > 0); | 63 ASSERT(remaining_ > 0); |
64 if (--remaining_ > 0) { | 64 if (--remaining_ > 0) { |
65 // I'm not last to arrive; wait until next round. | 65 // I'm not last to arrive; wait until next round. |
66 bool old_parity = parity_; | 66 bool old_parity = parity_; |
67 while (parity_ == old_parity) { | 67 while (parity_ == old_parity) { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 | 111 |
112 Monitor* done_monitor_; // TODO(koda): Try to optimize this away. | 112 Monitor* done_monitor_; // TODO(koda): Try to optimize this away. |
113 bool done_; | 113 bool done_; |
114 | 114 |
115 DISALLOW_COPY_AND_ASSIGN(ThreadBarrier); | 115 DISALLOW_COPY_AND_ASSIGN(ThreadBarrier); |
116 }; | 116 }; |
117 | 117 |
118 } // namespace dart | 118 } // namespace dart |
119 | 119 |
120 #endif // RUNTIME_VM_THREAD_BARRIER_H_ | 120 #endif // RUNTIME_VM_THREAD_BARRIER_H_ |
OLD | NEW |