| 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 #include "vm/atomic.h" | 5 #include "vm/atomic.h" |
| 6 #include "vm/class_table.h" | 6 #include "vm/class_table.h" |
| 7 #include "vm/flags.h" | 7 #include "vm/flags.h" |
| 8 #include "vm/freelist.h" | 8 #include "vm/freelist.h" |
| 9 #include "vm/growable_array.h" | 9 #include "vm/growable_array.h" |
| 10 #include "vm/heap.h" | 10 #include "vm/heap.h" |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 FATAL1("Fatal error in ClassTable::Register: invalid index %" Pd "\n", | 136 FATAL1("Fatal error in ClassTable::Register: invalid index %" Pd "\n", |
| 137 top_); | 137 top_); |
| 138 } | 138 } |
| 139 cls.set_id(top_); | 139 cls.set_id(top_); |
| 140 table_[top_] = cls.raw(); | 140 table_[top_] = cls.raw(); |
| 141 top_++; // Increment next index. | 141 top_++; // Increment next index. |
| 142 } | 142 } |
| 143 } | 143 } |
| 144 | 144 |
| 145 | 145 |
| 146 void ClassTable::RegisterAt(intptr_t index, const Class& cls) { | 146 void ClassTable::AllocateIndex(intptr_t index) { |
| 147 ASSERT(Thread::Current()->IsMutatorThread()); | |
| 148 ASSERT(index != kIllegalCid); | |
| 149 ASSERT(index >= kNumPredefinedCids); | |
| 150 if (index >= capacity_) { | 147 if (index >= capacity_) { |
| 151 // Grow the capacity of the class table. | 148 // Grow the capacity of the class table. |
| 152 // TODO(koda): Add ClassTable::Grow to share code. | 149 // TODO(koda): Add ClassTable::Grow to share code. |
| 153 intptr_t new_capacity = index + capacity_increment_; | 150 intptr_t new_capacity = index + capacity_increment_; |
| 154 if (!Class::is_valid_id(index) || new_capacity < capacity_) { | 151 if (!Class::is_valid_id(index) || new_capacity < capacity_) { |
| 155 FATAL1("Fatal error in ClassTable::Register: invalid index %" Pd "\n", | 152 FATAL1("Fatal error in ClassTable::Register: invalid index %" Pd "\n", |
| 156 index); | 153 index); |
| 157 } | 154 } |
| 158 RawClass** new_table = reinterpret_cast<RawClass**>( | 155 RawClass** new_table = reinterpret_cast<RawClass**>( |
| 159 malloc(new_capacity * sizeof(RawClass*))); // NOLINT | 156 malloc(new_capacity * sizeof(RawClass*))); // NOLINT |
| 160 memmove(new_table, table_, capacity_ * sizeof(RawClass*)); | 157 memmove(new_table, table_, capacity_ * sizeof(RawClass*)); |
| 161 ClassHeapStats* new_stats_table = reinterpret_cast<ClassHeapStats*>( | 158 ClassHeapStats* new_stats_table = reinterpret_cast<ClassHeapStats*>( |
| 162 realloc(class_heap_stats_table_, | 159 realloc(class_heap_stats_table_, |
| 163 new_capacity * sizeof(ClassHeapStats))); // NOLINT | 160 new_capacity * sizeof(ClassHeapStats))); // NOLINT |
| 164 for (intptr_t i = capacity_; i < new_capacity; i++) { | 161 for (intptr_t i = capacity_; i < new_capacity; i++) { |
| 165 new_table[i] = NULL; | 162 new_table[i] = NULL; |
| 166 new_stats_table[i].Initialize(); | 163 new_stats_table[i].Initialize(); |
| 167 } | 164 } |
| 168 capacity_ = new_capacity; | 165 capacity_ = new_capacity; |
| 169 old_tables_->Add(table_); | 166 old_tables_->Add(table_); |
| 170 table_ = new_table; // TODO(koda): This should use atomics. | 167 table_ = new_table; // TODO(koda): This should use atomics. |
| 171 class_heap_stats_table_ = new_stats_table; | 168 class_heap_stats_table_ = new_stats_table; |
| 172 ASSERT(capacity_increment_ >= 1); | 169 ASSERT(capacity_increment_ >= 1); |
| 173 } | 170 } |
| 171 |
| 174 ASSERT(table_[index] == 0); | 172 ASSERT(table_[index] == 0); |
| 175 cls.set_id(index); | |
| 176 table_[index] = cls.raw(); | |
| 177 if (index >= top_) { | 173 if (index >= top_) { |
| 178 top_ = index + 1; | 174 top_ = index + 1; |
| 179 } | 175 } |
| 180 } | 176 } |
| 181 | 177 |
| 182 | 178 |
| 179 void ClassTable::RegisterAt(intptr_t index, const Class& cls) { |
| 180 ASSERT(Thread::Current()->IsMutatorThread()); |
| 181 ASSERT(index != kIllegalCid); |
| 182 ASSERT(index >= kNumPredefinedCids); |
| 183 AllocateIndex(index); |
| 184 cls.set_id(index); |
| 185 table_[index] = cls.raw(); |
| 186 } |
| 187 |
| 188 |
| 183 #if defined(DEBUG) | 189 #if defined(DEBUG) |
| 184 void ClassTable::Unregister(intptr_t index) { | 190 void ClassTable::Unregister(intptr_t index) { |
| 185 table_[index] = 0; | 191 table_[index] = 0; |
| 186 } | 192 } |
| 187 #endif | 193 #endif |
| 188 | 194 |
| 189 | 195 |
| 190 void ClassTable::VisitObjectPointers(ObjectPointerVisitor* visitor) { | 196 void ClassTable::VisitObjectPointers(ObjectPointerVisitor* visitor) { |
| 191 ASSERT(visitor != NULL); | 197 ASSERT(visitor != NULL); |
| 192 visitor->VisitPointers(reinterpret_cast<RawObject**>(&table_[0]), top_); | 198 visitor->VisitPointers(reinterpret_cast<RawObject**>(&table_[0]), top_); |
| (...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 549 | 555 |
| 550 void ClassTable::UpdateLiveNew(intptr_t cid, intptr_t size) { | 556 void ClassTable::UpdateLiveNew(intptr_t cid, intptr_t size) { |
| 551 ClassHeapStats* stats = PreliminaryStatsAt(cid); | 557 ClassHeapStats* stats = PreliminaryStatsAt(cid); |
| 552 ASSERT(stats != NULL); | 558 ASSERT(stats != NULL); |
| 553 ASSERT(size >= 0); | 559 ASSERT(size >= 0); |
| 554 stats->post_gc.AddNew(size); | 560 stats->post_gc.AddNew(size); |
| 555 } | 561 } |
| 556 | 562 |
| 557 | 563 |
| 558 } // namespace dart | 564 } // namespace dart |
| OLD | NEW |