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

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

Issue 1317553002: [heap] Prevent direct access to StoreBuffer. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebased. Created 5 years, 3 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/assembler.cc ('k') | src/heap/mark-compact.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 #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 #include <map> 9 #include <map>
10 10
(...skipping 976 matching lines...) Expand 10 before | Expand all | Expand 10 after
987 987
988 // Sets the non_monomorphic_cache_ (only used when expanding the dictionary). 988 // Sets the non_monomorphic_cache_ (only used when expanding the dictionary).
989 void public_set_non_monomorphic_cache(UnseededNumberDictionary* value) { 989 void public_set_non_monomorphic_cache(UnseededNumberDictionary* value) {
990 roots_[kNonMonomorphicCacheRootIndex] = value; 990 roots_[kNonMonomorphicCacheRootIndex] = value;
991 } 991 }
992 992
993 void public_set_empty_script(Script* script) { 993 void public_set_empty_script(Script* script) {
994 roots_[kEmptyScriptRootIndex] = script; 994 roots_[kEmptyScriptRootIndex] = script;
995 } 995 }
996 996
997 void public_set_store_buffer_top(Address* top) {
998 roots_[kStoreBufferTopRootIndex] = reinterpret_cast<Smi*>(top);
999 }
1000
1001 void public_set_materialized_objects(FixedArray* objects) { 997 void public_set_materialized_objects(FixedArray* objects) {
1002 roots_[kMaterializedObjectsRootIndex] = objects; 998 roots_[kMaterializedObjectsRootIndex] = objects;
1003 } 999 }
1004 1000
1005 // Generated code can embed this address to get access to the roots. 1001 // Generated code can embed this address to get access to the roots.
1006 Object** roots_array_start() { return roots_; } 1002 Object** roots_array_start() { return roots_; }
1007 1003
1008 Address* store_buffer_top_address() {
1009 return reinterpret_cast<Address*>(&roots_[kStoreBufferTopRootIndex]);
1010 }
1011
1012 void CheckHandleCount(); 1004 void CheckHandleCount();
1013 1005
1014 // Number of "runtime allocations" done so far. 1006 // Number of "runtime allocations" done so far.
1015 uint32_t allocations_count() { return allocations_count_; } 1007 uint32_t allocations_count() { return allocations_count_; }
1016 1008
1017 // Returns deterministic "time" value in ms. Works only with 1009 // Returns deterministic "time" value in ms. Works only with
1018 // FLAG_verify_predictable. 1010 // FLAG_verify_predictable.
1019 double synthetic_time() { return allocations_count() / 2.0; } 1011 double synthetic_time() { return allocations_count() / 2.0; }
1020 1012
1021 // Print short heap statistics. 1013 // Print short heap statistics.
1022 void PrintShortHeapStatistics(); 1014 void PrintShortHeapStatistics();
1023 1015
1024 size_t object_count_last_gc(size_t index) { 1016 size_t object_count_last_gc(size_t index) {
1025 return index < OBJECT_STATS_COUNT ? object_counts_last_time_[index] : 0; 1017 return index < OBJECT_STATS_COUNT ? object_counts_last_time_[index] : 0;
1026 } 1018 }
1027 1019
1028 size_t object_size_last_gc(size_t index) { 1020 size_t object_size_last_gc(size_t index) {
1029 return index < OBJECT_STATS_COUNT ? object_sizes_last_time_[index] : 0; 1021 return index < OBJECT_STATS_COUNT ? object_sizes_last_time_[index] : 0;
1030 } 1022 }
1031 1023
1032 // Write barrier support for address[offset] = o.
1033 INLINE(void RecordWrite(Address address, int offset));
1034
1035 // Write barrier support for address[start : start + len[ = o.
1036 INLINE(void RecordWrites(Address address, int start, int len));
1037
1038 inline HeapState gc_state() { return gc_state_; } 1024 inline HeapState gc_state() { return gc_state_; }
1039 1025
1040 inline bool IsInGCPostProcessing() { return gc_post_processing_depth_ > 0; } 1026 inline bool IsInGCPostProcessing() { return gc_post_processing_depth_ > 0; }
1041 1027
1042 // If an object has an AllocationMemento trailing it, return it, otherwise 1028 // If an object has an AllocationMemento trailing it, return it, otherwise
1043 // return NULL; 1029 // return NULL;
1044 inline AllocationMemento* FindAllocationMemento(HeapObject* object); 1030 inline AllocationMemento* FindAllocationMemento(HeapObject* object);
1045 1031
1046 // Returns false if not able to reserve. 1032 // Returns false if not able to reserve.
1047 bool ReserveSpace(Reservation* reservations); 1033 bool ReserveSpace(Reservation* reservations);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1087 void VisitExternalResources(v8::ExternalResourceVisitor* visitor); 1073 void VisitExternalResources(v8::ExternalResourceVisitor* visitor);
1088 1074
1089 // An object should be promoted if the object has survived a 1075 // An object should be promoted if the object has survived a
1090 // scavenge operation. 1076 // scavenge operation.
1091 inline bool ShouldBePromoted(Address old_address, int object_size); 1077 inline bool ShouldBePromoted(Address old_address, int object_size);
1092 1078
1093 void ClearNormalizedMapCaches(); 1079 void ClearNormalizedMapCaches();
1094 1080
1095 void IncrementDeferredCount(v8::Isolate::UseCounterFeature feature); 1081 void IncrementDeferredCount(v8::Isolate::UseCounterFeature feature);
1096 1082
1097 ExternalStringTable* external_string_table() {
1098 return &external_string_table_;
1099 }
1100
1101 bool concurrent_sweeping_enabled() { return concurrent_sweeping_enabled_; } 1083 bool concurrent_sweeping_enabled() { return concurrent_sweeping_enabled_; }
1102 1084
1103 inline bool OldGenerationAllocationLimitReached(); 1085 inline bool OldGenerationAllocationLimitReached();
1104 1086
1105 void QueueMemoryChunkForFree(MemoryChunk* chunk); 1087 void QueueMemoryChunkForFree(MemoryChunk* chunk);
1106 void FilterStoreBufferEntriesOnAboutToBeFreedPages(); 1088 void FilterStoreBufferEntriesOnAboutToBeFreedPages();
1107 void FreeQueuedChunks(MemoryChunk* list_head); 1089 void FreeQueuedChunks(MemoryChunk* list_head);
1108 void FreeQueuedChunks(); 1090 void FreeQueuedChunks();
1109 void WaitUntilUnmappingOfFreeChunksCompleted(); 1091 void WaitUntilUnmappingOfFreeChunksCompleted();
1110 1092
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
1300 GCTracer* tracer() { return tracer_; } 1282 GCTracer* tracer() { return tracer_; }
1301 1283
1302 PromotionQueue* promotion_queue() { return &promotion_queue_; } 1284 PromotionQueue* promotion_queue() { return &promotion_queue_; }
1303 1285
1304 inline Isolate* isolate(); 1286 inline Isolate* isolate();
1305 1287
1306 MarkCompactCollector* mark_compact_collector() { 1288 MarkCompactCollector* mark_compact_collector() {
1307 return &mark_compact_collector_; 1289 return &mark_compact_collector_;
1308 } 1290 }
1309 1291
1310 StoreBuffer* store_buffer() { return &store_buffer_; } 1292 ExternalStringTable* external_string_table() {
1293 return &external_string_table_;
1294 }
1311 1295
1312 // =========================================================================== 1296 // ===========================================================================
1313 // Inline allocation. ======================================================== 1297 // Inline allocation. ========================================================
1314 // =========================================================================== 1298 // ===========================================================================
1315 1299
1316 // Indicates whether inline bump-pointer allocation has been disabled. 1300 // Indicates whether inline bump-pointer allocation has been disabled.
1317 bool inline_allocation_disabled() { return inline_allocation_disabled_; } 1301 bool inline_allocation_disabled() { return inline_allocation_disabled_; }
1318 1302
1319 // Switch whether inline bump-pointer allocation should be used. 1303 // Switch whether inline bump-pointer allocation should be used.
1320 void EnableInlineAllocation(); 1304 void EnableInlineAllocation();
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1358 // Iterates over all the other roots in the heap. 1342 // Iterates over all the other roots in the heap.
1359 void IterateWeakRoots(ObjectVisitor* v, VisitMode mode); 1343 void IterateWeakRoots(ObjectVisitor* v, VisitMode mode);
1360 1344
1361 // Iterate pointers to from semispace of new space found in memory interval 1345 // Iterate pointers to from semispace of new space found in memory interval
1362 // from start to end within |object|. 1346 // from start to end within |object|.
1363 void IterateAndMarkPointersToFromSpace(HeapObject* object, Address start, 1347 void IterateAndMarkPointersToFromSpace(HeapObject* object, Address start,
1364 Address end, bool record_slots, 1348 Address end, bool record_slots,
1365 ObjectSlotCallback callback); 1349 ObjectSlotCallback callback);
1366 1350
1367 // =========================================================================== 1351 // ===========================================================================
1352 // Store buffer API. =========================================================
1353 // ===========================================================================
1354
1355 // Write barrier support for address[offset] = o.
1356 INLINE(void RecordWrite(Address address, int offset));
1357
1358 // Write barrier support for address[start : start + len[ = o.
1359 INLINE(void RecordWrites(Address address, int start, int len));
1360
1361 Address* store_buffer_top_address() {
1362 return reinterpret_cast<Address*>(&roots_[kStoreBufferTopRootIndex]);
1363 }
1364
1365 // ===========================================================================
1368 // Incremental marking API. ================================================== 1366 // Incremental marking API. ==================================================
1369 // =========================================================================== 1367 // ===========================================================================
1370 1368
1371 // Start incremental marking and ensure that idle time handler can perform 1369 // Start incremental marking and ensure that idle time handler can perform
1372 // incremental steps. 1370 // incremental steps.
1373 void StartIdleIncrementalMarking(); 1371 void StartIdleIncrementalMarking();
1374 1372
1375 // Starts incremental marking assuming incremental marking is currently 1373 // Starts incremental marking assuming incremental marking is currently
1376 // stopped. 1374 // stopped.
1377 void StartIncrementalMarking(int gc_flags = kNoGCFlags, 1375 void StartIncrementalMarking(int gc_flags = kNoGCFlags,
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
1676 static AllocationSpace SelectSpace(int object_size, PretenureFlag pretenure) { 1674 static AllocationSpace SelectSpace(int object_size, PretenureFlag pretenure) {
1677 if (object_size > Page::kMaxRegularHeapObjectSize) return LO_SPACE; 1675 if (object_size > Page::kMaxRegularHeapObjectSize) return LO_SPACE;
1678 return (pretenure == TENURED) ? OLD_SPACE : NEW_SPACE; 1676 return (pretenure == TENURED) ? OLD_SPACE : NEW_SPACE;
1679 } 1677 }
1680 1678
1681 #define ROOT_ACCESSOR(type, name, camel_name) \ 1679 #define ROOT_ACCESSOR(type, name, camel_name) \
1682 inline void set_##name(type* value); 1680 inline void set_##name(type* value);
1683 ROOT_LIST(ROOT_ACCESSOR) 1681 ROOT_LIST(ROOT_ACCESSOR)
1684 #undef ROOT_ACCESSOR 1682 #undef ROOT_ACCESSOR
1685 1683
1684 StoreBuffer* store_buffer() { return &store_buffer_; }
1685
1686 void set_current_gc_flags(int flags) { 1686 void set_current_gc_flags(int flags) {
1687 current_gc_flags_ = flags; 1687 current_gc_flags_ = flags;
1688 DCHECK(!ShouldFinalizeIncrementalMarking() || 1688 DCHECK(!ShouldFinalizeIncrementalMarking() ||
1689 !ShouldAbortIncrementalMarking()); 1689 !ShouldAbortIncrementalMarking());
1690 } 1690 }
1691 1691
1692 inline bool ShouldReduceMemory() const { 1692 inline bool ShouldReduceMemory() const {
1693 return current_gc_flags_ & kReduceMemoryFootprintMask; 1693 return current_gc_flags_ & kReduceMemoryFootprintMask;
1694 } 1694 }
1695 1695
(...skipping 708 matching lines...) Expand 10 before | Expand all | Expand 10 after
2404 friend class Factory; 2404 friend class Factory;
2405 friend class GCCallbacksScope; 2405 friend class GCCallbacksScope;
2406 friend class GCTracer; 2406 friend class GCTracer;
2407 friend class HeapIterator; 2407 friend class HeapIterator;
2408 friend class IncrementalMarking; 2408 friend class IncrementalMarking;
2409 friend class Isolate; 2409 friend class Isolate;
2410 friend class MarkCompactCollector; 2410 friend class MarkCompactCollector;
2411 friend class MarkCompactMarkingVisitor; 2411 friend class MarkCompactMarkingVisitor;
2412 friend class MapCompact; 2412 friend class MapCompact;
2413 friend class Page; 2413 friend class Page;
2414 friend class StoreBuffer;
2414 2415
2415 // Used in cctest. 2416 // Used in cctest.
2416 friend class HeapTester; 2417 friend class HeapTester;
2417 2418
2418 DISALLOW_COPY_AND_ASSIGN(Heap); 2419 DISALLOW_COPY_AND_ASSIGN(Heap);
2419 }; 2420 };
2420 2421
2421 2422
2422 class HeapStats { 2423 class HeapStats {
2423 public: 2424 public:
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
2778 DisallowHeapAllocation no_allocation; // i.e. no gc allowed. 2779 DisallowHeapAllocation no_allocation; // i.e. no gc allowed.
2779 2780
2780 private: 2781 private:
2781 DISALLOW_IMPLICIT_CONSTRUCTORS(PathTracer); 2782 DISALLOW_IMPLICIT_CONSTRUCTORS(PathTracer);
2782 }; 2783 };
2783 #endif // DEBUG 2784 #endif // DEBUG
2784 } 2785 }
2785 } // namespace v8::internal 2786 } // namespace v8::internal
2786 2787
2787 #endif // V8_HEAP_HEAP_H_ 2788 #endif // V8_HEAP_HEAP_H_
OLDNEW
« no previous file with comments | « src/assembler.cc ('k') | src/heap/mark-compact.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698