@@ -335,135 +335,76 @@ void MMTkHeap::print_tracing_info() const {
335335}
336336
337337
338- // An object is scavengable if its location may move during a scavenge.
339- // (A scavenge is a GC which is not a full GC.)
340- bool MMTkHeap::is_scavengable (oop obj) {return false ;}
341338// Registering and unregistering an nmethod (compiled code) with the heap.
342339// Override with specific mechanism for each specialized heap type.
343-
344- // Heap verification
345- void MMTkHeap::verify (VerifyOption option) {}
346-
347- template <int MAX_TASKS = 12 >
348- struct MMTkRootScanWorkScope {
349- int * _num_root_scan_tasks;
350- int _current_task_ordinal;
351- MMTkRootScanWorkScope (int * num_root_scan_tasks): _num_root_scan_tasks(num_root_scan_tasks), _current_task_ordinal(0 ) {
352- _current_task_ordinal = Atomic::add (1 , _num_root_scan_tasks);
353- if (_current_task_ordinal == 1 ) {
354- nmethod::oops_do_marking_prologue ();
355- }
356- }
357- ~MMTkRootScanWorkScope () {
358- if (_current_task_ordinal == MAX_TASKS) {
359- _current_task_ordinal = 0 ;
360- nmethod::oops_do_marking_epilogue ();
361- }
340+ class MMTkRegisterNMethodOopClosure : public OopClosure {
341+ template <class T > void do_oop_work (T* p) {
342+ mmtk_add_nmethod_oop ((void *) p);
362343 }
344+ public:
345+ void do_oop (oop* p) { do_oop_work (p); }
346+ void do_oop (narrowOop* p) { do_oop_work (p); }
363347};
364348
365- void MMTkHeap::scan_static_roots (OopClosure& cl) {
349+
350+ void MMTkHeap::register_nmethod (nmethod* nm) {
351+ // Scan and report pointers in this nmethod
352+ MMTkRegisterNMethodOopClosure reg_cl;
353+ nm->oops_do (®_cl);
354+ // Register the nmethod
355+ mmtk_register_nmethod ((void *) nm);
366356}
367357
358+ void MMTkHeap::unregister_nmethod (nmethod* nm) {
359+ mmtk_unregister_nmethod ((void *) nm);
360+ }
361+
362+ // Heap verification
363+ void MMTkHeap::verify (VerifyOption option) {}
368364
369365void MMTkHeap::scan_universe_roots (OopClosure& cl) {
370- ResourceMark rm;
371- MMTkRootScanWorkScope<> root_scan_work (&_num_root_scan_tasks);
372366 Universe::oops_do (&cl);
373367}
374368void MMTkHeap::scan_jni_handle_roots (OopClosure& cl) {
375- ResourceMark rm;
376- MMTkRootScanWorkScope<> root_scan_work (&_num_root_scan_tasks);
377369 JNIHandles::oops_do (&cl);
378370}
379371void MMTkHeap::scan_object_synchronizer_roots (OopClosure& cl) {
380- ResourceMark rm;
381- MMTkRootScanWorkScope<> root_scan_work (&_num_root_scan_tasks);
382372 ObjectSynchronizer::oops_do (&cl);
383373}
384374void MMTkHeap::scan_management_roots (OopClosure& cl) {
385- ResourceMark rm;
386- MMTkRootScanWorkScope<> root_scan_work (&_num_root_scan_tasks);
387375 Management::oops_do (&cl);
388376}
389377void MMTkHeap::scan_jvmti_export_roots (OopClosure& cl) {
390- ResourceMark rm;
391- MMTkRootScanWorkScope<> root_scan_work (&_num_root_scan_tasks);
392378 JvmtiExport::oops_do (&cl);
393379}
394380void MMTkHeap::scan_aot_loader_roots (OopClosure& cl) {
395- ResourceMark rm;
396- MMTkRootScanWorkScope<> root_scan_work (&_num_root_scan_tasks);
397381 AOTLoader::oops_do (&cl);
398382}
399383void MMTkHeap::scan_system_dictionary_roots (OopClosure& cl) {
400- ResourceMark rm;
401- MMTkRootScanWorkScope<> root_scan_work (&_num_root_scan_tasks);
402384 SystemDictionary::oops_do (&cl);
403385}
404386void MMTkHeap::scan_code_cache_roots (OopClosure& cl) {
405- ResourceMark rm;
406- MMTkRootScanWorkScope<> root_scan_work (&_num_root_scan_tasks);
407- CodeBlobToOopClosure cb_cl (&cl, true );
408- {
409- MutexLockerEx lock (CodeCache_lock, Mutex::_no_safepoint_check_flag);
410- CodeCache::scavenge_root_nmethods_do (&cb_cl);
411- CodeCache::blobs_do (&cb_cl);
412- }
387+ MarkingCodeBlobClosure cb_cl (&cl, false );
388+ CodeCache::blobs_do (&cb_cl);
413389}
414390void MMTkHeap::scan_string_table_roots (OopClosure& cl) {
415- ResourceMark rm;
416- MMTkRootScanWorkScope<> root_scan_work (&_num_root_scan_tasks);
417391 StringTable::oops_do (&cl);
418392}
419393void MMTkHeap::scan_class_loader_data_graph_roots (OopClosure& cl) {
420- ResourceMark rm;
421- MMTkRootScanWorkScope<> root_scan_work (&_num_root_scan_tasks);
422394 CLDToOopClosure cld_cl (&cl, false );
423395 ClassLoaderDataGraph::cld_do (&cld_cl);
424396}
425397void MMTkHeap::scan_weak_processor_roots (OopClosure& cl) {
426398 ResourceMark rm;
427- MMTkRootScanWorkScope<> root_scan_work (&_num_root_scan_tasks);
428399 WeakProcessor::oops_do (&cl); // (really needed???)
429400}
430401void MMTkHeap::scan_vm_thread_roots (OopClosure& cl) {
431402 ResourceMark rm;
432- MMTkRootScanWorkScope<> root_scan_work (&_num_root_scan_tasks);
433403 VMThread::vm_thread ()->oops_do (&cl, NULL );
434404}
435405
436- void MMTkHeap::scan_global_roots (OopClosure& cl) {
437- ResourceMark rm;
438- MMTkRootScanWorkScope<> root_scan_work (&_num_root_scan_tasks);
439-
440- CodeBlobToOopClosure cb_cl (&cl, true );
441- CLDToOopClosure cld_cl (&cl, false );
442-
443- Universe::oops_do (&cl);
444- JNIHandles::oops_do (&cl);
445- ObjectSynchronizer::oops_do (&cl);
446- Management::oops_do (&cl);
447- JvmtiExport::oops_do (&cl);
448- AOTLoader::oops_do (&cl);
449- SystemDictionary::oops_do (&cl);
450- {
451- MutexLockerEx lock (CodeCache_lock, Mutex::_no_safepoint_check_flag);
452- CodeCache::blobs_do (&cb_cl);
453- }
454-
455- OopStorage::ParState<false , false > _par_state_string (StringTable::weak_storage ());
456- StringTable::possibly_parallel_oops_do (&_par_state_string, &cl);
457-
458- // if (!_root_tasks->is_task_claimed(MMTk_ClassLoaderDataGraph_oops_do)) ClassLoaderDataGraph::roots_cld_do(&cld_cl, &cld_cl);
459- ClassLoaderDataGraph::cld_do (&cld_cl);
460-
461- WeakProcessor::oops_do (&cl); // (really needed???)
462- }
463-
464406void MMTkHeap::scan_thread_roots (OopClosure& cl) {
465407 ResourceMark rm;
466- MMTkRootScanWorkScope<> root_scan_work (&_num_root_scan_tasks);
467408 Threads::possibly_parallel_oops_do (false , &cl, NULL );
468409}
469410
0 commit comments