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

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

Issue 1782043004: [heap] Use PageParallelJob for parallel evacuation (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 9 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/page-parallel-job.h ('k') | src/heap/spaces.cc » ('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 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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_SPACES_H_ 5 #ifndef V8_HEAP_SPACES_H_
6 #define V8_HEAP_SPACES_H_ 6 #define V8_HEAP_SPACES_H_
7 7
8 #include "src/allocation.h" 8 #include "src/allocation.h"
9 #include "src/atomic-utils.h" 9 #include "src/atomic-utils.h"
10 #include "src/base/atomicops.h" 10 #include "src/base/atomicops.h"
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 enum MemoryChunkFlags { 295 enum MemoryChunkFlags {
296 IS_EXECUTABLE, 296 IS_EXECUTABLE,
297 POINTERS_TO_HERE_ARE_INTERESTING, 297 POINTERS_TO_HERE_ARE_INTERESTING,
298 POINTERS_FROM_HERE_ARE_INTERESTING, 298 POINTERS_FROM_HERE_ARE_INTERESTING,
299 IN_FROM_SPACE, // Mutually exclusive with IN_TO_SPACE. 299 IN_FROM_SPACE, // Mutually exclusive with IN_TO_SPACE.
300 IN_TO_SPACE, // All pages in new space has one of these two set. 300 IN_TO_SPACE, // All pages in new space has one of these two set.
301 NEW_SPACE_BELOW_AGE_MARK, 301 NEW_SPACE_BELOW_AGE_MARK,
302 EVACUATION_CANDIDATE, 302 EVACUATION_CANDIDATE,
303 RESCAN_ON_EVACUATION, 303 RESCAN_ON_EVACUATION,
304 NEVER_EVACUATE, // May contain immortal immutables. 304 NEVER_EVACUATE, // May contain immortal immutables.
305 POPULAR_PAGE, // Slots buffer of this page overflowed on the previous GC.
306 305
307 // Large objects can have a progress bar in their page header. These object 306 // Large objects can have a progress bar in their page header. These object
308 // are scanned in increments and will be kept black while being scanned. 307 // are scanned in increments and will be kept black while being scanned.
309 // Even if the mutator writes to them they will be kept black and a white 308 // Even if the mutator writes to them they will be kept black and a white
310 // to grey transition is performed in the value. 309 // to grey transition is performed in the value.
311 HAS_PROGRESS_BAR, 310 HAS_PROGRESS_BAR,
312 311
313 // This flag is intended to be used for testing. Works only when both 312 // This flag is intended to be used for testing. Works only when both
314 // FLAG_stress_compaction and FLAG_manual_evacuation_candidates_selection 313 // FLAG_stress_compaction and FLAG_manual_evacuation_candidates_selection
315 // are set. It forces the page to become an evacuation candidate at next 314 // are set. It forces the page to become an evacuation candidate at next
316 // candidates selection cycle. 315 // candidates selection cycle.
317 FORCE_EVACUATION_CANDIDATE_FOR_TESTING, 316 FORCE_EVACUATION_CANDIDATE_FOR_TESTING,
318 317
319 // This flag is intended to be used for testing. 318 // This flag is intended to be used for testing.
320 NEVER_ALLOCATE_ON_PAGE, 319 NEVER_ALLOCATE_ON_PAGE,
321 320
322 // The memory chunk is already logically freed, however the actual freeing 321 // The memory chunk is already logically freed, however the actual freeing
323 // still has to be performed. 322 // still has to be performed.
324 PRE_FREED, 323 PRE_FREED,
325 324
326 // |COMPACTION_WAS_ABORTED|: Indicates that the compaction in this page 325 // |COMPACTION_WAS_ABORTED|: Indicates that the compaction in this page
327 // has been aborted and needs special handling by the sweeper. 326 // has been aborted and needs special handling by the sweeper.
328 COMPACTION_WAS_ABORTED, 327 COMPACTION_WAS_ABORTED,
329 328
330 // Last flag, keep at bottom. 329 // Last flag, keep at bottom.
331 NUM_MEMORY_CHUNK_FLAGS 330 NUM_MEMORY_CHUNK_FLAGS
332 }; 331 };
333 332
334 // |kCompactionDone|: Initial compaction state of a |MemoryChunk|.
335 // |kCompactingInProgress|: Parallel compaction is currently in progress.
336 // |kCompactingFinalize|: Parallel compaction is done but the chunk needs to
337 // be finalized.
338 // |kCompactingAborted|: Parallel compaction has been aborted, which should
339 // for now only happen in OOM scenarios.
340 enum ParallelCompactingState {
341 kCompactingDone,
342 kCompactingInProgress,
343 kCompactingFinalize,
344 kCompactingAborted,
345 };
346
347 // |kSweepingDone|: The page state when sweeping is complete or sweeping must 333 // |kSweepingDone|: The page state when sweeping is complete or sweeping must
348 // not be performed on that page. Sweeper threads that are done with their 334 // not be performed on that page. Sweeper threads that are done with their
349 // work will set this value and not touch the page anymore. 335 // work will set this value and not touch the page anymore.
350 // |kSweepingPending|: This page is ready for parallel sweeping. 336 // |kSweepingPending|: This page is ready for parallel sweeping.
351 // |kSweepingInProgress|: This page is currently swept by a sweeper thread. 337 // |kSweepingInProgress|: This page is currently swept by a sweeper thread.
352 enum ConcurrentSweepingState { 338 enum ConcurrentSweepingState {
353 kSweepingDone, 339 kSweepingDone,
354 kSweepingPending, 340 kSweepingPending,
355 kSweepingInProgress, 341 kSweepingInProgress,
356 }; 342 };
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
396 kOldToNewSlotsOffset + kPointerSize // SlotSet* old_to_new_slots_; 382 kOldToNewSlotsOffset + kPointerSize // SlotSet* old_to_new_slots_;
397 + kPointerSize // SlotSet* old_to_old_slots_; 383 + kPointerSize // SlotSet* old_to_old_slots_;
398 + kPointerSize // TypedSlotSet* typed_old_to_old_slots_; 384 + kPointerSize // TypedSlotSet* typed_old_to_old_slots_;
399 + kPointerSize; // SkipList* skip_list_; 385 + kPointerSize; // SkipList* skip_list_;
400 386
401 static const size_t kMinHeaderSize = 387 static const size_t kMinHeaderSize =
402 kWriteBarrierCounterOffset + 388 kWriteBarrierCounterOffset +
403 kIntptrSize // intptr_t write_barrier_counter_ 389 kIntptrSize // intptr_t write_barrier_counter_
404 + kPointerSize // AtomicValue high_water_mark_ 390 + kPointerSize // AtomicValue high_water_mark_
405 + kPointerSize // base::Mutex* mutex_ 391 + kPointerSize // base::Mutex* mutex_
406 + kPointerSize // base::AtomicWord parallel_sweeping_ 392 + kPointerSize // base::AtomicWord concurrent_sweeping_
407 + kPointerSize // AtomicValue parallel_compaction_
408 + 2 * kPointerSize // AtomicNumber free-list statistics 393 + 2 * kPointerSize // AtomicNumber free-list statistics
409 + kPointerSize // AtomicValue next_chunk_ 394 + kPointerSize // AtomicValue next_chunk_
410 + kPointerSize; // AtomicValue prev_chunk_ 395 + kPointerSize; // AtomicValue prev_chunk_
411 396
412 // We add some more space to the computed header size to amount for missing 397 // We add some more space to the computed header size to amount for missing
413 // alignment requirements in our computation. 398 // alignment requirements in our computation.
414 // Try to get kHeaderSize properly aligned on 32-bit and 64-bit machines. 399 // Try to get kHeaderSize properly aligned on 32-bit and 64-bit machines.
415 static const size_t kHeaderSize = kMinHeaderSize; 400 static const size_t kHeaderSize = kMinHeaderSize;
416 401
417 static const int kBodyOffset = 402 static const int kBodyOffset =
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
464 // Checks whether |addr| can be a limit of addresses in this page. It's a 449 // Checks whether |addr| can be a limit of addresses in this page. It's a
465 // limit if it's in the page, or if it's just after the last byte of the page. 450 // limit if it's in the page, or if it's just after the last byte of the page.
466 bool ContainsLimit(Address addr) { 451 bool ContainsLimit(Address addr) {
467 return addr >= area_start() && addr <= area_end(); 452 return addr >= area_start() && addr <= area_end();
468 } 453 }
469 454
470 AtomicValue<ConcurrentSweepingState>& concurrent_sweeping_state() { 455 AtomicValue<ConcurrentSweepingState>& concurrent_sweeping_state() {
471 return concurrent_sweeping_; 456 return concurrent_sweeping_;
472 } 457 }
473 458
474 AtomicValue<ParallelCompactingState>& parallel_compaction_state() {
475 return parallel_compaction_;
476 }
477
478 // Manage live byte count, i.e., count of bytes in black objects. 459 // Manage live byte count, i.e., count of bytes in black objects.
479 inline void ResetLiveBytes(); 460 inline void ResetLiveBytes();
480 inline void IncrementLiveBytes(int by); 461 inline void IncrementLiveBytes(int by);
481 462
482 int LiveBytes() { 463 int LiveBytes() {
483 DCHECK_LE(static_cast<size_t>(live_byte_count_), size_); 464 DCHECK_LE(static_cast<size_t>(live_byte_count_), size_);
484 return live_byte_count_; 465 return live_byte_count_;
485 } 466 }
486 467
487 void SetLiveBytes(int live_bytes) { 468 void SetLiveBytes(int live_bytes) {
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
694 675
695 intptr_t write_barrier_counter_; 676 intptr_t write_barrier_counter_;
696 677
697 // Assuming the initial allocation on a page is sequential, 678 // Assuming the initial allocation on a page is sequential,
698 // count highest number of bytes ever allocated on the page. 679 // count highest number of bytes ever allocated on the page.
699 AtomicValue<intptr_t> high_water_mark_; 680 AtomicValue<intptr_t> high_water_mark_;
700 681
701 base::Mutex* mutex_; 682 base::Mutex* mutex_;
702 683
703 AtomicValue<ConcurrentSweepingState> concurrent_sweeping_; 684 AtomicValue<ConcurrentSweepingState> concurrent_sweeping_;
704 AtomicValue<ParallelCompactingState> parallel_compaction_;
705 685
706 // PagedSpace free-list statistics. 686 // PagedSpace free-list statistics.
707 AtomicNumber<intptr_t> available_in_free_list_; 687 AtomicNumber<intptr_t> available_in_free_list_;
708 AtomicNumber<intptr_t> wasted_memory_; 688 AtomicNumber<intptr_t> wasted_memory_;
709 689
710 // next_chunk_ holds a pointer of type MemoryChunk 690 // next_chunk_ holds a pointer of type MemoryChunk
711 AtomicValue<MemoryChunk*> next_chunk_; 691 AtomicValue<MemoryChunk*> next_chunk_;
712 // prev_chunk_ holds a pointer of type MemoryChunk 692 // prev_chunk_ holds a pointer of type MemoryChunk
713 AtomicValue<MemoryChunk*> prev_chunk_; 693 AtomicValue<MemoryChunk*> prev_chunk_;
714 694
(...skipping 2324 matching lines...) Expand 10 before | Expand all | Expand 10 after
3039 count = 0; 3019 count = 0;
3040 } 3020 }
3041 // Must be small, since an iteration is used for lookup. 3021 // Must be small, since an iteration is used for lookup.
3042 static const int kMaxComments = 64; 3022 static const int kMaxComments = 64;
3043 }; 3023 };
3044 #endif 3024 #endif
3045 } // namespace internal 3025 } // namespace internal
3046 } // namespace v8 3026 } // namespace v8
3047 3027
3048 #endif // V8_HEAP_SPACES_H_ 3028 #endif // V8_HEAP_SPACES_H_
OLDNEW
« no previous file with comments | « src/heap/page-parallel-job.h ('k') | src/heap/spaces.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698