< prev index next >
src/share/vm/gc/shenandoah/shenandoahConcurrentMark.cpp
Print this page
rev 12724 : Assert code roots are to-space ptrs when scanning/updating other roots.
*** 40,49 ****
--- 40,66 ----
#include "classfile/systemDictionary.hpp"
#include "memory/iterator.inline.hpp"
#include "oops/oop.inline.hpp"
#include "gc/shared/taskqueue.inline.hpp"
+ #ifdef ASSERT
+ class AssertToSpaceClosure : public OopClosure {
+ private:
+ template <class T>
+ inline void do_oop_nv(T* p) {
+ T o = oopDesc::load_heap_oop(p);
+ if (! oopDesc::is_null(o)) {
+ oop obj = oopDesc::decode_heap_oop_not_null(o);
+ assert(oopDesc::unsafe_equals(obj, ShenandoahBarrierSet::resolve_oop_static_not_null(obj)), "need to-space object here");
+ }
+ }
+ public:
+ void do_oop(narrowOop* p) { do_oop_nv(p); }
+ void do_oop(oop* p) { do_oop_nv(p); }
+ };
+ #endif
+
class ShenandoahInitMarkRootsClosure : public OopClosure {
private:
SCMObjToScanQueue* _queue;
ShenandoahHeap* _heap;
*** 133,143 ****
ResourceMark m;
if (heap->concurrentMark()->unload_classes()) {
_rp->process_strong_roots(&mark_cl, _process_refs ? NULL : &mark_cl, &cldCl, &blobsCl, worker_id);
} else {
! _rp->process_all_roots(&mark_cl, _process_refs ? NULL : &mark_cl, &cldCl, ShenandoahConcurrentCodeRoots ? NULL : &blobsCl, worker_id);
}
}
};
class ShenandoahUpdateRootsTask : public AbstractGangTask {
--- 150,173 ----
ResourceMark m;
if (heap->concurrentMark()->unload_classes()) {
_rp->process_strong_roots(&mark_cl, _process_refs ? NULL : &mark_cl, &cldCl, &blobsCl, worker_id);
} else {
! if (ShenandoahConcurrentCodeRoots) {
! CodeBlobClosure* code_blobs;
! #ifdef ASSERT
! AssertToSpaceClosure assert_to_space_oops;
! CodeBlobToOopClosure assert_to_space(&assert_to_space_oops,
! !CodeBlobToOopClosure::FixRelocations);
! code_blobs = &assert_to_space;
! #else
! code_blobs = NULL;
! #endif
! _rp->process_all_roots(&mark_cl, _process_refs ? NULL : &mark_cl, &cldCl, code_blobs, worker_id);
! } else {
! _rp->process_all_roots(&mark_cl, _process_refs ? NULL : &mark_cl, &cldCl, &blobsCl, worker_id);
! }
}
}
};
class ShenandoahUpdateRootsTask : public AbstractGangTask {
*** 154,164 ****
ShenandoahHeap* heap = ShenandoahHeap::heap();
SCMUpdateRefsClosure cl;
CLDToOopClosure cldCl(&cl);
! _rp->process_all_roots(&cl, &cl, &cldCl, NULL, worker_id);
}
};
class SCMConcurrentMarkingTask : public AbstractGangTask {
private:
--- 184,202 ----
ShenandoahHeap* heap = ShenandoahHeap::heap();
SCMUpdateRefsClosure cl;
CLDToOopClosure cldCl(&cl);
! CodeBlobClosure* code_blobs;
! #ifdef ASSERT
! AssertToSpaceClosure assert_to_space_oops;
! CodeBlobToOopClosure assert_to_space(&assert_to_space_oops, !CodeBlobToOopClosure::FixRelocations);
! code_blobs = &assert_to_space;
! #else
! code_blobs = NULL;
! #endif
! _rp->process_all_roots(&cl, &cl, &cldCl, code_blobs, worker_id);
}
};
class SCMConcurrentMarkingTask : public AbstractGangTask {
private:
< prev index next >