--- old/hotspot/src/share/vm/memory/genOopClosures.inline.hpp 2009-08-01 04:12:14.131808656 +0100 +++ new/hotspot/src/share/vm/memory/genOopClosures.inline.hpp 2009-08-01 04:12:14.047835227 +0100 @@ -2,7 +2,7 @@ #pragma ident "@(#)genOopClosures.inline.hpp 1.40 07/05/29 09:44:15 JVM" #endif /* - * Copyright 2001-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,29 +41,38 @@ } } -inline void OopsInGenClosure::do_barrier(oop* p) { +template inline void OopsInGenClosure::do_barrier(T* p) { assert(generation()->is_in_reserved(p), "expected ref in generation"); - oop obj = *p; - assert(obj != NULL, "expected non-null object"); + assert(!oopDesc::is_null(*p), "expected non-null object"); + oop obj = oopDesc::load_decode_heap_oop_not_null(p); // If p points to a younger generation, mark the card. if ((HeapWord*)obj < _gen_boundary) { _rs->inline_write_ref_field_gc(p, obj); } } -// NOTE! Any changes made here should also be made -// in FastScanClosure::do_oop(); -inline void ScanClosure::do_oop(oop* p) { +inline void OopsInGenClosure::par_do_barrier(oop* p) { + assert(generation()->is_in_reserved(p), "expected ref in generation"); oop obj = *p; + assert(obj != NULL, "expected non-null object"); + // If p points to a younger generation, mark the card. + if ((HeapWord*)obj < gen_boundary()) { + rs()->write_ref_field_gc_par(p, obj); + } +} + +// NOTE! Any changes made here should also be made +// in FastScanClosure::do_oop_work() +template inline void ScanClosure::do_oop_work(T* p) { + T heap_oop = oopDesc::load_heap_oop(p); // Should we copy the obj? - if (obj != NULL) { + if (!oopDesc::is_null(heap_oop)) { + oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); if ((HeapWord*)obj < _boundary) { assert(!_g->to()->is_in_reserved(obj), "Scanning field twice?"); - if (obj->is_forwarded()) { - *p = obj->forwardee(); - } else { - *p = _g->copy_to_survivor_space(obj, p); - } + oop new_obj = obj->is_forwarded() ? obj->forwardee() + : _g->copy_to_survivor_space(obj); + oopDesc::encode_store_heap_oop_not_null(p, new_obj); } if (_gc_barrier) { // Now call parent closure @@ -72,23 +81,21 @@ } } -inline void ScanClosure::do_oop_nv(oop* p) { - ScanClosure::do_oop(p); -} +inline void ScanClosure::do_oop_nv(oop* p) { ScanClosure::do_oop_work(p); } +inline void ScanClosure::do_oop_nv(narrowOop* p) { ScanClosure::do_oop_work(p); } // NOTE! Any changes made here should also be made -// in ScanClosure::do_oop(); -inline void FastScanClosure::do_oop(oop* p) { - oop obj = *p; +// in ScanClosure::do_oop_work() +template inline void FastScanClosure::do_oop_work(T* p) { + T heap_oop = oopDesc::load_heap_oop(p); // Should we copy the obj? - if (obj != NULL) { + if (!oopDesc::is_null(heap_oop)) { + oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); if ((HeapWord*)obj < _boundary) { assert(!_g->to()->is_in_reserved(obj), "Scanning field twice?"); - if (obj->is_forwarded()) { - *p = obj->forwardee(); - } else { - *p = _g->copy_to_survivor_space(obj, p); - } + oop new_obj = obj->is_forwarded() ? obj->forwardee() + : _g->copy_to_survivor_space(obj); + oopDesc::encode_store_heap_oop_not_null(p, new_obj); if (_gc_barrier) { // Now call parent closure do_barrier(p); @@ -97,26 +104,22 @@ } } -inline void FastScanClosure::do_oop_nv(oop* p) { - FastScanClosure::do_oop(p); -} +inline void FastScanClosure::do_oop_nv(oop* p) { FastScanClosure::do_oop_work(p); } +inline void FastScanClosure::do_oop_nv(narrowOop* p) { FastScanClosure::do_oop_work(p); } // Note similarity to ScanClosure; the difference is that // the barrier set is taken care of outside this closure. -inline void ScanWeakRefClosure::do_oop(oop* p) { - oop obj = *p; - assert (obj != NULL, "null weak reference?"); +template inline void ScanWeakRefClosure::do_oop_work(T* p) { + assert(!oopDesc::is_null(*p), "null weak reference?"); + oop obj = oopDesc::load_decode_heap_oop_not_null(p); // weak references are sometimes scanned twice; must check // that to-space doesn't already contain this object if ((HeapWord*)obj < _boundary && !_g->to()->is_in_reserved(obj)) { - if (obj->is_forwarded()) { - *p = obj->forwardee(); - } else { - *p = _g->copy_to_survivor_space(obj, p); - } + oop new_obj = obj->is_forwarded() ? obj->forwardee() + : _g->copy_to_survivor_space(obj); + oopDesc::encode_store_heap_oop_not_null(p, new_obj); } } -inline void ScanWeakRefClosure::do_oop_nv(oop* p) { - ScanWeakRefClosure::do_oop(p); -} +inline void ScanWeakRefClosure::do_oop_nv(oop* p) { ScanWeakRefClosure::do_oop_work(p); } +inline void ScanWeakRefClosure::do_oop_nv(narrowOop* p) { ScanWeakRefClosure::do_oop_work(p); }