< prev index next > src/hotspot/share/gc/shenandoah/shenandoahCodeRoots.cpp
Print this page
#include "gc/shenandoah/shenandoahNMethod.inline.hpp"
#include "gc/shenandoah/shenandoahUtils.hpp"
#include "memory/resourceArea.hpp"
#include "memory/universe.hpp"
#include "runtime/atomicAccess.hpp"
+ #include "utilities/events.hpp"
#include "utilities/powerOfTwo.hpp"
ShenandoahNMethodTable* ShenandoahCodeRoots::_nmethod_table;
int ShenandoahCodeRoots::_disarmed_value = 1;
assert_locked_or_safepoint(CodeCache_lock);
_nmethod_table->unregister_nmethod(nm);
}
void ShenandoahCodeRoots::arm_nmethods() {
+ char gc_state = ShenandoahHeap::heap()->gc_state();
+ Events::log(Thread::current(), "Arming nmethods, GC state: %d [%s%s%s%s%s%s%s]",
+ gc_state,
+ ((gc_state & ShenandoahHeap::HAS_FORWARDED) > 0) ? "HAS_FORWARDED " : "",
+ ((gc_state & ShenandoahHeap::MARKING) > 0) ? "MARKING " : "",
+ ((gc_state & ShenandoahHeap::EVACUATION) > 0) ? "EVACUATION " : "",
+ ((gc_state & ShenandoahHeap::UPDATE_REFS) > 0) ? "UPDATE_REFS " : "",
+ ((gc_state & ShenandoahHeap::WEAK_ROOTS) > 0) ? "WEAK_ROOTS " : "",
+ ((gc_state & ShenandoahHeap::YOUNG_MARKING) > 0) ? "YOUNG_MARKING " : "",
+ ((gc_state & ShenandoahHeap::OLD_MARKING) > 0) ? "OLD_MARKING " : ""
+ );
+ log_info(gc)("Arming nmethods with GC state: %d [%s%s%s%s%s%s%s]",
+ gc_state,
+ ((gc_state & ShenandoahHeap::HAS_FORWARDED) > 0) ? "HAS_FORWARDED " : "",
+ ((gc_state & ShenandoahHeap::MARKING) > 0) ? "MARKING " : "",
+ ((gc_state & ShenandoahHeap::EVACUATION) > 0) ? "EVACUATION " : "",
+ ((gc_state & ShenandoahHeap::UPDATE_REFS) > 0) ? "UPDATE_REFS " : "",
+ ((gc_state & ShenandoahHeap::WEAK_ROOTS) > 0) ? "WEAK_ROOTS " : "",
+ ((gc_state & ShenandoahHeap::YOUNG_MARKING) > 0) ? "YOUNG_MARKING " : "",
+ ((gc_state & ShenandoahHeap::OLD_MARKING) > 0) ? "OLD_MARKING " : ""
+ );
BarrierSet::barrier_set()->barrier_set_nmethod()->arm_all_nmethods();
}
class ShenandoahDisarmNMethodClosure : public NMethodClosure {
public:
ShenandoahConcurrentNMethodIterator _iterator;
public:
ShenandoahDisarmNMethodsTask() :
WorkerTask("Shenandoah Disarm NMethods"),
- _iterator(ShenandoahCodeRoots::table()) {
- assert(SafepointSynchronize::is_at_safepoint(), "Only at a safepoint");
- }
+ _iterator(ShenandoahCodeRoots::table()) {}
virtual void work(uint worker_id) {
- ShenandoahParallelWorkerSession worker_session(worker_id);
_iterator.nmethods_do(&_cl);
}
};
void ShenandoahCodeRoots::disarm_nmethods() {
ShenandoahDisarmNMethodsTask task;
ShenandoahHeap::heap()->workers()->run_task(&task);
}
+ #ifdef ASSERT
+ class ShenandoahCheckNMethodClosure : public NMethodClosure {
+ bool const _armed;
+ public:
+ ShenandoahCheckNMethodClosure(int armed) : _armed(armed) {}
+ virtual void do_nmethod(nmethod* nm) {
+ ShenandoahNMethod::assert_barriers(nm, _armed);
+ }
+ };
+
+ class ShenandoahCheckNMethodsTask : public WorkerTask {
+ private:
+ ShenandoahCheckNMethodClosure _cl;
+ ShenandoahConcurrentNMethodIterator _iterator;
+
+ public:
+ ShenandoahCheckNMethodsTask() :
+ WorkerTask("Shenandoah Check NMethods"),
+ _cl(!ShenandoahHeap::heap()->is_idle()),
+ _iterator(ShenandoahCodeRoots::table()) {}
+
+ virtual void work(uint worker_id) {
+ _iterator.nmethods_do(&_cl);
+ }
+ };
+
+ void ShenandoahCodeRoots::check_barriers() {
+ ShenandoahCheckNMethodsTask task;
+ ShenandoahHeap::heap()->workers()->run_task(&task);
+ }
+ #endif
+
class ShenandoahNMethodUnlinkClosure : public NMethodClosure {
private:
bool _unloading_occurred;
ShenandoahHeap* const _heap;
BarrierSetNMethod* const _bs;
< prev index next >