Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: src/heap/heap.cc

Issue 1105693002: Implement IdentityMap<V>, a robust, GC-safe object-identity HashMap. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/heap/heap.h ('k') | src/heap/identity-map.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/api.h" 8 #include "src/api.h"
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/base/once.h" 10 #include "src/base/once.h"
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 #endif 47 #endif
48 #if V8_TARGET_ARCH_MIPS64 && !V8_INTERPRETED_REGEXP 48 #if V8_TARGET_ARCH_MIPS64 && !V8_INTERPRETED_REGEXP
49 #include "src/regexp-macro-assembler.h" 49 #include "src/regexp-macro-assembler.h"
50 #include "src/mips64/regexp-macro-assembler-mips64.h" 50 #include "src/mips64/regexp-macro-assembler-mips64.h"
51 #endif 51 #endif
52 52
53 namespace v8 { 53 namespace v8 {
54 namespace internal { 54 namespace internal {
55 55
56 56
57 struct Heap::StrongRootsList {
58 Object** start;
59 Object** end;
60 StrongRootsList* next;
61 };
62
63
57 Heap::Heap() 64 Heap::Heap()
58 : amount_of_external_allocated_memory_(0), 65 : amount_of_external_allocated_memory_(0),
59 amount_of_external_allocated_memory_at_last_global_gc_(0), 66 amount_of_external_allocated_memory_at_last_global_gc_(0),
60 isolate_(NULL), 67 isolate_(NULL),
61 code_range_size_(0), 68 code_range_size_(0),
62 // semispace_size_ should be a power of 2 and old_generation_size_ should 69 // semispace_size_ should be a power of 2 and old_generation_size_ should
63 // be a multiple of Page::kPageSize. 70 // be a multiple of Page::kPageSize.
64 reserved_semispace_size_(8 * (kPointerSize / 4) * MB), 71 reserved_semispace_size_(8 * (kPointerSize / 4) * MB),
65 max_semi_space_size_(8 * (kPointerSize / 4) * MB), 72 max_semi_space_size_(8 * (kPointerSize / 4) * MB),
66 initial_semispace_size_(Page::kPageSize), 73 initial_semispace_size_(Page::kPageSize),
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 full_codegen_bytes_generated_(0), 141 full_codegen_bytes_generated_(0),
135 crankshaft_codegen_bytes_generated_(0), 142 crankshaft_codegen_bytes_generated_(0),
136 gcs_since_last_deopt_(0), 143 gcs_since_last_deopt_(0),
137 allocation_sites_scratchpad_length_(0), 144 allocation_sites_scratchpad_length_(0),
138 promotion_queue_(this), 145 promotion_queue_(this),
139 configured_(false), 146 configured_(false),
140 external_string_table_(this), 147 external_string_table_(this),
141 chunks_queued_for_free_(NULL), 148 chunks_queued_for_free_(NULL),
142 gc_callbacks_depth_(0), 149 gc_callbacks_depth_(0),
143 deserialization_complete_(false), 150 deserialization_complete_(false),
144 concurrent_sweeping_enabled_(false) { 151 concurrent_sweeping_enabled_(false),
152 strong_roots_list_(NULL) {
145 // Allow build-time customization of the max semispace size. Building 153 // Allow build-time customization of the max semispace size. Building
146 // V8 with snapshots and a non-default max semispace size is much 154 // V8 with snapshots and a non-default max semispace size is much
147 // easier if you can define it as part of the build environment. 155 // easier if you can define it as part of the build environment.
148 #if defined(V8_MAX_SEMISPACE_SIZE) 156 #if defined(V8_MAX_SEMISPACE_SIZE)
149 max_semi_space_size_ = reserved_semispace_size_ = V8_MAX_SEMISPACE_SIZE; 157 max_semi_space_size_ = reserved_semispace_size_ = V8_MAX_SEMISPACE_SIZE;
150 #endif 158 #endif
151 159
152 // Ensure old_generation_size_ is a multiple of kPageSize. 160 // Ensure old_generation_size_ is a multiple of kPageSize.
153 DCHECK(MB >= Page::kPageSize); 161 DCHECK(MB >= Page::kPageSize);
154 162
(...skipping 4865 matching lines...) Expand 10 before | Expand all | Expand 10 after
5020 isolate_->eternal_handles()->IterateNewSpaceRoots(v); 5028 isolate_->eternal_handles()->IterateNewSpaceRoots(v);
5021 } else { 5029 } else {
5022 isolate_->eternal_handles()->IterateAllRoots(v); 5030 isolate_->eternal_handles()->IterateAllRoots(v);
5023 } 5031 }
5024 v->Synchronize(VisitorSynchronization::kEternalHandles); 5032 v->Synchronize(VisitorSynchronization::kEternalHandles);
5025 5033
5026 // Iterate over pointers being held by inactive threads. 5034 // Iterate over pointers being held by inactive threads.
5027 isolate_->thread_manager()->Iterate(v); 5035 isolate_->thread_manager()->Iterate(v);
5028 v->Synchronize(VisitorSynchronization::kThreadManager); 5036 v->Synchronize(VisitorSynchronization::kThreadManager);
5029 5037
5038 // Iterate over other strong roots (currently only identity maps).
5039 for (StrongRootsList* list = strong_roots_list_; list; list = list->next) {
5040 v->VisitPointers(list->start, list->end);
5041 }
5042 v->Synchronize(VisitorSynchronization::kStrongRoots);
5043
5030 // Iterate over the pointers the Serialization/Deserialization code is 5044 // Iterate over the pointers the Serialization/Deserialization code is
5031 // holding. 5045 // holding.
5032 // During garbage collection this keeps the partial snapshot cache alive. 5046 // During garbage collection this keeps the partial snapshot cache alive.
5033 // During deserialization of the startup snapshot this creates the partial 5047 // During deserialization of the startup snapshot this creates the partial
5034 // snapshot cache and deserializes the objects it refers to. During 5048 // snapshot cache and deserializes the objects it refers to. During
5035 // serialization this does nothing, since the partial snapshot cache is 5049 // serialization this does nothing, since the partial snapshot cache is
5036 // empty. However the next thing we do is create the partial snapshot, 5050 // empty. However the next thing we do is create the partial snapshot,
5037 // filling up the partial snapshot cache with objects it needs as we go. 5051 // filling up the partial snapshot cache with objects it needs as we go.
5038 SerializerDeserializer::Iterate(isolate_, v); 5052 SerializerDeserializer::Iterate(isolate_, v);
5039 // We don't do a v->Synchronize call here, because in debug mode that will 5053 // We don't do a v->Synchronize call here, because in debug mode that will
(...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after
5534 5548
5535 if (lo_space_ != NULL) { 5549 if (lo_space_ != NULL) {
5536 lo_space_->TearDown(); 5550 lo_space_->TearDown();
5537 delete lo_space_; 5551 delete lo_space_;
5538 lo_space_ = NULL; 5552 lo_space_ = NULL;
5539 } 5553 }
5540 5554
5541 store_buffer()->TearDown(); 5555 store_buffer()->TearDown();
5542 5556
5543 isolate_->memory_allocator()->TearDown(); 5557 isolate_->memory_allocator()->TearDown();
5558
5559 StrongRootsList* next = NULL;
5560 for (StrongRootsList* list = strong_roots_list_; list; list = next) {
5561 next = list->next;
5562 delete list;
5563 }
5564 strong_roots_list_ = NULL;
5544 } 5565 }
5545 5566
5546 5567
5547 void Heap::AddGCPrologueCallback(v8::Isolate::GCPrologueCallback callback, 5568 void Heap::AddGCPrologueCallback(v8::Isolate::GCPrologueCallback callback,
5548 GCType gc_type, bool pass_isolate) { 5569 GCType gc_type, bool pass_isolate) {
5549 DCHECK(callback != NULL); 5570 DCHECK(callback != NULL);
5550 GCPrologueCallbackPair pair(callback, gc_type, pass_isolate); 5571 GCPrologueCallbackPair pair(callback, gc_type, pass_isolate);
5551 DCHECK(!gc_prologue_callbacks_.Contains(pair)); 5572 DCHECK(!gc_prologue_callbacks_.Contains(pair));
5552 return gc_prologue_callbacks_.Add(pair); 5573 return gc_prologue_callbacks_.Add(pair);
5553 } 5574 }
(...skipping 878 matching lines...) Expand 10 before | Expand all | Expand 10 after
6432 static_cast<int>(object_sizes_[index])); \ 6453 static_cast<int>(object_sizes_[index])); \
6433 counters->size_of_CODE_AGE_##name()->Decrement( \ 6454 counters->size_of_CODE_AGE_##name()->Decrement( \
6434 static_cast<int>(object_sizes_last_time_[index])); 6455 static_cast<int>(object_sizes_last_time_[index]));
6435 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT) 6456 CODE_AGE_LIST_COMPLETE(ADJUST_LAST_TIME_OBJECT_COUNT)
6436 #undef ADJUST_LAST_TIME_OBJECT_COUNT 6457 #undef ADJUST_LAST_TIME_OBJECT_COUNT
6437 6458
6438 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_)); 6459 MemCopy(object_counts_last_time_, object_counts_, sizeof(object_counts_));
6439 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_)); 6460 MemCopy(object_sizes_last_time_, object_sizes_, sizeof(object_sizes_));
6440 ClearObjectStats(); 6461 ClearObjectStats();
6441 } 6462 }
6463
6464
6465 void Heap::RegisterStrongRoots(Object** start, Object** end) {
6466 StrongRootsList* list = new StrongRootsList();
6467 list->next = strong_roots_list_;
6468 list->start = start;
6469 list->end = end;
6470 strong_roots_list_ = list;
6471 }
6472
6473
6474 void Heap::UnregisterStrongRoots(Object** start) {
6475 StrongRootsList* prev = NULL;
6476 StrongRootsList* list = strong_roots_list_;
6477 while (list != nullptr) {
6478 StrongRootsList* next = list->next;
6479 if (list->start == start) {
6480 if (prev) {
6481 prev->next = next;
6482 } else {
6483 strong_roots_list_ = next;
6484 }
6485 delete list;
6486 } else {
6487 prev = list;
6488 }
6489 list = next;
6490 }
6491 }
6442 } 6492 }
6443 } // namespace v8::internal 6493 } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/heap/heap.h ('k') | src/heap/identity-map.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698