Mercurial > hg > truffle
comparison src/share/vm/gc_implementation/g1/heapRegionType.hpp @ 20481:c02ec279b062
8057768: Make heap region region type in G1 HeapRegion explicit
Reviewed-by: brutisso, tschatzl
author | brutisso |
---|---|
date | Tue, 16 Sep 2014 14:27:40 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
20478:00448aa81791 | 20481:c02ec279b062 |
---|---|
1 /* | |
2 * Copyright (c) 2014, 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_VM_GC_IMPLEMENTATION_G1_HEAPREGIONTYPE_HPP | |
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONTYPE_HPP | |
27 | |
28 #include "memory/allocation.hpp" | |
29 | |
30 #define hrt_assert_is_valid(tag) \ | |
31 assert(is_valid((tag)), err_msg("invalid HR type: %u", (uint) (tag))) | |
32 | |
33 class HeapRegionType VALUE_OBJ_CLASS_SPEC { | |
34 private: | |
35 // We encode the value of the heap region type so the generation can be | |
36 // determined quickly. The tag is split into two parts: | |
37 // | |
38 // major type (young, humongous) : top N-1 bits | |
39 // minor type (eden / survivor, starts / cont hum, etc.) : bottom 1 bit | |
40 // | |
41 // If there's need to increase the number of minor types in the | |
42 // future, we'll have to increase the size of the latter and hence | |
43 // decrease the size of the former. | |
44 // | |
45 // 0000 0 [ 0] Free | |
46 // | |
47 // 0001 0 Young Mask | |
48 // 0001 0 [ 2] Eden | |
49 // 0001 1 [ 3] Survivor | |
50 // | |
51 // 0010 0 Humongous Mask | |
52 // 0010 0 [ 4] Humongous Starts | |
53 // 0010 1 [ 5] Humongous Continues | |
54 // | |
55 // 01000 [ 8] Old | |
56 typedef enum { | |
57 FreeTag = 0, | |
58 | |
59 YoungMask = 2, | |
60 EdenTag = YoungMask, | |
61 SurvTag = YoungMask + 1, | |
62 | |
63 HumMask = 4, | |
64 HumStartsTag = HumMask, | |
65 HumContTag = HumMask + 1, | |
66 | |
67 OldTag = 8 | |
68 } Tag; | |
69 | |
70 volatile Tag _tag; | |
71 | |
72 static bool is_valid(Tag tag); | |
73 | |
74 Tag get() const { | |
75 hrt_assert_is_valid(_tag); | |
76 return _tag; | |
77 } | |
78 | |
79 // Sets the type to 'tag'. | |
80 void set(Tag tag) { | |
81 hrt_assert_is_valid(tag); | |
82 hrt_assert_is_valid(_tag); | |
83 _tag = tag; | |
84 } | |
85 | |
86 // Sets the type to 'tag', expecting the type to be 'before'. This | |
87 // is available for when we want to add sanity checking to the type | |
88 // transition. | |
89 void set_from(Tag tag, Tag before) { | |
90 hrt_assert_is_valid(tag); | |
91 hrt_assert_is_valid(before); | |
92 hrt_assert_is_valid(_tag); | |
93 assert(_tag == before, | |
94 err_msg("HR tag: %u, expected: %u new tag; %u", _tag, before, tag)); | |
95 _tag = tag; | |
96 } | |
97 | |
98 public: | |
99 // Queries | |
100 | |
101 bool is_free() const { return get() == FreeTag; } | |
102 | |
103 bool is_young() const { return (get() & YoungMask) != 0; } | |
104 bool is_eden() const { return get() == EdenTag; } | |
105 bool is_survivor() const { return get() == SurvTag; } | |
106 | |
107 bool is_humongous() const { return (get() & HumMask) != 0; } | |
108 bool is_starts_humongous() const { return get() == HumStartsTag; } | |
109 bool is_continues_humongous() const { return get() == HumContTag; } | |
110 | |
111 bool is_old() const { return get() == OldTag; } | |
112 | |
113 // Setters | |
114 | |
115 void set_free() { set(FreeTag); } | |
116 | |
117 void set_eden() { set_from(EdenTag, FreeTag); } | |
118 void set_eden_pre_gc() { set_from(EdenTag, SurvTag); } | |
119 void set_survivor() { set_from(SurvTag, FreeTag); } | |
120 | |
121 void set_starts_humongous() { set_from(HumStartsTag, FreeTag); } | |
122 void set_continues_humongous() { set_from(HumContTag, FreeTag); } | |
123 | |
124 void set_old() { set(OldTag); } | |
125 | |
126 // Misc | |
127 | |
128 const char* get_str() const; | |
129 const char* get_short_str() const; | |
130 | |
131 HeapRegionType() : _tag(FreeTag) { hrt_assert_is_valid(_tag); } | |
132 }; | |
133 | |
134 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONTYPE_HPP |