< 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,10 +40,27 @@
#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,11 +150,24 @@
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);
+ 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,11 +184,19 @@
ShenandoahHeap* heap = ShenandoahHeap::heap();
SCMUpdateRefsClosure cl;
CLDToOopClosure cldCl(&cl);
- _rp->process_all_roots(&cl, &cl, &cldCl, NULL, worker_id);
+ 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 >