82 // Set value depending on UseCompressedOops. This could be a template class
83 // but then we have to fix all the instantiations and declarations that use this class.
84 oop _oop_head;
85 narrowOop _compressed_head;
86 size_t _len;
87 };
88
89 // Iterator for the list of discovered references.
90 class DiscoveredListIterator {
91 private:
92 DiscoveredList& _refs_list;
93 HeapWord* _prev_next;
94 oop _prev;
95 oop _ref;
96 HeapWord* _discovered_addr;
97 oop _next;
98 HeapWord* _referent_addr;
99 oop _referent;
100 OopClosure* _keep_alive;
101 BoolObjectClosure* _is_alive;
102
103 DEBUG_ONLY(
104 oop _first_seen; // cyclic linked list check
105 )
106
107 NOT_PRODUCT(
108 size_t _processed;
109 size_t _removed;
110 )
111
112 public:
113 inline DiscoveredListIterator(DiscoveredList& refs_list,
114 OopClosure* keep_alive,
115 BoolObjectClosure* is_alive):
116 _refs_list(refs_list),
117 _prev_next(refs_list.adr_head()),
118 _prev(NULL),
119 _ref(refs_list.head()),
120 #ifdef ASSERT
121 _first_seen(refs_list.head()),
122 #endif
123 #ifndef PRODUCT
124 _processed(0),
125 _removed(0),
126 #endif
127 _next(NULL),
128 _keep_alive(keep_alive),
129 _is_alive(is_alive)
130 { }
131
132 // End Of List.
133 inline bool has_next() const { return _ref != NULL; }
134
135 // Get oop to the Reference object.
136 inline oop obj() const { return _ref; }
137
138 // Get oop to the referent object.
139 inline oop referent() const { return _referent; }
140
141 // Returns true if referent is alive.
142 inline bool is_referent_alive() const {
143 return _is_alive->do_object_b(_referent);
144 }
145
146 // Loads data for the current reference.
147 // The "allow_null_referent" argument tells us to allow for the possibility
148 // of a NULL referent in the discovered Reference object. This typically
149 // happens in the case of concurrent collectors that may have done the
|
82 // Set value depending on UseCompressedOops. This could be a template class
83 // but then we have to fix all the instantiations and declarations that use this class.
84 oop _oop_head;
85 narrowOop _compressed_head;
86 size_t _len;
87 };
88
89 // Iterator for the list of discovered references.
90 class DiscoveredListIterator {
91 private:
92 DiscoveredList& _refs_list;
93 HeapWord* _prev_next;
94 oop _prev;
95 oop _ref;
96 HeapWord* _discovered_addr;
97 oop _next;
98 HeapWord* _referent_addr;
99 oop _referent;
100 OopClosure* _keep_alive;
101 BoolObjectClosure* _is_alive;
102 bool _discovered_list_needs_barrier;
103
104 DEBUG_ONLY(
105 oop _first_seen; // cyclic linked list check
106 )
107
108 NOT_PRODUCT(
109 size_t _processed;
110 size_t _removed;
111 )
112
113 public:
114 inline DiscoveredListIterator(DiscoveredList& refs_list,
115 OopClosure* keep_alive,
116 BoolObjectClosure* is_alive,
117 bool discovered_list_needs_barrier):
118 _refs_list(refs_list),
119 _prev_next(refs_list.adr_head()),
120 _prev(NULL),
121 _ref(refs_list.head()),
122 #ifdef ASSERT
123 _first_seen(refs_list.head()),
124 #endif
125 #ifndef PRODUCT
126 _processed(0),
127 _removed(0),
128 #endif
129 _next(NULL),
130 _keep_alive(keep_alive),
131 _is_alive(is_alive),
132 _discovered_list_needs_barrier(discovered_list_needs_barrier)
133 { }
134
135 // End Of List.
136 inline bool has_next() const { return _ref != NULL; }
137
138 // Get oop to the Reference object.
139 inline oop obj() const { return _ref; }
140
141 // Get oop to the referent object.
142 inline oop referent() const { return _referent; }
143
144 // Returns true if referent is alive.
145 inline bool is_referent_alive() const {
146 return _is_alive->do_object_b(_referent);
147 }
148
149 // Loads data for the current reference.
150 // The "allow_null_referent" argument tells us to allow for the possibility
151 // of a NULL referent in the discovered Reference object. This typically
152 // happens in the case of concurrent collectors that may have done the
|