hotspot/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.cpp
Print this page
rev 611 : Merge
*** 1,10 ****
#ifdef USE_PRAGMA_IDENT_SRC
#pragma ident "@(#)cardTableExtension.cpp 1.35 07/09/25 16:47:41 JVM"
#endif
/*
! * Copyright 2001-2006 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
--- 1,10 ----
#ifdef USE_PRAGMA_IDENT_SRC
#pragma ident "@(#)cardTableExtension.cpp 1.35 07/09/25 16:47:41 JVM"
#endif
/*
! * 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*** 29,66 ****
# include "incls/_cardTableExtension.cpp.incl"
// Checks an individual oop for missing precise marks. Mark
// may be either dirty or newgen.
class CheckForUnmarkedOops : public OopClosure {
PSYoungGen* _young_gen;
CardTableExtension* _card_table;
HeapWord* _unmarked_addr;
jbyte* _unmarked_card;
! public:
! CheckForUnmarkedOops( PSYoungGen* young_gen, CardTableExtension* card_table ) :
! _young_gen(young_gen), _card_table(card_table), _unmarked_addr(NULL) { }
!
! virtual void do_oop(oop* p) {
! if (_young_gen->is_in_reserved(*p) &&
!_card_table->addr_is_marked_imprecise(p)) {
// Don't overwrite the first missing card mark
if (_unmarked_addr == NULL) {
_unmarked_addr = (HeapWord*)p;
_unmarked_card = _card_table->byte_for(p);
}
}
}
bool has_unmarked_oop() {
return _unmarked_addr != NULL;
}
};
// Checks all objects for the existance of some type of mark,
// precise or imprecise, dirty or newgen.
class CheckForUnmarkedObjects : public ObjectClosure {
PSYoungGen* _young_gen;
CardTableExtension* _card_table;
public:
CheckForUnmarkedObjects() {
--- 29,73 ----
# include "incls/_cardTableExtension.cpp.incl"
// Checks an individual oop for missing precise marks. Mark
// may be either dirty or newgen.
class CheckForUnmarkedOops : public OopClosure {
+ private:
PSYoungGen* _young_gen;
CardTableExtension* _card_table;
HeapWord* _unmarked_addr;
jbyte* _unmarked_card;
! protected:
! template <class T> void do_oop_work(T* p) {
! oop obj = oopDesc::load_decode_heap_oop_not_null(p);
! if (_young_gen->is_in_reserved(obj) &&
!_card_table->addr_is_marked_imprecise(p)) {
// Don't overwrite the first missing card mark
if (_unmarked_addr == NULL) {
_unmarked_addr = (HeapWord*)p;
_unmarked_card = _card_table->byte_for(p);
}
}
}
+ public:
+ CheckForUnmarkedOops(PSYoungGen* young_gen, CardTableExtension* card_table) :
+ _young_gen(young_gen), _card_table(card_table), _unmarked_addr(NULL) { }
+
+ virtual void do_oop(oop* p) { CheckForUnmarkedOops::do_oop_work(p); }
+ virtual void do_oop(narrowOop* p) { CheckForUnmarkedOops::do_oop_work(p); }
+
bool has_unmarked_oop() {
return _unmarked_addr != NULL;
}
};
// Checks all objects for the existance of some type of mark,
// precise or imprecise, dirty or newgen.
class CheckForUnmarkedObjects : public ObjectClosure {
+ private:
PSYoungGen* _young_gen;
CardTableExtension* _card_table;
public:
CheckForUnmarkedObjects() {
*** 76,108 ****
// Card marks are not precise. The current system can leave us with
// a mismash of precise marks and begining of object marks. This means
// we test for missing precise marks first. If any are found, we don't
// fail unless the object head is also unmarked.
virtual void do_object(oop obj) {
! CheckForUnmarkedOops object_check( _young_gen, _card_table );
obj->oop_iterate(&object_check);
if (object_check.has_unmarked_oop()) {
assert(_card_table->addr_is_marked_imprecise(obj), "Found unmarked young_gen object");
}
}
};
// Checks for precise marking of oops as newgen.
class CheckForPreciseMarks : public OopClosure {
PSYoungGen* _young_gen;
CardTableExtension* _card_table;
! public:
! CheckForPreciseMarks( PSYoungGen* young_gen, CardTableExtension* card_table ) :
! _young_gen(young_gen), _card_table(card_table) { }
!
! virtual void do_oop(oop* p) {
! if (_young_gen->is_in_reserved(*p)) {
assert(_card_table->addr_is_marked_precise(p), "Found unmarked precise oop");
_card_table->set_card_newgen(p);
}
}
};
// We get passed the space_top value to prevent us from traversing into
// the old_gen promotion labs, which cannot be safely parsed.
void CardTableExtension::scavenge_contents(ObjectStartArray* start_array,
--- 83,121 ----
// Card marks are not precise. The current system can leave us with
// a mismash of precise marks and begining of object marks. This means
// we test for missing precise marks first. If any are found, we don't
// fail unless the object head is also unmarked.
virtual void do_object(oop obj) {
! CheckForUnmarkedOops object_check(_young_gen, _card_table);
obj->oop_iterate(&object_check);
if (object_check.has_unmarked_oop()) {
assert(_card_table->addr_is_marked_imprecise(obj), "Found unmarked young_gen object");
}
}
};
// Checks for precise marking of oops as newgen.
class CheckForPreciseMarks : public OopClosure {
+ private:
PSYoungGen* _young_gen;
CardTableExtension* _card_table;
! protected:
! template <class T> void do_oop_work(T* p) {
! oop obj = oopDesc::load_decode_heap_oop_not_null(p);
! if (_young_gen->is_in_reserved(obj)) {
assert(_card_table->addr_is_marked_precise(p), "Found unmarked precise oop");
_card_table->set_card_newgen(p);
}
}
+
+ public:
+ CheckForPreciseMarks( PSYoungGen* young_gen, CardTableExtension* card_table ) :
+ _young_gen(young_gen), _card_table(card_table) { }
+
+ virtual void do_oop(oop* p) { CheckForPreciseMarks::do_oop_work(p); }
+ virtual void do_oop(narrowOop* p) { CheckForPreciseMarks::do_oop_work(p); }
};
// We get passed the space_top value to prevent us from traversing into
// the old_gen promotion labs, which cannot be safely parsed.
void CardTableExtension::scavenge_contents(ObjectStartArray* start_array,
*** 654,666 ****
// |+ cur committed +++++++++++|
// |+ new committed +++++++|
HeapWord* new_end_for_commit =
MIN2(cur_committed.end(), _guard_region.start());
MemRegion new_committed =
MemRegion(new_start_aligned, new_end_for_commit);
- if(!new_committed.is_empty()) {
if (!os::commit_memory((char*)new_committed.start(),
new_committed.byte_size())) {
vm_exit_out_of_memory(new_committed.byte_size(),
"card table expansion");
}
--- 667,679 ----
// |+ cur committed +++++++++++|
// |+ new committed +++++++|
HeapWord* new_end_for_commit =
MIN2(cur_committed.end(), _guard_region.start());
+ if(new_start_aligned < new_end_for_commit) {
MemRegion new_committed =
MemRegion(new_start_aligned, new_end_for_commit);
if (!os::commit_memory((char*)new_committed.start(),
new_committed.byte_size())) {
vm_exit_out_of_memory(new_committed.byte_size(),
"card table expansion");
}