OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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_STORE_BUFFER_H_ | 5 #ifndef RUNTIME_VM_STORE_BUFFER_H_ |
6 #define RUNTIME_VM_STORE_BUFFER_H_ | 6 #define RUNTIME_VM_STORE_BUFFER_H_ |
7 | 7 |
8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
9 #include "vm/globals.h" | 9 #include "vm/globals.h" |
10 | 10 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 PointerBlock<Size>* next_; | 67 PointerBlock<Size>* next_; |
68 int32_t top_; | 68 int32_t top_; |
69 RawObject* pointers_[kSize]; | 69 RawObject* pointers_[kSize]; |
70 | 70 |
71 template <int> | 71 template <int> |
72 friend class BlockStack; | 72 friend class BlockStack; |
73 | 73 |
74 DISALLOW_COPY_AND_ASSIGN(PointerBlock); | 74 DISALLOW_COPY_AND_ASSIGN(PointerBlock); |
75 }; | 75 }; |
76 | 76 |
77 | |
78 // A synchronized collection of pointer blocks of a particular size. | 77 // A synchronized collection of pointer blocks of a particular size. |
79 // This class is meant to be used as a base (note PushBlockImpl is protected). | 78 // This class is meant to be used as a base (note PushBlockImpl is protected). |
80 // The global list of cached empty blocks is currently per-size. | 79 // The global list of cached empty blocks is currently per-size. |
81 template <int BlockSize> | 80 template <int BlockSize> |
82 class BlockStack { | 81 class BlockStack { |
83 public: | 82 public: |
84 typedef PointerBlock<BlockSize> Block; | 83 typedef PointerBlock<BlockSize> Block; |
85 | 84 |
86 BlockStack(); | 85 BlockStack(); |
87 ~BlockStack(); | 86 ~BlockStack(); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 | 131 |
133 // Note: This is shared on the basis of block size. | 132 // Note: This is shared on the basis of block size. |
134 static const intptr_t kMaxGlobalEmpty = 100; | 133 static const intptr_t kMaxGlobalEmpty = 100; |
135 static List* global_empty_; | 134 static List* global_empty_; |
136 static Mutex* global_mutex_; | 135 static Mutex* global_mutex_; |
137 | 136 |
138 private: | 137 private: |
139 DISALLOW_COPY_AND_ASSIGN(BlockStack); | 138 DISALLOW_COPY_AND_ASSIGN(BlockStack); |
140 }; | 139 }; |
141 | 140 |
142 | |
143 static const int kStoreBufferBlockSize = 1024; | 141 static const int kStoreBufferBlockSize = 1024; |
144 class StoreBuffer : public BlockStack<kStoreBufferBlockSize> { | 142 class StoreBuffer : public BlockStack<kStoreBufferBlockSize> { |
145 public: | 143 public: |
146 // Interrupt when crossing this threshold of non-empty blocks in the buffer. | 144 // Interrupt when crossing this threshold of non-empty blocks in the buffer. |
147 static const intptr_t kMaxNonEmpty = 100; | 145 static const intptr_t kMaxNonEmpty = 100; |
148 | 146 |
149 enum ThresholdPolicy { kCheckThreshold, kIgnoreThreshold }; | 147 enum ThresholdPolicy { kCheckThreshold, kIgnoreThreshold }; |
150 | 148 |
151 // Adds and transfers ownership of the block to the buffer. Optionally | 149 // Adds and transfers ownership of the block to the buffer. Optionally |
152 // checks the number of non-empty blocks for overflow, and schedules an | 150 // checks the number of non-empty blocks for overflow, and schedules an |
153 // interrupt on the current isolate if so. | 151 // interrupt on the current isolate if so. |
154 void PushBlock(Block* block, ThresholdPolicy policy); | 152 void PushBlock(Block* block, ThresholdPolicy policy); |
155 | 153 |
156 // Check whether non-empty blocks have exceeded kMaxNonEmpty (but takes no | 154 // Check whether non-empty blocks have exceeded kMaxNonEmpty (but takes no |
157 // action). | 155 // action). |
158 bool Overflowed(); | 156 bool Overflowed(); |
159 }; | 157 }; |
160 | 158 |
161 | |
162 typedef StoreBuffer::Block StoreBufferBlock; | 159 typedef StoreBuffer::Block StoreBufferBlock; |
163 | 160 |
164 | |
165 static const int kMarkingStackBlockSize = 64; | 161 static const int kMarkingStackBlockSize = 64; |
166 class MarkingStack : public BlockStack<kMarkingStackBlockSize> { | 162 class MarkingStack : public BlockStack<kMarkingStackBlockSize> { |
167 public: | 163 public: |
168 // Adds and transfers ownership of the block to the buffer. | 164 // Adds and transfers ownership of the block to the buffer. |
169 void PushBlock(Block* block) { | 165 void PushBlock(Block* block) { |
170 BlockStack<Block::kSize>::PushBlockImpl(block); | 166 BlockStack<Block::kSize>::PushBlockImpl(block); |
171 } | 167 } |
172 }; | 168 }; |
173 | 169 |
174 | |
175 } // namespace dart | 170 } // namespace dart |
176 | 171 |
177 #endif // RUNTIME_VM_STORE_BUFFER_H_ | 172 #endif // RUNTIME_VM_STORE_BUFFER_H_ |
OLD | NEW |