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