573 return mark()->is_marked();
574 }
575
576 bool oopDesc::is_scavengable() const {
577 return Universe::heap()->is_scavengable(this);
578 }
579
580 // Used by scavengers
581 bool oopDesc::is_forwarded() const {
582 // The extra heap check is needed since the obj might be locked, in which case the
583 // mark would point to a stack location and have the sentinel bit cleared
584 return mark()->is_marked();
585 }
586
587 // Used by scavengers
588 void oopDesc::forward_to(oop p) {
589 assert(check_obj_alignment(p),
590 "forwarding to something not aligned");
591 assert(Universe::heap()->is_in_reserved(p),
592 "forwarding to something not in heap");
593 markOop m = markOopDesc::encode_pointer_as_mark(p);
594 assert(m->decode_pointer() == p, "encoding must be reversable");
595 set_mark(m);
596 }
597
598 // Used by parallel scavengers
599 bool oopDesc::cas_forward_to(oop p, markOop compare) {
600 assert(check_obj_alignment(p),
601 "forwarding to something not aligned");
602 assert(Universe::heap()->is_in_reserved(p),
603 "forwarding to something not in heap");
604 markOop m = markOopDesc::encode_pointer_as_mark(p);
605 assert(m->decode_pointer() == p, "encoding must be reversable");
606 return cas_set_mark(m, compare) == compare;
607 }
608
609 #if INCLUDE_ALL_GCS
610 oop oopDesc::forward_to_atomic(oop p) {
611 markOop oldMark = mark();
612 markOop forwardPtrMark = markOopDesc::encode_pointer_as_mark(p);
|
573 return mark()->is_marked();
574 }
575
576 bool oopDesc::is_scavengable() const {
577 return Universe::heap()->is_scavengable(this);
578 }
579
580 // Used by scavengers
581 bool oopDesc::is_forwarded() const {
582 // The extra heap check is needed since the obj might be locked, in which case the
583 // mark would point to a stack location and have the sentinel bit cleared
584 return mark()->is_marked();
585 }
586
587 // Used by scavengers
588 void oopDesc::forward_to(oop p) {
589 assert(check_obj_alignment(p),
590 "forwarding to something not aligned");
591 assert(Universe::heap()->is_in_reserved(p),
592 "forwarding to something not in heap");
593 assert(!is_archive_object(oop(this)) &&
594 !is_archive_object(p),
595 "forwarding archive object");
596 markOop m = markOopDesc::encode_pointer_as_mark(p);
597 assert(m->decode_pointer() == p, "encoding must be reversable");
598 set_mark(m);
599 }
600
601 // Used by parallel scavengers
602 bool oopDesc::cas_forward_to(oop p, markOop compare) {
603 assert(check_obj_alignment(p),
604 "forwarding to something not aligned");
605 assert(Universe::heap()->is_in_reserved(p),
606 "forwarding to something not in heap");
607 markOop m = markOopDesc::encode_pointer_as_mark(p);
608 assert(m->decode_pointer() == p, "encoding must be reversable");
609 return cas_set_mark(m, compare) == compare;
610 }
611
612 #if INCLUDE_ALL_GCS
613 oop oopDesc::forward_to_atomic(oop p) {
614 markOop oldMark = mark();
615 markOop forwardPtrMark = markOopDesc::encode_pointer_as_mark(p);
|