404 pending_list_addr, _max_num_q);
405 task_executor->execute(tsk);
406 } else {
407 // Serial code: call the parent class's implementation
408 for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) {
409 enqueue_discovered_reflist(_discovered_refs[i], pending_list_addr);
410 _discovered_refs[i].set_head(NULL);
411 _discovered_refs[i].set_length(0);
412 }
413 }
414 }
415
416 void DiscoveredListIterator::load_ptrs(DEBUG_ONLY(bool allow_null_referent)) {
417 _discovered_addr = java_lang_ref_Reference::discovered_addr(_ref);
418 oop discovered = java_lang_ref_Reference::discovered(_ref);
419 assert(_discovered_addr && discovered->is_oop_or_null(),
420 "Expected an oop or NULL for discovered field at " PTR_FORMAT, p2i(discovered));
421 _next = discovered;
422 _referent_addr = java_lang_ref_Reference::referent_addr(_ref);
423 _referent = java_lang_ref_Reference::referent(_ref);
424 assert(Universe::heap()->is_in_reserved_or_null(_referent),
425 "Wrong oop found in java.lang.Reference object");
426 assert(allow_null_referent ?
427 _referent->is_oop_or_null()
428 : _referent->is_oop(),
429 "Expected an oop%s for referent field at " PTR_FORMAT,
430 (allow_null_referent ? " or NULL" : ""),
431 p2i(_referent));
432 }
433
434 void DiscoveredListIterator::remove() {
435 assert(_ref->is_oop(), "Dropping a bad reference");
436 oop_store_raw(_discovered_addr, NULL);
437
438 // First _prev_next ref actually points into DiscoveredList (gross).
439 oop new_next;
440 if (_next == _ref) {
441 // At the end of the list, we should make _prev point to itself.
442 // If _ref is the first ref, then _prev_next will be in the DiscoveredList,
443 // and _prev will be NULL.
444 new_next = _prev;
|
404 pending_list_addr, _max_num_q);
405 task_executor->execute(tsk);
406 } else {
407 // Serial code: call the parent class's implementation
408 for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) {
409 enqueue_discovered_reflist(_discovered_refs[i], pending_list_addr);
410 _discovered_refs[i].set_head(NULL);
411 _discovered_refs[i].set_length(0);
412 }
413 }
414 }
415
416 void DiscoveredListIterator::load_ptrs(DEBUG_ONLY(bool allow_null_referent)) {
417 _discovered_addr = java_lang_ref_Reference::discovered_addr(_ref);
418 oop discovered = java_lang_ref_Reference::discovered(_ref);
419 assert(_discovered_addr && discovered->is_oop_or_null(),
420 "Expected an oop or NULL for discovered field at " PTR_FORMAT, p2i(discovered));
421 _next = discovered;
422 _referent_addr = java_lang_ref_Reference::referent_addr(_ref);
423 _referent = java_lang_ref_Reference::referent(_ref);
424 assert(GC::gc()->heap()->is_in_reserved_or_null(_referent),
425 "Wrong oop found in java.lang.Reference object");
426 assert(allow_null_referent ?
427 _referent->is_oop_or_null()
428 : _referent->is_oop(),
429 "Expected an oop%s for referent field at " PTR_FORMAT,
430 (allow_null_referent ? " or NULL" : ""),
431 p2i(_referent));
432 }
433
434 void DiscoveredListIterator::remove() {
435 assert(_ref->is_oop(), "Dropping a bad reference");
436 oop_store_raw(_discovered_addr, NULL);
437
438 // First _prev_next ref actually points into DiscoveredList (gross).
439 oop new_next;
440 if (_next == _ref) {
441 // At the end of the list, we should make _prev point to itself.
442 // If _ref is the first ref, then _prev_next will be in the DiscoveredList,
443 // and _prev will be NULL.
444 new_next = _prev;
|