1 /* |
1 /* |
2 * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
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 |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
45 hr->set_containing_set(NULL); |
45 hr->set_containing_set(NULL); |
46 assert(_count.length() > 0, hrs_ext_msg(this, "pre-condition")); |
46 assert(_count.length() > 0, hrs_ext_msg(this, "pre-condition")); |
47 _count.decrement(1u, hr->capacity()); |
47 _count.decrement(1u, hr->capacity()); |
48 } |
48 } |
49 |
49 |
|
50 inline void FreeRegionList::add_ordered(HeapRegion* hr) { |
|
51 check_mt_safety(); |
|
52 assert((length() == 0 && _head == NULL && _tail == NULL) || |
|
53 (length() > 0 && _head != NULL && _tail != NULL), |
|
54 hrs_ext_msg(this, "invariant")); |
|
55 // add() will verify the region and check mt safety. |
|
56 add(hr); |
|
57 |
|
58 // Now link the region |
|
59 if (_head != NULL) { |
|
60 HeapRegion* curr; |
|
61 |
|
62 if (_last != NULL && _last->hrs_index() < hr->hrs_index()) { |
|
63 curr = _last; |
|
64 } else { |
|
65 curr = _head; |
|
66 } |
|
67 |
|
68 // Find first entry with a Region Index larger than entry to insert. |
|
69 while (curr != NULL && curr->hrs_index() < hr->hrs_index()) { |
|
70 curr = curr->next(); |
|
71 } |
|
72 |
|
73 hr->set_next(curr); |
|
74 |
|
75 if (curr == NULL) { |
|
76 // Adding at the end |
|
77 hr->set_prev(_tail); |
|
78 _tail->set_next(hr); |
|
79 _tail = hr; |
|
80 } else if (curr->prev() == NULL) { |
|
81 // Adding at the beginning |
|
82 hr->set_prev(NULL); |
|
83 _head = hr; |
|
84 curr->set_prev(hr); |
|
85 } else { |
|
86 hr->set_prev(curr->prev()); |
|
87 hr->prev()->set_next(hr); |
|
88 curr->set_prev(hr); |
|
89 } |
|
90 } else { |
|
91 // The list was empty |
|
92 _tail = hr; |
|
93 _head = hr; |
|
94 } |
|
95 _last = hr; |
|
96 } |
|
97 |
50 inline void FreeRegionList::add_as_head(HeapRegion* hr) { |
98 inline void FreeRegionList::add_as_head(HeapRegion* hr) { |
51 assert((length() == 0 && _head == NULL && _tail == NULL) || |
99 assert((length() == 0 && _head == NULL && _tail == NULL) || |
52 (length() > 0 && _head != NULL && _tail != NULL), |
100 (length() > 0 && _head != NULL && _tail != NULL), |
53 hrs_ext_msg(this, "invariant")); |
101 hrs_ext_msg(this, "invariant")); |
54 // add() will verify the region and check mt safety. |
102 // add() will verify the region and check mt safety. |
55 add(hr); |
103 add(hr); |
56 |
104 |
57 // Now link the region. |
105 // Now link the region. |
58 if (_head != NULL) { |
106 if (_head != NULL) { |
59 hr->set_next(_head); |
107 hr->set_next(_head); |
|
108 _head->set_prev(hr); |
60 } else { |
109 } else { |
61 _tail = hr; |
110 _tail = hr; |
62 } |
111 } |
63 _head = hr; |
112 _head = hr; |
64 } |
113 } |
66 inline void FreeRegionList::add_as_tail(HeapRegion* hr) { |
115 inline void FreeRegionList::add_as_tail(HeapRegion* hr) { |
67 check_mt_safety(); |
116 check_mt_safety(); |
68 assert((length() == 0 && _head == NULL && _tail == NULL) || |
117 assert((length() == 0 && _head == NULL && _tail == NULL) || |
69 (length() > 0 && _head != NULL && _tail != NULL), |
118 (length() > 0 && _head != NULL && _tail != NULL), |
70 hrs_ext_msg(this, "invariant")); |
119 hrs_ext_msg(this, "invariant")); |
71 // add() will verify the region and check mt safety |
120 // add() will verify the region and check mt safety. |
72 add(hr); |
121 add(hr); |
73 |
122 |
74 // Now link the region. |
123 // Now link the region. |
75 if (_tail != NULL) { |
124 if (_tail != NULL) { |
76 _tail->set_next(hr); |
125 _tail->set_next(hr); |
|
126 hr->set_prev(_tail); |
77 } else { |
127 } else { |
78 _head = hr; |
128 _head = hr; |
79 } |
129 } |
80 _tail = hr; |
130 _tail = hr; |
81 } |
131 } |
105 } else { |
161 } else { |
106 return NULL; |
162 return NULL; |
107 } |
163 } |
108 } |
164 } |
109 |
165 |
|
166 inline HeapRegion* FreeRegionList::remove_tail() { |
|
167 assert(!is_empty(), hrs_ext_msg(this, "The list should not be empty")); |
|
168 assert(length() > 0 && _head != NULL && _tail != NULL, |
|
169 hrs_ext_msg(this, "invariant")); |
|
170 |
|
171 // We need to unlink it first |
|
172 HeapRegion* hr = _tail; |
|
173 |
|
174 _tail = hr->prev(); |
|
175 if (_tail == NULL) { |
|
176 _head = NULL; |
|
177 } else { |
|
178 _tail->set_next(NULL); |
|
179 } |
|
180 hr->set_prev(NULL); |
|
181 |
|
182 if (_last == hr) { |
|
183 _last = NULL; |
|
184 } |
|
185 |
|
186 // remove() will verify the region and check mt safety. |
|
187 remove(hr); |
|
188 return hr; |
|
189 } |
|
190 |
|
191 inline HeapRegion* FreeRegionList::remove_tail_or_null() { |
|
192 check_mt_safety(); |
|
193 |
|
194 if (!is_empty()) { |
|
195 return remove_tail(); |
|
196 } else { |
|
197 return NULL; |
|
198 } |
|
199 } |
|
200 |
|
201 inline HeapRegion* FreeRegionList::remove_region(bool from_head) { |
|
202 if (from_head) { |
|
203 return remove_head_or_null(); |
|
204 } else { |
|
205 return remove_tail_or_null(); |
|
206 } |
|
207 } |
|
208 |
110 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSET_INLINE_HPP |
209 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_HEAPREGIONSET_INLINE_HPP |