hotspot/src/share/vm/memory/iterator.cpp
changeset 5686 5435e77aa3df
parent 3919 b15d85d98b61
child 5702 201c5cde25bb
equal deleted inserted replaced
5539:261ecc5bb65e 5686:5435e77aa3df
     1 /*
     1 /*
     2  * Copyright 1997-2009 Sun Microsystems, Inc.  All Rights Reserved.
     2  * Copyright 1997-2010 Sun Microsystems, Inc.  All Rights Reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
    56 MarkingCodeBlobClosure::MarkScope::~MarkScope() {
    56 MarkingCodeBlobClosure::MarkScope::~MarkScope() {
    57   if (_active)  nmethod::oops_do_marking_epilogue();
    57   if (_active)  nmethod::oops_do_marking_epilogue();
    58 }
    58 }
    59 
    59 
    60 void MarkingCodeBlobClosure::do_code_blob(CodeBlob* cb) {
    60 void MarkingCodeBlobClosure::do_code_blob(CodeBlob* cb) {
    61   if (!cb->is_nmethod())  return;
    61   nmethod* nm = cb->as_nmethod_or_null();
    62   nmethod* nm = (nmethod*) cb;
    62   if (nm == NULL)  return;
    63   if (!nm->test_set_oops_do_mark()) {
    63   if (!nm->test_set_oops_do_mark()) {
    64     NOT_PRODUCT(if (TraceScavenge)  nm->print_on(tty, "oops_do, 1st visit\n"));
    64     NOT_PRODUCT(if (TraceScavenge)  nm->print_on(tty, "oops_do, 1st visit\n"));
    65     do_newly_marked_nmethod(nm);
    65     do_newly_marked_nmethod(nm);
    66   } else {
    66   } else {
    67     NOT_PRODUCT(if (TraceScavenge)  nm->print_on(tty, "oops_do, skipped on 2nd visit\n"));
    67     NOT_PRODUCT(if (TraceScavenge)  nm->print_on(tty, "oops_do, skipped on 2nd visit\n"));
    72   nm->oops_do(_cl, /*do_strong_roots_only=*/ true);
    72   nm->oops_do(_cl, /*do_strong_roots_only=*/ true);
    73 }
    73 }
    74 
    74 
    75 void CodeBlobToOopClosure::do_code_blob(CodeBlob* cb) {
    75 void CodeBlobToOopClosure::do_code_blob(CodeBlob* cb) {
    76   if (!_do_marking) {
    76   if (!_do_marking) {
    77     NOT_PRODUCT(if (TraceScavenge && Verbose && cb->is_nmethod())  ((nmethod*)cb)->print_on(tty, "oops_do, unmarked visit\n"));
    77     nmethod* nm = cb->as_nmethod_or_null();
       
    78     NOT_PRODUCT(if (TraceScavenge && Verbose && nm != NULL)  nm->print_on(tty, "oops_do, unmarked visit\n"));
    78     // This assert won't work, since there are lots of mini-passes
    79     // This assert won't work, since there are lots of mini-passes
    79     // (mostly in debug mode) that co-exist with marking phases.
    80     // (mostly in debug mode) that co-exist with marking phases.
    80     //assert(!(cb->is_nmethod() && ((nmethod*)cb)->test_oops_do_mark()), "found marked nmethod during mark-free phase");
    81     //assert(!(cb->is_nmethod() && ((nmethod*)cb)->test_oops_do_mark()), "found marked nmethod during mark-free phase");
    81     cb->oops_do(_cl);
    82     if (nm != NULL) {
       
    83       nm->oops_do(_cl);
       
    84     }
    82   } else {
    85   } else {
    83     MarkingCodeBlobClosure::do_code_blob(cb);
    86     MarkingCodeBlobClosure::do_code_blob(cb);
    84   }
    87   }
    85 }
    88 }
    86 
    89