< prev index next > src/hotspot/share/gc/shared/weakProcessor.cpp
Print this page
#include "memory/iterator.hpp"
#include "prims/resolvedMethodTable.hpp"
#include "runtime/globals.hpp"
#include "utilities/macros.hpp"
- template <typename Container>
- class OopsDoAndReportCounts {
- public:
- void operator()(BoolObjectClosure* is_alive, OopClosure* keep_alive, OopStorage* storage) {
- Container::reset_dead_counter();
-
- CountingSkippedIsAliveClosure<BoolObjectClosure, OopClosure> 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<StringTable>()(is_alive, keep_alive, *it);
! } else if (OopStorageSet::resolved_method_table_weak() == *it) {
! OopsDoAndReportCounts<ResolvedMethodTable>()(is_alive, keep_alive, *it);
} else {
it->weak_oops_do(is_alive, keep_alive);
}
}
}
#include "memory/iterator.hpp"
#include "prims/resolvedMethodTable.hpp"
#include "runtime/globals.hpp"
#include "utilities/macros.hpp"
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 (it->can_notify()) {
! CountingSkippedIsAliveClosure<BoolObjectClosure, OopClosure> cl(is_alive, keep_alive);
! it->oops_do(&cl);
! it->notify(cl.num_dead());
} else {
it->weak_oops_do(is_alive, keep_alive);
}
}
}
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),
WeakProcessor::Task::~Task() {
if (_storage_states != NULL) {
StorageState* states = _storage_states;
for (uint i = 0; i < WeakProcessorPhases::oopstorage_phase_count; ++i) {
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);
}
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);
}
}
void WeakProcessor::GangTask::work(uint worker_id) {
_erased_do_work(this, worker_id);
}
< prev index next >