diff a/src/hotspot/share/gc/shared/weakProcessor.cpp b/src/hotspot/share/gc/shared/weakProcessor.cpp --- a/src/hotspot/share/gc/shared/weakProcessor.cpp +++ b/src/hotspot/share/gc/shared/weakProcessor.cpp @@ -34,36 +34,22 @@ #include "memory/iterator.hpp" #include "prims/resolvedMethodTable.hpp" #include "runtime/globals.hpp" #include "utilities/macros.hpp" -template -class OopsDoAndReportCounts { -public: - void operator()(BoolObjectClosure* is_alive, OopClosure* keep_alive, OopStorage* storage) { - Container::reset_dead_counter(); - - CountingSkippedIsAliveClosure cl(is_alive, keep_alive); - storage->oops_do(&cl); - - Container::inc_dead_counter(cl.num_dead() + cl.num_skipped()); - Container::finish_dead_counter(); - } -}; - void WeakProcessor::weak_oops_do(BoolObjectClosure* is_alive, OopClosure* keep_alive) { WeakProcessorPhases::Iterator pit = WeakProcessorPhases::serial_iterator(); for ( ; !pit.is_end(); ++pit) { WeakProcessorPhases::processor(*pit)(is_alive, keep_alive); } OopStorageSet::Iterator it = OopStorageSet::weak_iterator(); for ( ; !it.is_end(); ++it) { - if (OopStorageSet::string_table_weak() == *it) { - OopsDoAndReportCounts()(is_alive, keep_alive, *it); - } else if (OopStorageSet::resolved_method_table_weak() == *it) { - OopsDoAndReportCounts()(is_alive, keep_alive, *it); + if (it->can_notify()) { + CountingSkippedIsAliveClosure cl(is_alive, keep_alive); + it->oops_do(&cl); + it->notify(cl.num_dead()); } else { it->weak_oops_do(is_alive, keep_alive); } } } @@ -118,12 +104,10 @@ for ( ; !it.is_end(); ++it, ++cur_state) { assert(pointer_delta(cur_state, _storage_states, sizeof(StorageState)) < storage_count, "invariant"); new (cur_state) StorageState(*it, _nworkers); } assert(pointer_delta(cur_state, _storage_states, sizeof(StorageState)) == storage_count, "invariant"); - StringTable::reset_dead_counter(); - ResolvedMethodTable::reset_dead_counter(); } WeakProcessor::Task::Task(uint nworkers) : _phase_times(NULL), _nworkers(nworkers), @@ -144,17 +128,16 @@ WeakProcessor::Task::~Task() { if (_storage_states != NULL) { StorageState* states = _storage_states; for (uint i = 0; i < WeakProcessorPhases::oopstorage_phase_count; ++i) { + states->storage()->notify(states->num_dead()); states->StorageState::~StorageState(); ++states; } FREE_C_HEAP_ARRAY(StorageState, _storage_states); } - StringTable::finish_dead_counter(); - ResolvedMethodTable::finish_dead_counter(); } void WeakProcessor::GangTask::work(uint worker_id) { _erased_do_work(this, worker_id); }