| 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_HANDLES_IMPL_H_ | 5 #ifndef RUNTIME_VM_HANDLES_IMPL_H_ |
| 6 #define RUNTIME_VM_HANDLES_IMPL_H_ | 6 #define RUNTIME_VM_HANDLES_IMPL_H_ |
| 7 | 7 |
| 8 #include "vm/heap.h" | 8 #include "vm/heap.h" |
| 9 #include "vm/thread.h" | 9 #include "vm/thread.h" |
| 10 #include "vm/visitor.h" | 10 #include "vm/visitor.h" |
| 11 | 11 |
| 12 namespace dart { | 12 namespace dart { |
| 13 | 13 |
| 14 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> | 14 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> |
| 15 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: | 15 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: |
| 16 VisitObjectPointers(ObjectPointerVisitor* visitor) { | 16 VisitObjectPointers(ObjectPointerVisitor* visitor) { |
| 17 // Visit all zone handles. | 17 // Visit all zone handles. |
| 18 HandlesBlock* block = zone_blocks_; | 18 HandlesBlock* block = zone_blocks_; |
| 19 while (block != NULL) { | 19 while (block != NULL) { |
| 20 block->VisitObjectPointers(visitor); | 20 block->VisitObjectPointers(visitor); |
| 21 block = block->next_block(); | 21 block = block->next_block(); |
| 22 } | 22 } |
| 23 | 23 |
| 24 // Visit all scoped handles. | 24 // Visit all scoped handles. |
| 25 VisitScopedHandles(visitor); | 25 VisitScopedHandles(visitor); |
| 26 } | 26 } |
| 27 | 27 |
| 28 | |
| 29 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> | 28 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> |
| 30 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: | 29 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: |
| 31 VisitScopedHandles(ObjectPointerVisitor* visitor) { | 30 VisitScopedHandles(ObjectPointerVisitor* visitor) { |
| 32 HandlesBlock* block = &first_scoped_block_; | 31 HandlesBlock* block = &first_scoped_block_; |
| 33 do { | 32 do { |
| 34 block->VisitObjectPointers(visitor); | 33 block->VisitObjectPointers(visitor); |
| 35 if (block == scoped_blocks_) { | 34 if (block == scoped_blocks_) { |
| 36 return; | 35 return; |
| 37 } | 36 } |
| 38 block = block->next_block(); | 37 block = block->next_block(); |
| 39 } while (block != NULL); | 38 } while (block != NULL); |
| 40 UNREACHABLE(); | 39 UNREACHABLE(); |
| 41 } | 40 } |
| 42 | 41 |
| 43 | |
| 44 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> | 42 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> |
| 45 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::Visit( | 43 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::Visit( |
| 46 HandleVisitor* visitor) { | 44 HandleVisitor* visitor) { |
| 47 // Visit all zone handles. | 45 // Visit all zone handles. |
| 48 HandlesBlock* block = zone_blocks_; | 46 HandlesBlock* block = zone_blocks_; |
| 49 while (block != NULL) { | 47 while (block != NULL) { |
| 50 block->Visit(visitor); | 48 block->Visit(visitor); |
| 51 block = block->next_block(); | 49 block = block->next_block(); |
| 52 } | 50 } |
| 53 | 51 |
| 54 // Visit all scoped handles. | 52 // Visit all scoped handles. |
| 55 block = &first_scoped_block_; | 53 block = &first_scoped_block_; |
| 56 do { | 54 do { |
| 57 block->Visit(visitor); | 55 block->Visit(visitor); |
| 58 block = block->next_block(); | 56 block = block->next_block(); |
| 59 } while (block != NULL); | 57 } while (block != NULL); |
| 60 } | 58 } |
| 61 | 59 |
| 62 | |
| 63 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> | 60 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> |
| 64 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::Reset() { | 61 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::Reset() { |
| 65 // Delete all the extra zone handle blocks allocated and reinit the first | 62 // Delete all the extra zone handle blocks allocated and reinit the first |
| 66 // zone block. | 63 // zone block. |
| 67 if (zone_blocks_ != NULL) { | 64 if (zone_blocks_ != NULL) { |
| 68 DeleteHandleBlocks(zone_blocks_->next_block()); | 65 DeleteHandleBlocks(zone_blocks_->next_block()); |
| 69 zone_blocks_->ReInit(); | 66 zone_blocks_->ReInit(); |
| 70 } | 67 } |
| 71 | 68 |
| 72 // Delete all the extra scoped handle blocks allocated and reinit the first | 69 // Delete all the extra scoped handle blocks allocated and reinit the first |
| 73 // scoped block. | 70 // scoped block. |
| 74 DeleteHandleBlocks(first_scoped_block_.next_block()); | 71 DeleteHandleBlocks(first_scoped_block_.next_block()); |
| 75 first_scoped_block_.ReInit(); | 72 first_scoped_block_.ReInit(); |
| 76 scoped_blocks_ = &first_scoped_block_; | 73 scoped_blocks_ = &first_scoped_block_; |
| 77 } | 74 } |
| 78 | 75 |
| 79 | |
| 80 // Figure out the current handle scope using the current Zone and | 76 // Figure out the current handle scope using the current Zone and |
| 81 // allocate a handle in that scope. The function assumes that a | 77 // allocate a handle in that scope. The function assumes that a |
| 82 // current handle scope exists. It asserts for this appropriately. | 78 // current handle scope exists. It asserts for this appropriately. |
| 83 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> | 79 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> |
| 84 uword Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: | 80 uword Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: |
| 85 AllocateHandle(Zone* zone) { | 81 AllocateHandle(Zone* zone) { |
| 86 #if defined(DEBUG) | 82 #if defined(DEBUG) |
| 87 Thread* thread = Thread::Current(); | 83 Thread* thread = Thread::Current(); |
| 88 ASSERT(thread->top_handle_scope() != NULL); | 84 ASSERT(thread->top_handle_scope() != NULL); |
| 89 ASSERT(thread->no_handle_scope_depth() == 0); | 85 ASSERT(thread->no_handle_scope_depth() == 0); |
| 90 #endif // DEBUG | 86 #endif // DEBUG |
| 91 Handles* handles = zone->handles(); | 87 Handles* handles = zone->handles(); |
| 92 ASSERT(handles != NULL); | 88 ASSERT(handles != NULL); |
| 93 return handles->AllocateScopedHandle(); | 89 return handles->AllocateScopedHandle(); |
| 94 } | 90 } |
| 95 | 91 |
| 96 | |
| 97 // The function assumes that 'zone' is the current zone and asserts for | 92 // The function assumes that 'zone' is the current zone and asserts for |
| 98 // this appropriately. | 93 // this appropriately. |
| 99 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> | 94 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> |
| 100 uword Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: | 95 uword Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: |
| 101 AllocateZoneHandle(Zone* zone) { | 96 AllocateZoneHandle(Zone* zone) { |
| 102 #if defined(DEBUG) | 97 #if defined(DEBUG) |
| 103 Thread* thread = Thread::Current(); | 98 Thread* thread = Thread::Current(); |
| 104 ASSERT(thread->zone() == zone); | 99 ASSERT(thread->zone() == zone); |
| 105 ASSERT(thread->no_handle_scope_depth() == 0); | 100 ASSERT(thread->no_handle_scope_depth() == 0); |
| 106 #endif // DEBUG | 101 #endif // DEBUG |
| 107 Handles* handles = zone->handles(); | 102 Handles* handles = zone->handles(); |
| 108 ASSERT(handles != NULL); | 103 ASSERT(handles != NULL); |
| 109 uword address = handles->AllocateHandleInZone(); | 104 uword address = handles->AllocateHandleInZone(); |
| 110 return address; | 105 return address; |
| 111 } | 106 } |
| 112 | 107 |
| 113 | |
| 114 // Figure out the current zone using the current Thread and | 108 // Figure out the current zone using the current Thread and |
| 115 // check if the specified handle has been allocated in this zone. | 109 // check if the specified handle has been allocated in this zone. |
| 116 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> | 110 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> |
| 117 bool Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: | 111 bool Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: |
| 118 IsZoneHandle(uword handle) { | 112 IsZoneHandle(uword handle) { |
| 119 // TODO(5411412): Accessing the current thread is a performance problem, | 113 // TODO(5411412): Accessing the current thread is a performance problem, |
| 120 // consider passing it down as a parameter. | 114 // consider passing it down as a parameter. |
| 121 Thread* thread = Thread::Current(); | 115 Thread* thread = Thread::Current(); |
| 122 ASSERT(thread != NULL); | 116 ASSERT(thread != NULL); |
| 123 ASSERT(thread->zone() != NULL); | 117 ASSERT(thread->zone() != NULL); |
| 124 Handles* handles = thread->zone()->handles(); | 118 Handles* handles = thread->zone()->handles(); |
| 125 ASSERT(handles != NULL); | 119 ASSERT(handles != NULL); |
| 126 return handles->IsValidZoneHandle(handle); | 120 return handles->IsValidZoneHandle(handle); |
| 127 } | 121 } |
| 128 | 122 |
| 129 | |
| 130 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> | 123 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> |
| 131 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: | 124 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: |
| 132 DeleteAll() { | 125 DeleteAll() { |
| 133 // Delete all the zone allocated handle blocks. | 126 // Delete all the zone allocated handle blocks. |
| 134 // GCTrace does not need to trace this call to DeleteHandleBlocks, | 127 // GCTrace does not need to trace this call to DeleteHandleBlocks, |
| 135 // since the individual zone deletions will be caught | 128 // since the individual zone deletions will be caught |
| 136 // by instrumentation in the BaseZone destructor. | 129 // by instrumentation in the BaseZone destructor. |
| 137 DeleteHandleBlocks(zone_blocks_); | 130 DeleteHandleBlocks(zone_blocks_); |
| 138 zone_blocks_ = NULL; | 131 zone_blocks_ = NULL; |
| 139 | 132 |
| 140 // Delete all the scoped handle blocks. | 133 // Delete all the scoped handle blocks. |
| 141 scoped_blocks_ = first_scoped_block_.next_block(); | 134 scoped_blocks_ = first_scoped_block_.next_block(); |
| 142 DeleteHandleBlocks(scoped_blocks_); | 135 DeleteHandleBlocks(scoped_blocks_); |
| 143 first_scoped_block_.ReInit(); | 136 first_scoped_block_.ReInit(); |
| 144 scoped_blocks_ = &first_scoped_block_; | 137 scoped_blocks_ = &first_scoped_block_; |
| 145 } | 138 } |
| 146 | 139 |
| 147 | |
| 148 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> | 140 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> |
| 149 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: | 141 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: |
| 150 DeleteHandleBlocks(HandlesBlock* blocks) { | 142 DeleteHandleBlocks(HandlesBlock* blocks) { |
| 151 while (blocks != NULL) { | 143 while (blocks != NULL) { |
| 152 HandlesBlock* block = blocks; | 144 HandlesBlock* block = blocks; |
| 153 blocks = blocks->next_block(); | 145 blocks = blocks->next_block(); |
| 154 delete block; | 146 delete block; |
| 155 } | 147 } |
| 156 } | 148 } |
| 157 | 149 |
| 158 | |
| 159 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> | 150 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> |
| 160 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: | 151 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: |
| 161 SetupNextScopeBlock() { | 152 SetupNextScopeBlock() { |
| 162 if (FLAG_trace_handles) { | 153 if (FLAG_trace_handles) { |
| 163 OS::PrintErr("*** Handle Counts for (0x%" Px "):Zone = %d,Scoped = %d\n", | 154 OS::PrintErr("*** Handle Counts for (0x%" Px "):Zone = %d,Scoped = %d\n", |
| 164 reinterpret_cast<intptr_t>(this), CountZoneHandles(), | 155 reinterpret_cast<intptr_t>(this), CountZoneHandles(), |
| 165 CountScopedHandles()); | 156 CountScopedHandles()); |
| 166 } | 157 } |
| 167 if (scoped_blocks_->next_block() == NULL) { | 158 if (scoped_blocks_->next_block() == NULL) { |
| 168 scoped_blocks_->set_next_block(new HandlesBlock(NULL)); | 159 scoped_blocks_->set_next_block(new HandlesBlock(NULL)); |
| 169 } | 160 } |
| 170 scoped_blocks_ = scoped_blocks_->next_block(); | 161 scoped_blocks_ = scoped_blocks_->next_block(); |
| 171 scoped_blocks_->set_next_handle_slot(0); | 162 scoped_blocks_->set_next_handle_slot(0); |
| 172 #if defined(DEBUG) | 163 #if defined(DEBUG) |
| 173 scoped_blocks_->ZapFreeHandles(); | 164 scoped_blocks_->ZapFreeHandles(); |
| 174 #endif | 165 #endif |
| 175 } | 166 } |
| 176 | 167 |
| 177 | |
| 178 // Validation of the handle involves iterating through all the | 168 // Validation of the handle involves iterating through all the |
| 179 // handle blocks to check if the handle is valid, please | 169 // handle blocks to check if the handle is valid, please |
| 180 // use this only in ASSERT code for verification purposes. | 170 // use this only in ASSERT code for verification purposes. |
| 181 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> | 171 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> |
| 182 bool Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: | 172 bool Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: |
| 183 IsValidScopedHandle(uword handle) const { | 173 IsValidScopedHandle(uword handle) const { |
| 184 const HandlesBlock* iterator = &first_scoped_block_; | 174 const HandlesBlock* iterator = &first_scoped_block_; |
| 185 while (iterator != NULL) { | 175 while (iterator != NULL) { |
| 186 if (iterator->IsValidHandle(handle)) { | 176 if (iterator->IsValidHandle(handle)) { |
| 187 return true; | 177 return true; |
| 188 } | 178 } |
| 189 iterator = iterator->next_block(); | 179 iterator = iterator->next_block(); |
| 190 } | 180 } |
| 191 return false; | 181 return false; |
| 192 } | 182 } |
| 193 | 183 |
| 194 | |
| 195 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> | 184 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> |
| 196 bool Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: | 185 bool Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: |
| 197 IsValidZoneHandle(uword handle) const { | 186 IsValidZoneHandle(uword handle) const { |
| 198 const HandlesBlock* iterator = zone_blocks_; | 187 const HandlesBlock* iterator = zone_blocks_; |
| 199 while (iterator != NULL) { | 188 while (iterator != NULL) { |
| 200 if (iterator->IsValidHandle(handle)) { | 189 if (iterator->IsValidHandle(handle)) { |
| 201 return true; | 190 return true; |
| 202 } | 191 } |
| 203 iterator = iterator->next_block(); | 192 iterator = iterator->next_block(); |
| 204 } | 193 } |
| 205 return false; | 194 return false; |
| 206 } | 195 } |
| 207 | 196 |
| 208 | |
| 209 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> | 197 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> |
| 210 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: | 198 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: |
| 211 SetupNextZoneBlock() { | 199 SetupNextZoneBlock() { |
| 212 if (FLAG_trace_handles) { | 200 if (FLAG_trace_handles) { |
| 213 OS::PrintErr("*** Handle Counts for (0x%" Px "):Zone = %d,Scoped = %d\n", | 201 OS::PrintErr("*** Handle Counts for (0x%" Px "):Zone = %d,Scoped = %d\n", |
| 214 reinterpret_cast<intptr_t>(this), CountZoneHandles(), | 202 reinterpret_cast<intptr_t>(this), CountZoneHandles(), |
| 215 CountScopedHandles()); | 203 CountScopedHandles()); |
| 216 } | 204 } |
| 217 zone_blocks_ = new HandlesBlock(zone_blocks_); | 205 zone_blocks_ = new HandlesBlock(zone_blocks_); |
| 218 ASSERT(zone_blocks_ != NULL); | 206 ASSERT(zone_blocks_ != NULL); |
| 219 } | 207 } |
| 220 | 208 |
| 221 | |
| 222 #if defined(DEBUG) | 209 #if defined(DEBUG) |
| 223 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> | 210 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> |
| 224 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: | 211 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: |
| 225 VerifyScopedHandleState() { | 212 VerifyScopedHandleState() { |
| 226 HandlesBlock* block = &first_scoped_block_; | 213 HandlesBlock* block = &first_scoped_block_; |
| 227 const intptr_t end_index = (kHandleSizeInWords * kHandlesPerChunk); | 214 const intptr_t end_index = (kHandleSizeInWords * kHandlesPerChunk); |
| 228 do { | 215 do { |
| 229 if (scoped_blocks_ == block && block->next_handle_slot() <= end_index) { | 216 if (scoped_blocks_ == block && block->next_handle_slot() <= end_index) { |
| 230 return; | 217 return; |
| 231 } | 218 } |
| 232 block = block->next_block(); | 219 block = block->next_block(); |
| 233 } while (block != NULL); | 220 } while (block != NULL); |
| 234 ASSERT(false); | 221 ASSERT(false); |
| 235 } | 222 } |
| 236 | 223 |
| 237 | |
| 238 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> | 224 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> |
| 239 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: | 225 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: |
| 240 ZapFreeScopedHandles() { | 226 ZapFreeScopedHandles() { |
| 241 HandlesBlock* block = scoped_blocks_; | 227 HandlesBlock* block = scoped_blocks_; |
| 242 while (block != NULL) { | 228 while (block != NULL) { |
| 243 block->ZapFreeHandles(); | 229 block->ZapFreeHandles(); |
| 244 block = block->next_block(); | 230 block = block->next_block(); |
| 245 } | 231 } |
| 246 } | 232 } |
| 247 #endif | 233 #endif |
| 248 | 234 |
| 249 | |
| 250 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> | 235 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> |
| 251 int Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: | 236 int Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: |
| 252 CountScopedHandles() const { | 237 CountScopedHandles() const { |
| 253 int count = 0; | 238 int count = 0; |
| 254 const HandlesBlock* block = &first_scoped_block_; | 239 const HandlesBlock* block = &first_scoped_block_; |
| 255 do { | 240 do { |
| 256 count += block->HandleCount(); | 241 count += block->HandleCount(); |
| 257 if (block == scoped_blocks_) { | 242 if (block == scoped_blocks_) { |
| 258 return count; | 243 return count; |
| 259 } | 244 } |
| 260 block = block->next_block(); | 245 block = block->next_block(); |
| 261 } while (block != NULL); | 246 } while (block != NULL); |
| 262 UNREACHABLE(); | 247 UNREACHABLE(); |
| 263 return 0; | 248 return 0; |
| 264 } | 249 } |
| 265 | 250 |
| 266 | |
| 267 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> | 251 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> |
| 268 int Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: | 252 int Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: |
| 269 CountZoneHandles() const { | 253 CountZoneHandles() const { |
| 270 int count = 0; | 254 int count = 0; |
| 271 const HandlesBlock* block = zone_blocks_; | 255 const HandlesBlock* block = zone_blocks_; |
| 272 while (block != NULL) { | 256 while (block != NULL) { |
| 273 count += block->HandleCount(); | 257 count += block->HandleCount(); |
| 274 block = block->next_block(); | 258 block = block->next_block(); |
| 275 } | 259 } |
| 276 return count; | 260 return count; |
| 277 } | 261 } |
| 278 | 262 |
| 279 | |
| 280 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> | 263 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> |
| 281 Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::HandlesBlock:: | 264 Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>::HandlesBlock:: |
| 282 ~HandlesBlock() { | 265 ~HandlesBlock() { |
| 283 #if defined(DEBUG) | 266 #if defined(DEBUG) |
| 284 ReInit(); | 267 ReInit(); |
| 285 #endif | 268 #endif |
| 286 } | 269 } |
| 287 | 270 |
| 288 | |
| 289 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> | 271 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> |
| 290 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: | 272 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: |
| 291 HandlesBlock::ReInit() { | 273 HandlesBlock::ReInit() { |
| 292 next_handle_slot_ = 0; | 274 next_handle_slot_ = 0; |
| 293 next_block_ = NULL; | 275 next_block_ = NULL; |
| 294 #if defined(DEBUG) | 276 #if defined(DEBUG) |
| 295 ZapFreeHandles(); | 277 ZapFreeHandles(); |
| 296 #endif | 278 #endif |
| 297 } | 279 } |
| 298 | 280 |
| 299 | |
| 300 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> | 281 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> |
| 301 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: | 282 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: |
| 302 HandlesBlock::VisitObjectPointers(ObjectPointerVisitor* visitor) { | 283 HandlesBlock::VisitObjectPointers(ObjectPointerVisitor* visitor) { |
| 303 ASSERT(visitor != NULL); | 284 ASSERT(visitor != NULL); |
| 304 for (intptr_t i = 0; i < next_handle_slot_; i += kHandleSizeInWords) { | 285 for (intptr_t i = 0; i < next_handle_slot_; i += kHandleSizeInWords) { |
| 305 visitor->VisitPointer( | 286 visitor->VisitPointer( |
| 306 reinterpret_cast<RawObject**>(&data_[i + kOffsetOfRawPtr / kWordSize])); | 287 reinterpret_cast<RawObject**>(&data_[i + kOffsetOfRawPtr / kWordSize])); |
| 307 } | 288 } |
| 308 } | 289 } |
| 309 | 290 |
| 310 | |
| 311 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> | 291 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> |
| 312 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: | 292 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: |
| 313 HandlesBlock::Visit(HandleVisitor* visitor) { | 293 HandlesBlock::Visit(HandleVisitor* visitor) { |
| 314 ASSERT(visitor != NULL); | 294 ASSERT(visitor != NULL); |
| 315 for (intptr_t i = 0; i < next_handle_slot_; i += kHandleSizeInWords) { | 295 for (intptr_t i = 0; i < next_handle_slot_; i += kHandleSizeInWords) { |
| 316 visitor->VisitHandle(reinterpret_cast<uword>(&data_[i])); | 296 visitor->VisitHandle(reinterpret_cast<uword>(&data_[i])); |
| 317 } | 297 } |
| 318 } | 298 } |
| 319 | 299 |
| 320 | |
| 321 #if defined(DEBUG) | 300 #if defined(DEBUG) |
| 322 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> | 301 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> |
| 323 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: | 302 void Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: |
| 324 HandlesBlock::ZapFreeHandles() { | 303 HandlesBlock::ZapFreeHandles() { |
| 325 // Reinitialize the handle area to some uninitialized value. | 304 // Reinitialize the handle area to some uninitialized value. |
| 326 for (intptr_t i = next_handle_slot_; | 305 for (intptr_t i = next_handle_slot_; |
| 327 i < (kHandleSizeInWords * kHandlesPerChunk); i++) { | 306 i < (kHandleSizeInWords * kHandlesPerChunk); i++) { |
| 328 data_[i] = kZapUninitializedWord; | 307 data_[i] = kZapUninitializedWord; |
| 329 } | 308 } |
| 330 } | 309 } |
| 331 #endif | 310 #endif |
| 332 | 311 |
| 333 | |
| 334 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> | 312 template <int kHandleSizeInWords, int kHandlesPerChunk, int kOffsetOfRawPtr> |
| 335 int Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: | 313 int Handles<kHandleSizeInWords, kHandlesPerChunk, kOffsetOfRawPtr>:: |
| 336 HandlesBlock::HandleCount() const { | 314 HandlesBlock::HandleCount() const { |
| 337 return (next_handle_slot_ / kHandleSizeInWords); | 315 return (next_handle_slot_ / kHandleSizeInWords); |
| 338 } | 316 } |
| 339 | 317 |
| 340 } // namespace dart | 318 } // namespace dart |
| 341 | 319 |
| 342 #endif // RUNTIME_VM_HANDLES_IMPL_H_ | 320 #endif // RUNTIME_VM_HANDLES_IMPL_H_ |
| OLD | NEW |