1/*
2 * Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#ifndef SHARE_GC_PARALLEL_PSCARDTABLE_HPP
26#define SHARE_GC_PARALLEL_PSCARDTABLE_HPP
27
28#include "gc/shared/cardTable.hpp"
29#include "oops/oop.hpp"
30
31class MutableSpace;
32class ObjectStartArray;
33class PSPromotionManager;
34class GCTaskQueue;
35
36class PSCardTable: public CardTable {
37 private:
38 // Support methods for resizing the card table.
39 // resize_commit_uncommit() returns true if the pages were committed or
40 // uncommitted
41 bool resize_commit_uncommit(int changed_region, MemRegion new_region);
42 void resize_update_card_table_entries(int changed_region,
43 MemRegion new_region);
44 void resize_update_committed_table(int changed_region, MemRegion new_region);
45 void resize_update_covered_table(int changed_region, MemRegion new_region);
46
47 void verify_all_young_refs_precise_helper(MemRegion mr);
48
49 enum ExtendedCardValue {
50 youngergen_card = CT_MR_BS_last_reserved + 1,
51 verify_card = CT_MR_BS_last_reserved + 5
52 };
53
54 public:
55 PSCardTable(MemRegion whole_heap) : CardTable(whole_heap, /* scanned_concurrently */ false) {}
56
57 static CardValue youngergen_card_val() { return youngergen_card; }
58 static CardValue verify_card_val() { return verify_card; }
59
60 // Scavenge support
61 void scavenge_contents_parallel(ObjectStartArray* start_array,
62 MutableSpace* sp,
63 HeapWord* space_top,
64 PSPromotionManager* pm,
65 uint stripe_number,
66 uint stripe_total);
67
68 bool addr_is_marked_imprecise(void *addr);
69 bool addr_is_marked_precise(void *addr);
70
71 void set_card_newgen(void* addr) { CardValue* p = byte_for(addr); *p = verify_card; }
72
73 // Testers for entries
74 static bool card_is_dirty(int value) { return value == dirty_card; }
75 static bool card_is_newgen(int value) { return value == youngergen_card; }
76 static bool card_is_clean(int value) { return value == clean_card; }
77 static bool card_is_verify(int value) { return value == verify_card; }
78
79 // Card marking
80 void inline_write_ref_field_gc(void* field, oop new_val) {
81 CardValue* byte = byte_for(field);
82 *byte = youngergen_card;
83 }
84
85 // ReduceInitialCardMarks support
86 bool is_in_young(oop obj) const;
87
88 // Adaptive size policy support
89 // Allows adjustment of the base and size of the covered regions
90 void resize_covered_region(MemRegion new_region);
91 // Finds the covered region to resize based on the start address
92 // of the covered regions.
93 void resize_covered_region_by_start(MemRegion new_region);
94 // Finds the covered region to resize based on the end address
95 // of the covered regions.
96 void resize_covered_region_by_end(int changed_region, MemRegion new_region);
97 // Finds the lowest start address of a covered region that is
98 // previous (i.e., lower index) to the covered region with index "ind".
99 HeapWord* lowest_prev_committed_start(int ind) const;
100
101#ifdef ASSERT
102 bool is_valid_card_address(CardValue* addr) {
103 return (addr >= _byte_map) && (addr < _byte_map + _byte_map_size);
104 }
105#endif // ASSERT
106
107 // Verification
108 void verify_all_young_refs_imprecise();
109 void verify_all_young_refs_precise();
110};
111
112#endif // SHARE_GC_PARALLEL_PSCARDTABLE_HPP
113