--- a/hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.inline.hpp Fri Jul 10 16:01:20 2009 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1OopClosures.inline.hpp Tue Jul 14 15:40:39 2009 -0700
@@ -31,9 +31,10 @@
// perf-critical inner loop.
#define FILTERINTOCSCLOSURE_DOHISTOGRAMCOUNT 0
-inline void FilterIntoCSClosure::do_oop_nv(oop* p) {
- oop obj = *p;
- if (obj != NULL && _g1->obj_in_cs(obj)) {
+template <class T> inline void FilterIntoCSClosure::do_oop_nv(T* p) {
+ T heap_oop = oopDesc::load_heap_oop(p);
+ if (!oopDesc::is_null(heap_oop) &&
+ _g1->obj_in_cs(oopDesc::decode_heap_oop_not_null(heap_oop))) {
_oc->do_oop(p);
#if FILTERINTOCSCLOSURE_DOHISTOGRAMCOUNT
_dcto_cl->incr_count();
@@ -41,44 +42,32 @@
}
}
-inline void FilterIntoCSClosure::do_oop(oop* p)
-{
- do_oop_nv(p);
-}
-
#define FILTEROUTOFREGIONCLOSURE_DOHISTOGRAMCOUNT 0
-inline void FilterOutOfRegionClosure::do_oop_nv(oop* p) {
- oop obj = *p;
- HeapWord* obj_hw = (HeapWord*)obj;
- if (obj_hw != NULL && (obj_hw < _r_bottom || obj_hw >= _r_end)) {
- _oc->do_oop(p);
+template <class T> inline void FilterOutOfRegionClosure::do_oop_nv(T* p) {
+ T heap_oop = oopDesc::load_heap_oop(p);
+ if (!oopDesc::is_null(heap_oop)) {
+ HeapWord* obj_hw = (HeapWord*)oopDesc::decode_heap_oop_not_null(heap_oop);
+ if (obj_hw < _r_bottom || obj_hw >= _r_end) {
+ _oc->do_oop(p);
#if FILTEROUTOFREGIONCLOSURE_DOHISTOGRAMCOUNT
- _out_of_region++;
+ _out_of_region++;
#endif
+ }
}
}
-inline void FilterOutOfRegionClosure::do_oop(oop* p)
-{
- do_oop_nv(p);
-}
-
-inline void FilterInHeapRegionAndIntoCSClosure::do_oop_nv(oop* p) {
- oop obj = *p;
- if (obj != NULL && _g1->obj_in_cs(obj))
+template <class T> inline void FilterInHeapRegionAndIntoCSClosure::do_oop_nv(T* p) {
+ T heap_oop = oopDesc::load_heap_oop(p);
+ if (!oopDesc::is_null(heap_oop) &&
+ _g1->obj_in_cs(oopDesc::decode_heap_oop_not_null(heap_oop)))
_oc->do_oop(p);
}
-inline void FilterInHeapRegionAndIntoCSClosure::do_oop(oop* p)
-{
- do_oop_nv(p);
-}
-
-
-inline void FilterAndMarkInHeapRegionAndIntoCSClosure::do_oop_nv(oop* p) {
- oop obj = *p;
- if (obj != NULL) {
+template <class T> inline void FilterAndMarkInHeapRegionAndIntoCSClosure::do_oop_nv(T* p) {
+ T heap_oop = oopDesc::load_heap_oop(p);
+ if (!oopDesc::is_null(heap_oop)) {
+ oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
HeapRegion* hr = _g1->heap_region_containing((HeapWord*) obj);
if (hr != NULL) {
if (hr->in_collection_set())
@@ -89,24 +78,29 @@
}
}
-inline void FilterAndMarkInHeapRegionAndIntoCSClosure::do_oop(oop* p)
-{
- do_oop_nv(p);
-}
+// This closure is applied to the fields of the objects that have just been copied.
+template <class T> inline void G1ParScanClosure::do_oop_nv(T* p) {
+ T heap_oop = oopDesc::load_heap_oop(p);
-inline void G1ScanAndBalanceClosure::do_oop_nv(oop* p) {
- RefToScanQueue* q;
- if (ParallelGCThreads > 0) {
- // Deal the work out equally.
- _nq = (_nq + 1) % ParallelGCThreads;
- q = _g1->task_queue(_nq);
- } else {
- q = _g1->task_queue(0);
+ if (!oopDesc::is_null(heap_oop)) {
+ oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
+ if (_g1->in_cset_fast_test(obj)) {
+ // We're not going to even bother checking whether the object is
+ // already forwarded or not, as this usually causes an immediate
+ // stall. We'll try to prefetch the object (for write, given that
+ // we might need to install the forwarding reference) and we'll
+ // get back to it when pop it from the queue
+ Prefetch::write(obj->mark_addr(), 0);
+ Prefetch::read(obj->mark_addr(), (HeapWordSize*2));
+
+ // slightly paranoid test; I'm trying to catch potential
+ // problems before we go into push_on_queue to know where the
+ // problem is coming from
+ assert(obj == oopDesc::load_decode_heap_oop(p),
+ "p should still be pointing to obj");
+ _par_scan_state->push_on_queue(p);
+ } else {
+ _par_scan_state->update_rs(_from, p, _par_scan_state->queue_num());
+ }
}
- bool nooverflow = q->push(p);
- guarantee(nooverflow, "Overflow during poplularity region processing");
}
-
-inline void G1ScanAndBalanceClosure::do_oop(oop* p) {
- do_oop_nv(p);
-}