src/share/vm/memory/iterator.cpp

Fri, 09 Oct 2009 15:18:52 -0700

author
trims
date
Fri, 09 Oct 2009 15:18:52 -0700
changeset 1435
a1423fe86a18
parent 1383
89e0543e1737
parent 1429
753cf9794df9
child 1907
c18cbe5936b8
child 1918
1a5913bf5e19
permissions
-rw-r--r--

Merge

     1 /*
     2  * Copyright 1997-2009 Sun Microsystems, Inc.  All Rights Reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     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
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
    20  * CA 95054 USA or visit www.sun.com if you need additional information or
    21  * have any questions.
    22  *
    23  */
    25 # include "incls/_precompiled.incl"
    26 # include "incls/_iterator.cpp.incl"
    28 #ifdef ASSERT
    29 bool OopClosure::_must_remember_klasses = false;
    30 #endif
    32 void ObjectToOopClosure::do_object(oop obj) {
    33   obj->oop_iterate(_cl);
    34 }
    36 void VoidClosure::do_void() {
    37   ShouldNotCallThis();
    38 }
    40 #ifdef ASSERT
    41 bool OopClosure::must_remember_klasses() {
    42   return _must_remember_klasses;
    43 }
    44 void OopClosure::set_must_remember_klasses(bool v) {
    45   _must_remember_klasses = v;
    46 }
    47 #endif
    50 MarkingCodeBlobClosure::MarkScope::MarkScope(bool activate)
    51   : _active(activate)
    52 {
    53   if (_active)  nmethod::oops_do_marking_prologue();
    54 }
    56 MarkingCodeBlobClosure::MarkScope::~MarkScope() {
    57   if (_active)  nmethod::oops_do_marking_epilogue();
    58 }
    60 void MarkingCodeBlobClosure::do_code_blob(CodeBlob* cb) {
    61   if (!cb->is_nmethod())  return;
    62   nmethod* nm = (nmethod*) cb;
    63   if (!nm->test_set_oops_do_mark()) {
    64     NOT_PRODUCT(if (TraceScavenge)  nm->print_on(tty, "oops_do, 1st visit\n"));
    65     do_newly_marked_nmethod(nm);
    66   } else {
    67     NOT_PRODUCT(if (TraceScavenge)  nm->print_on(tty, "oops_do, skipped on 2nd visit\n"));
    68   }
    69 }
    71 void CodeBlobToOopClosure::do_newly_marked_nmethod(nmethod* nm) {
    72   nm->oops_do(_cl, /*do_strong_roots_only=*/ true);
    73 }
    75 void CodeBlobToOopClosure::do_code_blob(CodeBlob* cb) {
    76   if (!_do_marking) {
    77     NOT_PRODUCT(if (TraceScavenge && Verbose && cb->is_nmethod())  ((nmethod*)cb)->print_on(tty, "oops_do, unmarked visit\n"));
    78     // This assert won't work, since there are lots of mini-passes
    79     // (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     cb->oops_do(_cl);
    82   } else {
    83     MarkingCodeBlobClosure::do_code_blob(cb);
    84   }
    85 }

mercurial