Mercurial > hg > truffle
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 |