< prev index next >
src/hotspot/share/classfile/classLoaderData.hpp
Print this page
*** 85,97 ****
public:
static ClassLoaderData* find_or_create(Handle class_loader, TRAPS);
static void purge();
static void clear_claimed_marks();
// oops do
! static void oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim);
! static void keep_alive_oops_do(OopClosure* blk, KlassClosure* klass_closure, bool must_claim);
! static void always_strong_oops_do(OopClosure* blk, KlassClosure* klass_closure, bool must_claim);
// cld do
static void cld_do(CLDClosure* cl);
static void cld_unloading_do(CLDClosure* cl);
static void roots_cld_do(CLDClosure* strong, CLDClosure* weak);
static void keep_alive_cld_do(CLDClosure* cl);
--- 85,97 ----
public:
static ClassLoaderData* find_or_create(Handle class_loader, TRAPS);
static void purge();
static void clear_claimed_marks();
// oops do
! static void oops_do(OopClosure* f, bool must_claim);
! static void keep_alive_oops_do(OopClosure* blk, bool must_claim);
! static void always_strong_oops_do(OopClosure* blk, bool must_claim);
// cld do
static void cld_do(CLDClosure* cl);
static void cld_unloading_do(CLDClosure* cl);
static void roots_cld_do(CLDClosure* strong, CLDClosure* weak);
static void keep_alive_cld_do(CLDClosure* cl);
*** 232,241 ****
--- 232,246 ----
bool _is_anonymous; // if this CLD is for an anonymous class
s2 _keep_alive; // if this CLD is kept alive without a keep_alive_object().
// Used for anonymous classes and the boot class
// loader. _keep_alive does not need to be volatile or
// atomic since there is one unique CLD per anonymous class.
+
+ // Remembered sets support for the oops in the class loader data.
+ jbyte _modified_oops; // Card Table Equivalent (YC/CMS support)
+ jbyte _accumulated_modified_oops; // Mod Union Equivalent (CMS support)
+
volatile int _claimed; // true if claimed, for example during GC traces.
// To avoid applying oop closure more than once.
// Has to be an int because we cas it.
ChunkedHandleList _handles; // Handles to constant pool arrays, Modules, etc, which
// have the same life cycle of the corresponding ClassLoader.
*** 274,283 ****
--- 279,301 ----
// GC interface.
void clear_claimed() { _claimed = 0; }
bool claimed() const { return _claimed == 1; }
bool claim();
+ // The CLD are not placed in the Heap, so the Card Table or
+ // the Mod Union Table can't be used to mark when CLD have modified oops.
+ // The CT and MUT bits saves this information for the whole class loader data.
+ void clear_modified_oops() { _modified_oops = 0; }
+ public:
+ void record_modified_oops() { _modified_oops = 1; }
+ bool has_modified_oops() { return _modified_oops == 1; }
+
+ void accumulate_modified_oops() { if (has_modified_oops()) _accumulated_modified_oops = 1; }
+ void clear_accumulated_modified_oops() { _accumulated_modified_oops = 0; }
+ bool has_accumulated_modified_oops() { return _accumulated_modified_oops == 1; }
+ private:
+
void unload();
bool keep_alive() const { return _keep_alive > 0; }
void classes_do(void f(Klass*));
void loaded_classes_do(KlassClosure* klass_closure);
void classes_do(void f(InstanceKlass*));
*** 344,355 ****
void inc_keep_alive();
void dec_keep_alive();
inline unsigned int identity_hash() const { return (unsigned int)(((intptr_t)this) >> 3); }
! // Used when tracing from klasses.
! void oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim);
void classes_do(KlassClosure* klass_closure);
Klass* klasses() { return _klasses; }
JNIMethodBlock* jmethod_ids() const { return _jmethod_ids; }
--- 362,372 ----
void inc_keep_alive();
void dec_keep_alive();
inline unsigned int identity_hash() const { return (unsigned int)(((intptr_t)this) >> 3); }
! void oops_do(OopClosure* f, bool must_claim, bool clear_modified_oops = false);
void classes_do(KlassClosure* klass_closure);
Klass* klasses() { return _klasses; }
JNIMethodBlock* jmethod_ids() const { return _jmethod_ids; }
< prev index next >