< prev index next >

src/hotspot/share/gc/shared/weakProcessor.cpp

Print this page
*** 34,36 ***
  #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);
      }
    }
  }
--- 34,22 ---
  #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);
      }
    }
  }

*** 118,12 ***
    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),
--- 104,10 ---

*** 144,17 ***
  
  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);
  }
--- 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);
    }
  }
  
  void WeakProcessor::GangTask::work(uint worker_id) {
    _erased_do_work(this, worker_id);
  }
< prev index next >