comparison src/share/vm/prims/jvmtiExport.cpp @ 2125:7246a374a9f2

6458402: 3 jvmti tests fail with CMS and +ExplicitGCInvokesConcurrent Summary: Make JvmtiGCMark safe to run non-safepoint and instrument CMS Reviewed-by: ysr, dcubed
author kamg
date Mon, 10 Jan 2011 17:14:53 -0500
parents 684faacebf20
children db2b0f8c1cef
comparison
equal deleted inserted replaced
2124:e31d8c656c5b 2125:7246a374a9f2
2356 } 2356 }
2357 return result; 2357 return result;
2358 } 2358 }
2359 #endif // SERVICES_KERNEL 2359 #endif // SERVICES_KERNEL
2360 2360
2361 // CMS has completed referencing processing so may need to update
2362 // tag maps.
2363 void JvmtiExport::cms_ref_processing_epilogue() {
2364 if (JvmtiEnv::environments_might_exist()) {
2365 JvmtiTagMap::cms_ref_processing_epilogue();
2366 }
2367 }
2368
2369
2370 //////////////////////////////////////////////////////////////////////////////////////////////// 2361 ////////////////////////////////////////////////////////////////////////////////////////////////
2371 2362
2372 // Setup current current thread for event collection. 2363 // Setup current current thread for event collection.
2373 void JvmtiEventCollector::setup_jvmti_thread_state() { 2364 void JvmtiEventCollector::setup_jvmti_thread_state() {
2374 // set this event collector to be the current one. 2365 // set this event collector to be the current one.
2534 if (was_enabled()) { 2525 if (was_enabled()) {
2535 _collector->set_enabled(true); 2526 _collector->set_enabled(true);
2536 } 2527 }
2537 }; 2528 };
2538 2529
2539 JvmtiGCMarker::JvmtiGCMarker(bool full) : _full(full), _invocation_count(0) { 2530 JvmtiGCMarker::JvmtiGCMarker() {
2540 assert(Thread::current()->is_VM_thread(), "wrong thread");
2541
2542 // if there aren't any JVMTI environments then nothing to do 2531 // if there aren't any JVMTI environments then nothing to do
2543 if (!JvmtiEnv::environments_might_exist()) { 2532 if (!JvmtiEnv::environments_might_exist()) {
2544 return; 2533 return;
2545 } 2534 }
2546 2535
2547 if (ForceFullGCJVMTIEpilogues) {
2548 // force 'Full GC' was done semantics for JVMTI GC epilogues
2549 _full = true;
2550 }
2551
2552 // GarbageCollectionStart event posted from VM thread - okay because
2553 // JVMTI is clear that the "world is stopped" and callback shouldn't
2554 // try to call into the VM.
2555 if (JvmtiExport::should_post_garbage_collection_start()) { 2536 if (JvmtiExport::should_post_garbage_collection_start()) {
2556 JvmtiExport::post_garbage_collection_start(); 2537 JvmtiExport::post_garbage_collection_start();
2557 } 2538 }
2558 2539
2559 // if "full" is false it probably means this is a scavenge of the young 2540 if (SafepointSynchronize::is_at_safepoint()) {
2560 // generation. However it could turn out that a "full" GC is required 2541 // Do clean up tasks that need to be done at a safepoint
2561 // so we record the number of collections so that it can be checked in 2542 JvmtiEnvBase::check_for_periodic_clean_up();
2562 // the destructor. 2543 }
2563 if (!_full) {
2564 _invocation_count = Universe::heap()->total_full_collections();
2565 }
2566
2567 // Do clean up tasks that need to be done at a safepoint
2568 JvmtiEnvBase::check_for_periodic_clean_up();
2569 } 2544 }
2570 2545
2571 JvmtiGCMarker::~JvmtiGCMarker() { 2546 JvmtiGCMarker::~JvmtiGCMarker() {
2572 // if there aren't any JVMTI environments then nothing to do 2547 // if there aren't any JVMTI environments then nothing to do
2573 if (!JvmtiEnv::environments_might_exist()) { 2548 if (!JvmtiEnv::environments_might_exist()) {
2576 2551
2577 // JVMTI notify gc finish 2552 // JVMTI notify gc finish
2578 if (JvmtiExport::should_post_garbage_collection_finish()) { 2553 if (JvmtiExport::should_post_garbage_collection_finish()) {
2579 JvmtiExport::post_garbage_collection_finish(); 2554 JvmtiExport::post_garbage_collection_finish();
2580 } 2555 }
2581
2582 // we might have initially started out doing a scavenge of the young
2583 // generation but could have ended up doing a "full" GC - check the
2584 // GC count to see.
2585 if (!_full) {
2586 _full = (_invocation_count != Universe::heap()->total_full_collections());
2587 }
2588
2589 // Full collection probably means the perm generation has been GC'ed
2590 // so we clear the breakpoint cache.
2591 if (_full) {
2592 JvmtiCurrentBreakpoints::gc_epilogue();
2593 }
2594
2595 // Notify heap/object tagging support
2596 JvmtiTagMap::gc_epilogue(_full);
2597 } 2556 }
2598 #endif // JVMTI_KERNEL 2557 #endif // JVMTI_KERNEL