< 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 >