34 |
34 |
35 class ar_ext_msg; |
35 class ar_ext_msg; |
36 |
36 |
37 // A class that holds a region that is active in satisfying allocation |
37 // A class that holds a region that is active in satisfying allocation |
38 // requests, potentially issued in parallel. When the active region is |
38 // requests, potentially issued in parallel. When the active region is |
39 // full it will be retired it replaced with a new one. The |
39 // full it will be retired and replaced with a new one. The |
40 // implementation assumes that fast-path allocations will be lock-free |
40 // implementation assumes that fast-path allocations will be lock-free |
41 // and a lock will need to be taken when the active region needs to be |
41 // and a lock will need to be taken when the active region needs to be |
42 // replaced. |
42 // replaced. |
43 |
43 |
44 class G1AllocRegion VALUE_OBJ_CLASS_SPEC { |
44 class G1AllocRegion VALUE_OBJ_CLASS_SPEC { |
55 // then _alloc_region is NULL and this object should not be used to |
55 // then _alloc_region is NULL and this object should not be used to |
56 // satisfy allocation requests (it was done this way to force the |
56 // satisfy allocation requests (it was done this way to force the |
57 // correct use of init() and release()). |
57 // correct use of init() and release()). |
58 HeapRegion* _alloc_region; |
58 HeapRegion* _alloc_region; |
59 |
59 |
|
60 // It keeps track of the distinct number of regions that are used |
|
61 // for allocation in the active interval of this object, i.e., |
|
62 // between a call to init() and a call to release(). The count |
|
63 // mostly includes regions that are freshly allocated, as well as |
|
64 // the region that is re-used using the set() method. This count can |
|
65 // be used in any heuristics that might want to bound how many |
|
66 // distinct regions this object can used during an active interval. |
|
67 size_t _count; |
|
68 |
60 // When we set up a new active region we save its used bytes in this |
69 // When we set up a new active region we save its used bytes in this |
61 // field so that, when we retire it, we can calculate how much space |
70 // field so that, when we retire it, we can calculate how much space |
62 // we allocated in it. |
71 // we allocated in it. |
63 size_t _used_bytes_before; |
72 size_t _used_bytes_before; |
64 |
73 |
65 // Specifies whether the allocate calls will do BOT updates or not. |
74 // When true, indicates that allocate calls should do BOT updates. |
66 bool _bot_updates; |
75 const bool _bot_updates; |
67 |
76 |
68 // Useful for debugging and tracing. |
77 // Useful for debugging and tracing. |
69 const char* _name; |
78 const char* _name; |
70 |
79 |
71 // A dummy region (i.e., it's been allocated specially for this |
80 // A dummy region (i.e., it's been allocated specially for this |
125 HeapRegion* get() const { |
134 HeapRegion* get() const { |
126 // Make sure that the dummy region does not escape this class. |
135 // Make sure that the dummy region does not escape this class. |
127 return (_alloc_region == _dummy_region) ? NULL : _alloc_region; |
136 return (_alloc_region == _dummy_region) ? NULL : _alloc_region; |
128 } |
137 } |
129 |
138 |
|
139 size_t count() { return _count; } |
|
140 |
130 // The following two are the building blocks for the allocation method. |
141 // The following two are the building blocks for the allocation method. |
131 |
142 |
132 // First-level allocation: Should be called without holding a |
143 // First-level allocation: Should be called without holding a |
133 // lock. It will try to allocate lock-free out of the active region, |
144 // lock. It will try to allocate lock-free out of the active region, |
134 // or return NULL if it was unable to. |
145 // or return NULL if it was unable to. |
151 bool bot_updates); |
162 bool bot_updates); |
152 |
163 |
153 // Should be called before we start using this object. |
164 // Should be called before we start using this object. |
154 void init(); |
165 void init(); |
155 |
166 |
|
167 // This can be used to set the active region to a specific |
|
168 // region. (Use Example: we try to retain the last old GC alloc |
|
169 // region that we've used during a GC and we can use set() to |
|
170 // re-instate it at the beginning of the next GC.) |
|
171 void set(HeapRegion* alloc_region); |
|
172 |
156 // Should be called when we want to release the active region which |
173 // Should be called when we want to release the active region which |
157 // is returned after it's been retired. |
174 // is returned after it's been retired. |
158 HeapRegion* release(); |
175 HeapRegion* release(); |
159 |
176 |
160 #if G1_ALLOC_REGION_TRACING |
177 #if G1_ALLOC_REGION_TRACING |