100 assert(region_ptr->claimed(), "must be claimed");
101 assert(region_ptr->_pushed++ == 0, "should only be pushed once");
102 #endif
103 region_stack()->push(index);
104 }
105
106 template <typename T>
107 inline void ParCompactionManager::mark_and_push(T* p) {
108 T heap_oop = RawAccess<>::oop_load(p);
109 if (!CompressedOops::is_null(heap_oop)) {
110 oop obj = CompressedOops::decode_not_null(heap_oop);
111 assert(ParallelScavengeHeap::heap()->is_in(obj), "should be in heap");
112
113 if (mark_bitmap()->is_unmarked(obj) && PSParallelCompact::mark_obj(obj)) {
114 push(obj);
115 }
116 }
117 }
118
119 inline void ParCompactionManager::follow_klass(Klass* klass) {
120 oop holder = klass->klass_holder();
121 mark_and_push(&holder);
122 }
123
124 inline void ParCompactionManager::FollowStackClosure::do_void() {
125 _compaction_manager->follow_marking_stacks();
126 }
127
128 template <typename T>
129 inline void follow_array_specialized(objArrayOop obj, int index, ParCompactionManager* cm) {
130 const size_t len = size_t(obj->length());
131 const size_t beg_index = size_t(index);
132 assert(beg_index < len || len == 0, "index too large");
133
134 const size_t stride = MIN2(len - beg_index, (size_t)ObjArrayMarkingStride);
135 const size_t end_index = beg_index + stride;
136 T* const base = (T*)obj->base_raw();
137 T* const beg = base + beg_index;
138 T* const end = base + end_index;
139
140 if (end_index < len) {
|
100 assert(region_ptr->claimed(), "must be claimed");
101 assert(region_ptr->_pushed++ == 0, "should only be pushed once");
102 #endif
103 region_stack()->push(index);
104 }
105
106 template <typename T>
107 inline void ParCompactionManager::mark_and_push(T* p) {
108 T heap_oop = RawAccess<>::oop_load(p);
109 if (!CompressedOops::is_null(heap_oop)) {
110 oop obj = CompressedOops::decode_not_null(heap_oop);
111 assert(ParallelScavengeHeap::heap()->is_in(obj), "should be in heap");
112
113 if (mark_bitmap()->is_unmarked(obj) && PSParallelCompact::mark_obj(obj)) {
114 push(obj);
115 }
116 }
117 }
118
119 inline void ParCompactionManager::follow_klass(Klass* klass) {
120 oop holder = klass->class_loader_data()->holder_no_keepalive();
121 mark_and_push(&holder);
122 }
123
124 inline void ParCompactionManager::FollowStackClosure::do_void() {
125 _compaction_manager->follow_marking_stacks();
126 }
127
128 template <typename T>
129 inline void follow_array_specialized(objArrayOop obj, int index, ParCompactionManager* cm) {
130 const size_t len = size_t(obj->length());
131 const size_t beg_index = size_t(index);
132 assert(beg_index < len || len == 0, "index too large");
133
134 const size_t stride = MIN2(len - beg_index, (size_t)ObjArrayMarkingStride);
135 const size_t end_index = beg_index + stride;
136 T* const base = (T*)obj->base_raw();
137 T* const beg = base + beg_index;
138 T* const end = base + end_index;
139
140 if (end_index < len) {
|