589 void set_target(ZPageAge age, ZPage* page) {
590 _target[static_cast<uint>(age) - 1] = page;
591 }
592
593 size_t object_alignment() const {
594 return (size_t)1 << _forwarding->object_alignment_shift();
595 }
596
597 void increase_other_forwarded(size_t unaligned_object_size) {
598 const size_t aligned_size = align_up(unaligned_object_size, object_alignment());
599 if (_forwarding->is_promotion()) {
600 _other_promoted += aligned_size;
601 } else {
602 _other_compacted += aligned_size;
603 }
604 }
605
606 zaddress try_relocate_object_inner(zaddress from_addr) {
607 ZForwardingCursor cursor;
608
609 const size_t size = ZUtils::object_size(from_addr);
610 ZPage* const to_page = target(_forwarding->to_age());
611
612 // Lookup forwarding
613 {
614 const zaddress to_addr = forwarding_find(_forwarding, from_addr, &cursor);
615 if (!is_null(to_addr)) {
616 // Already relocated
617 increase_other_forwarded(size);
618 return to_addr;
619 }
620 }
621
622 // Allocate object
623 const zaddress allocated_addr = _allocator->alloc_object(to_page, size);
624 if (is_null(allocated_addr)) {
625 // Allocation failed
626 return zaddress::null;
627 }
628
629 // Copy object. Use conjoint copying if we are relocating
630 // in-place and the new object overlaps with the old object.
631 if (_forwarding->in_place_relocation() && allocated_addr + size > from_addr) {
632 ZUtils::object_copy_conjoint(from_addr, allocated_addr, size);
633 } else {
634 ZUtils::object_copy_disjoint(from_addr, allocated_addr, size);
635 }
636
637 // Insert forwarding
638 const zaddress to_addr = forwarding_insert(_forwarding, from_addr, allocated_addr, &cursor);
639 if (to_addr != allocated_addr) {
640 // Already relocated, undo allocation
641 _allocator->undo_alloc_object(to_page, to_addr, size);
642 increase_other_forwarded(size);
|
589 void set_target(ZPageAge age, ZPage* page) {
590 _target[static_cast<uint>(age) - 1] = page;
591 }
592
593 size_t object_alignment() const {
594 return (size_t)1 << _forwarding->object_alignment_shift();
595 }
596
597 void increase_other_forwarded(size_t unaligned_object_size) {
598 const size_t aligned_size = align_up(unaligned_object_size, object_alignment());
599 if (_forwarding->is_promotion()) {
600 _other_promoted += aligned_size;
601 } else {
602 _other_compacted += aligned_size;
603 }
604 }
605
606 zaddress try_relocate_object_inner(zaddress from_addr) {
607 ZForwardingCursor cursor;
608
609 ZPage* const to_page = target(_forwarding->to_age());
610
611 // Lookup forwarding
612 {
613 const zaddress to_addr = forwarding_find(_forwarding, from_addr, &cursor);
614 if (!is_null(to_addr)) {
615 // Already relocated
616 const size_t size = ZUtils::object_size(to_addr);
617 increase_other_forwarded(size);
618 return to_addr;
619 }
620 }
621
622 // Allocate object
623 const size_t size = ZUtils::object_size(from_addr);
624 const zaddress allocated_addr = _allocator->alloc_object(to_page, size);
625 if (is_null(allocated_addr)) {
626 // Allocation failed
627 return zaddress::null;
628 }
629
630 // Copy object. Use conjoint copying if we are relocating
631 // in-place and the new object overlaps with the old object.
632 if (_forwarding->in_place_relocation() && allocated_addr + size > from_addr) {
633 ZUtils::object_copy_conjoint(from_addr, allocated_addr, size);
634 } else {
635 ZUtils::object_copy_disjoint(from_addr, allocated_addr, size);
636 }
637
638 // Insert forwarding
639 const zaddress to_addr = forwarding_insert(_forwarding, from_addr, allocated_addr, &cursor);
640 if (to_addr != allocated_addr) {
641 // Already relocated, undo allocation
642 _allocator->undo_alloc_object(to_page, to_addr, size);
643 increase_other_forwarded(size);
|