5028 bool claim_clean_klass_tree_task() {
5029 if (_clean_klass_tree_claimed) {
5030 return false;
5031 }
5032
5033 return Atomic::cmpxchg(1, (jint*)&_clean_klass_tree_claimed, 0) == 0;
5034 }
5035
5036 InstanceKlass* claim_next_klass() {
5037 Klass* klass;
5038 do {
5039 klass =_klass_iterator.next_klass();
5040 } while (klass != NULL && !klass->oop_is_instance());
5041
5042 return (InstanceKlass*)klass;
5043 }
5044
5045 public:
5046
5047 void clean_klass(InstanceKlass* ik) {
5048 ik->clean_implementors_list(_is_alive);
5049 ik->clean_method_data(_is_alive);
5050
5051 // G1 specific cleanup work that has
5052 // been moved here to be done in parallel.
5053 ik->clean_dependent_nmethods();
5054 if (JvmtiExport::has_redefined_a_class()) {
5055 InstanceKlass::purge_previous_versions(ik);
5056 }
5057 }
5058
5059 void work() {
5060 ResourceMark rm;
5061
5062 // One worker will clean the subklass/sibling klass tree.
5063 if (claim_clean_klass_tree_task()) {
5064 Klass::clean_subklass_tree(_is_alive);
5065 }
5066
5067 // All workers will help cleaning the classes,
5068 InstanceKlass* klass;
5069 while ((klass = claim_next_klass()) != NULL) {
5070 clean_klass(klass);
5071 }
5072 }
5073 };
|
5028 bool claim_clean_klass_tree_task() {
5029 if (_clean_klass_tree_claimed) {
5030 return false;
5031 }
5032
5033 return Atomic::cmpxchg(1, (jint*)&_clean_klass_tree_claimed, 0) == 0;
5034 }
5035
5036 InstanceKlass* claim_next_klass() {
5037 Klass* klass;
5038 do {
5039 klass =_klass_iterator.next_klass();
5040 } while (klass != NULL && !klass->oop_is_instance());
5041
5042 return (InstanceKlass*)klass;
5043 }
5044
5045 public:
5046
5047 void clean_klass(InstanceKlass* ik) {
5048 ik->clean_weak_instanceklass_links(_is_alive);
5049
5050 if (JvmtiExport::has_redefined_a_class()) {
5051 InstanceKlass::purge_previous_versions(ik);
5052 }
5053 }
5054
5055 void work() {
5056 ResourceMark rm;
5057
5058 // One worker will clean the subklass/sibling klass tree.
5059 if (claim_clean_klass_tree_task()) {
5060 Klass::clean_subklass_tree(_is_alive);
5061 }
5062
5063 // All workers will help cleaning the classes,
5064 InstanceKlass* klass;
5065 while ((klass = claim_next_klass()) != NULL) {
5066 clean_klass(klass);
5067 }
5068 }
5069 };
|