375 RefProcEnqueueTask tsk(*this, _discovered_refs, _max_num_q);
376 task_executor->execute(tsk);
377 } else {
378 // Serial code: call the parent class's implementation
379 for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) {
380 enqueue_discovered_reflist(_discovered_refs[i]);
381 _discovered_refs[i].set_head(NULL);
382 _discovered_refs[i].set_length(0);
383 }
384 }
385 }
386
387 void DiscoveredListIterator::load_ptrs(DEBUG_ONLY(bool allow_null_referent)) {
388 _discovered_addr = java_lang_ref_Reference::discovered_addr(_ref);
389 oop discovered = java_lang_ref_Reference::discovered(_ref);
390 assert(_discovered_addr && discovered->is_oop_or_null(),
391 "Expected an oop or NULL for discovered field at " PTR_FORMAT, p2i(discovered));
392 _next = discovered;
393 _referent_addr = java_lang_ref_Reference::referent_addr(_ref);
394 _referent = java_lang_ref_Reference::referent(_ref);
395 assert(Universe::heap()->is_in_reserved_or_null(_referent),
396 "Wrong oop found in java.lang.Reference object");
397 assert(allow_null_referent ?
398 _referent->is_oop_or_null()
399 : _referent->is_oop(),
400 "Expected an oop%s for referent field at " PTR_FORMAT,
401 (allow_null_referent ? " or NULL" : ""),
402 p2i(_referent));
403 }
404
405 void DiscoveredListIterator::remove() {
406 assert(_ref->is_oop(), "Dropping a bad reference");
407 oop_store_raw(_discovered_addr, NULL);
408
409 // First _prev_next ref actually points into DiscoveredList (gross).
410 oop new_next;
411 if (_next == _ref) {
412 // At the end of the list, we should make _prev point to itself.
413 // If _ref is the first ref, then _prev_next will be in the DiscoveredList,
414 // and _prev will be NULL.
415 new_next = _prev;
|
375 RefProcEnqueueTask tsk(*this, _discovered_refs, _max_num_q);
376 task_executor->execute(tsk);
377 } else {
378 // Serial code: call the parent class's implementation
379 for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) {
380 enqueue_discovered_reflist(_discovered_refs[i]);
381 _discovered_refs[i].set_head(NULL);
382 _discovered_refs[i].set_length(0);
383 }
384 }
385 }
386
387 void DiscoveredListIterator::load_ptrs(DEBUG_ONLY(bool allow_null_referent)) {
388 _discovered_addr = java_lang_ref_Reference::discovered_addr(_ref);
389 oop discovered = java_lang_ref_Reference::discovered(_ref);
390 assert(_discovered_addr && discovered->is_oop_or_null(),
391 "Expected an oop or NULL for discovered field at " PTR_FORMAT, p2i(discovered));
392 _next = discovered;
393 _referent_addr = java_lang_ref_Reference::referent_addr(_ref);
394 _referent = java_lang_ref_Reference::referent(_ref);
395 assert(GC::gc()->heap()->is_in_reserved_or_null(_referent),
396 "Wrong oop found in java.lang.Reference object");
397 assert(allow_null_referent ?
398 _referent->is_oop_or_null()
399 : _referent->is_oop(),
400 "Expected an oop%s for referent field at " PTR_FORMAT,
401 (allow_null_referent ? " or NULL" : ""),
402 p2i(_referent));
403 }
404
405 void DiscoveredListIterator::remove() {
406 assert(_ref->is_oop(), "Dropping a bad reference");
407 oop_store_raw(_discovered_addr, NULL);
408
409 // First _prev_next ref actually points into DiscoveredList (gross).
410 oop new_next;
411 if (_next == _ref) {
412 // At the end of the list, we should make _prev point to itself.
413 // If _ref is the first ref, then _prev_next will be in the DiscoveredList,
414 // and _prev will be NULL.
415 new_next = _prev;
|