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

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

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 | « BUILD.gn ('k') | src/heap/heap.cc » ('j') | src/heap/heap.cc » ('J')
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 #ifndef V8_HEAP_HEAP_H_ 5 #ifndef V8_HEAP_HEAP_H_
6 #define V8_HEAP_HEAP_H_ 6 #define V8_HEAP_HEAP_H_
7 7
8 #include <cmath> 8 #include <cmath>
9 9
10 #include "src/allocation.h" 10 #include "src/allocation.h"
(...skipping 1435 matching lines...) Expand 10 before | Expand all | Expand 10 after
1446 void RecordFixedArraySubTypeStats(int array_sub_type, size_t size) { 1446 void RecordFixedArraySubTypeStats(int array_sub_type, size_t size) {
1447 DCHECK(array_sub_type <= LAST_FIXED_ARRAY_SUB_TYPE); 1447 DCHECK(array_sub_type <= LAST_FIXED_ARRAY_SUB_TYPE);
1448 object_counts_[FIRST_FIXED_ARRAY_SUB_TYPE + array_sub_type]++; 1448 object_counts_[FIRST_FIXED_ARRAY_SUB_TYPE + array_sub_type]++;
1449 object_sizes_[FIRST_FIXED_ARRAY_SUB_TYPE + array_sub_type] += size; 1449 object_sizes_[FIRST_FIXED_ARRAY_SUB_TYPE + array_sub_type] += size;
1450 } 1450 }
1451 1451
1452 void TraceObjectStats(); 1452 void TraceObjectStats();
1453 void TraceObjectStat(const char* name, int count, int size, double time); 1453 void TraceObjectStat(const char* name, int count, int size, double time);
1454 void CheckpointObjectStats(); 1454 void CheckpointObjectStats();
1455 1455
1456 // We don't use a LockGuard here since we want to lock the heap 1456 struct StrongRootsList {
Benedikt Meurer 2015/04/29 03:48:35 Style nit: Please forward declare struct and the t
titzer 2015/05/06 09:11:25 Done.
1457 // only when FLAG_concurrent_recompilation is true. 1457 Object** start_;
1458 Object** end_;
1459 StrongRootsList* next_;
1460 };
1461
1462 void RegisterStrongRoots(Object** start, Object** end) {
1463 StrongRootsList* list = new StrongRootsList();
1464 list->next_ = strong_roots_list_;
1465 list->start_ = start;
1466 list->end_ = end;
1467 strong_roots_list_ = list;
1468 }
1469
1470 void UnregisterStrongRoots(Object** start) {
1471 StrongRootsList* prev = NULL;
1472 for (StrongRootsList* list = strong_roots_list_; list; list = list->next_) {
1473 if (list->start_ == start) {
1474 if (prev) {
1475 prev->next_ = list->next_;
1476 } else {
1477 strong_roots_list_ = list->next_;
1478 }
1479 delete list;
1480 }
1481 prev = list;
1482 }
1483 }
1484
1485 // Taking this lock prevents the GC from entering a phase that relocates
1486 // object references.
1458 class RelocationLock { 1487 class RelocationLock {
1459 public: 1488 public:
1460 explicit RelocationLock(Heap* heap) : heap_(heap) { 1489 explicit RelocationLock(Heap* heap) : heap_(heap) {
1461 heap_->relocation_mutex_.Lock(); 1490 heap_->relocation_mutex_.Lock();
1462 } 1491 }
1463 1492
1464
1465 ~RelocationLock() { heap_->relocation_mutex_.Unlock(); } 1493 ~RelocationLock() { heap_->relocation_mutex_.Unlock(); }
1466 1494
1467 private: 1495 private:
1468 Heap* heap_; 1496 Heap* heap_;
1469 }; 1497 };
1470 1498
1499 // An optional version of the above lock that can be used for some critical
1500 // sections on the mutator thread; only safe since the GC currently does not
1501 // do concurrent compaction.
1502 class OptionalRelocationLock {
1503 public:
1504 explicit OptionalRelocationLock(Heap* heap, bool concurrent)
Benedikt Meurer 2015/04/29 03:48:35 You don't need explicit here.
titzer 2015/05/06 09:11:25 Done.
1505 : heap_(heap), concurrent_(concurrent) {
1506 if (concurrent_) heap_->relocation_mutex_.Lock();
1507 }
1508
1509 ~OptionalRelocationLock() {
1510 if (concurrent_) heap_->relocation_mutex_.Unlock();
1511 }
1512
1513 private:
1514 Heap* heap_;
1515 bool concurrent_;
1516 };
1517
1471 void AddWeakObjectToCodeDependency(Handle<HeapObject> obj, 1518 void AddWeakObjectToCodeDependency(Handle<HeapObject> obj,
1472 Handle<DependentCode> dep); 1519 Handle<DependentCode> dep);
1473 1520
1474 DependentCode* LookupWeakObjectToCodeDependency(Handle<HeapObject> obj); 1521 DependentCode* LookupWeakObjectToCodeDependency(Handle<HeapObject> obj);
1475 1522
1476 void AddRetainedMap(Handle<Map> map); 1523 void AddRetainedMap(Handle<Map> map);
1477 1524
1478 static void FatalProcessOutOfMemory(const char* location, 1525 static void FatalProcessOutOfMemory(const char* location,
1479 bool take_snapshot = false); 1526 bool take_snapshot = false);
1480 1527
(...skipping 667 matching lines...) Expand 10 before | Expand all | Expand 10 after
2148 MemoryChunk* chunks_queued_for_free_; 2195 MemoryChunk* chunks_queued_for_free_;
2149 2196
2150 base::Mutex relocation_mutex_; 2197 base::Mutex relocation_mutex_;
2151 2198
2152 int gc_callbacks_depth_; 2199 int gc_callbacks_depth_;
2153 2200
2154 bool deserialization_complete_; 2201 bool deserialization_complete_;
2155 2202
2156 bool concurrent_sweeping_enabled_; 2203 bool concurrent_sweeping_enabled_;
2157 2204
2205 StrongRootsList* strong_roots_list_;
2206
2158 friend class AlwaysAllocateScope; 2207 friend class AlwaysAllocateScope;
2159 friend class Deserializer; 2208 friend class Deserializer;
2160 friend class Factory; 2209 friend class Factory;
2161 friend class GCCallbacksScope; 2210 friend class GCCallbacksScope;
2162 friend class GCTracer; 2211 friend class GCTracer;
2163 friend class HeapIterator; 2212 friend class HeapIterator;
2164 friend class Isolate; 2213 friend class Isolate;
2165 friend class MarkCompactCollector; 2214 friend class MarkCompactCollector;
2166 friend class MarkCompactMarkingVisitor; 2215 friend class MarkCompactMarkingVisitor;
2167 friend class MapCompact; 2216 friend class MapCompact;
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after
2609 DisallowHeapAllocation no_allocation; // i.e. no gc allowed. 2658 DisallowHeapAllocation no_allocation; // i.e. no gc allowed.
2610 2659
2611 private: 2660 private:
2612 DISALLOW_IMPLICIT_CONSTRUCTORS(PathTracer); 2661 DISALLOW_IMPLICIT_CONSTRUCTORS(PathTracer);
2613 }; 2662 };
2614 #endif // DEBUG 2663 #endif // DEBUG
2615 } 2664 }
2616 } // namespace v8::internal 2665 } // namespace v8::internal
2617 2666
2618 #endif // V8_HEAP_HEAP_H_ 2667 #endif // V8_HEAP_HEAP_H_
OLDNEW
« no previous file with comments | « BUILD.gn ('k') | src/heap/heap.cc » ('j') | src/heap/heap.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698