208 assert(is_object_aligned((intptr_t)obj) && is_object_aligned((intptr_t)new_top),
209 "checking alignment");
210 return obj;
211 } else {
212 return NULL;
213 }
214 } while (true);
215 }
216
217 // Try to deallocate previous allocation. Returns true upon success.
218 bool MutableSpace::cas_deallocate(HeapWord *obj, size_t size) {
219 HeapWord* expected_top = obj + size;
220 return (HeapWord*)Atomic::cmpxchg_ptr(obj, top_addr(), expected_top) == expected_top;
221 }
222
223 void MutableSpace::oop_iterate(ExtendedOopClosure* cl) {
224 HeapWord* obj_addr = bottom();
225 HeapWord* t = top();
226 // Could call objects iterate, but this is easier.
227 while (obj_addr < t) {
228 obj_addr += oop(obj_addr)->oop_iterate(cl);
229 }
230 }
231
232 void MutableSpace::oop_iterate_no_header(OopClosure* cl) {
233 HeapWord* obj_addr = bottom();
234 HeapWord* t = top();
235 // Could call objects iterate, but this is easier.
236 while (obj_addr < t) {
237 obj_addr += oop(obj_addr)->oop_iterate_no_header(cl);
238 }
239 }
240
241 void MutableSpace::object_iterate(ObjectClosure* cl) {
242 HeapWord* p = bottom();
243 while (p < top()) {
244 cl->do_object(oop(p));
245 p += oop(p)->size();
246 }
247 }
248
|
208 assert(is_object_aligned((intptr_t)obj) && is_object_aligned((intptr_t)new_top),
209 "checking alignment");
210 return obj;
211 } else {
212 return NULL;
213 }
214 } while (true);
215 }
216
217 // Try to deallocate previous allocation. Returns true upon success.
218 bool MutableSpace::cas_deallocate(HeapWord *obj, size_t size) {
219 HeapWord* expected_top = obj + size;
220 return (HeapWord*)Atomic::cmpxchg_ptr(obj, top_addr(), expected_top) == expected_top;
221 }
222
223 void MutableSpace::oop_iterate(ExtendedOopClosure* cl) {
224 HeapWord* obj_addr = bottom();
225 HeapWord* t = top();
226 // Could call objects iterate, but this is easier.
227 while (obj_addr < t) {
228 obj_addr += oop(obj_addr)->oop_iterate<false>(cl);
229 }
230 }
231
232 void MutableSpace::oop_iterate_no_header(OopClosure* cl) {
233 HeapWord* obj_addr = bottom();
234 HeapWord* t = top();
235 // Could call objects iterate, but this is easier.
236 while (obj_addr < t) {
237 obj_addr += oop(obj_addr)->oop_iterate_no_header(cl);
238 }
239 }
240
241 void MutableSpace::object_iterate(ObjectClosure* cl) {
242 HeapWord* p = bottom();
243 while (p < top()) {
244 cl->do_object(oop(p));
245 p += oop(p)->size();
246 }
247 }
248
|