437
438 void Klass::klass_update_barrier_set(oop v) {
439 record_modified_oops();
440 }
441
442 // This barrier is used by G1 to remember the old oop values, so
443 // that we don't forget any objects that were live at the snapshot at
444 // the beginning. This function is only used when we write oops into Klasses.
445 void Klass::klass_update_barrier_set_pre(oop* p, oop v) {
446 #if INCLUDE_ALL_GCS
447 if (UseG1GC) {
448 oop obj = *p;
449 if (obj != NULL) {
450 G1SATBCardTableModRefBS::enqueue(obj);
451 }
452 }
453 #endif
454 }
455
456 void Klass::klass_oop_store(oop* p, oop v) {
457 assert(!Universe::heap()->is_in_reserved((void*)p), "Should store pointer into metadata");
458 assert(v == NULL || Universe::heap()->is_in_reserved((void*)v), "Should store pointer to an object");
459
460 // do the store
461 if (always_do_update_barrier) {
462 klass_oop_store((volatile oop*)p, v);
463 } else {
464 klass_update_barrier_set_pre(p, v);
465 *p = v;
466 klass_update_barrier_set(v);
467 }
468 }
469
470 void Klass::klass_oop_store(volatile oop* p, oop v) {
471 assert(!Universe::heap()->is_in_reserved((void*)p), "Should store pointer into metadata");
472 assert(v == NULL || Universe::heap()->is_in_reserved((void*)v), "Should store pointer to an object");
473
474 klass_update_barrier_set_pre((oop*)p, v); // Cast away volatile.
475 OrderAccess::release_store_ptr(p, v);
476 klass_update_barrier_set(v);
477 }
478
479 void Klass::oops_do(OopClosure* cl) {
480 cl->do_oop(&_java_mirror);
481 }
482
483 void Klass::remove_unshareable_info() {
484 assert (DumpSharedSpaces, "only called for DumpSharedSpaces");
485 TRACE_REMOVE_KLASS_ID(this);
486
487 set_subklass(NULL);
488 set_next_sibling(NULL);
489 // Clear the java mirror
490 set_java_mirror(NULL);
491 set_next_link(NULL);
492
|
437
438 void Klass::klass_update_barrier_set(oop v) {
439 record_modified_oops();
440 }
441
442 // This barrier is used by G1 to remember the old oop values, so
443 // that we don't forget any objects that were live at the snapshot at
444 // the beginning. This function is only used when we write oops into Klasses.
445 void Klass::klass_update_barrier_set_pre(oop* p, oop v) {
446 #if INCLUDE_ALL_GCS
447 if (UseG1GC) {
448 oop obj = *p;
449 if (obj != NULL) {
450 G1SATBCardTableModRefBS::enqueue(obj);
451 }
452 }
453 #endif
454 }
455
456 void Klass::klass_oop_store(oop* p, oop v) {
457 assert(!GC::gc()->heap()->is_in_reserved((void*)p), "Should store pointer into metadata");
458 assert(v == NULL || GC::gc()->heap()->is_in_reserved((void*)v), "Should store pointer to an object");
459
460 // do the store
461 if (always_do_update_barrier) {
462 klass_oop_store((volatile oop*)p, v);
463 } else {
464 klass_update_barrier_set_pre(p, v);
465 *p = v;
466 klass_update_barrier_set(v);
467 }
468 }
469
470 void Klass::klass_oop_store(volatile oop* p, oop v) {
471 assert(!GC::gc()->heap()->is_in_reserved((void*)p), "Should store pointer into metadata");
472 assert(v == NULL || GC::gc()->heap()->is_in_reserved((void*)v), "Should store pointer to an object");
473
474 klass_update_barrier_set_pre((oop*)p, v); // Cast away volatile.
475 OrderAccess::release_store_ptr(p, v);
476 klass_update_barrier_set(v);
477 }
478
479 void Klass::oops_do(OopClosure* cl) {
480 cl->do_oop(&_java_mirror);
481 }
482
483 void Klass::remove_unshareable_info() {
484 assert (DumpSharedSpaces, "only called for DumpSharedSpaces");
485 TRACE_REMOVE_KLASS_ID(this);
486
487 set_subklass(NULL);
488 set_next_sibling(NULL);
489 // Clear the java mirror
490 set_java_mirror(NULL);
491 set_next_link(NULL);
492
|