/* * Copyright (c) 2014, 2022, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. *
*/
inlinevoid ClaimMetadataVisitingOopIterateClosure::do_method(Method* m) { // Mark interpreted frames for class redefinition
m->record_gc_epoch();
}
// Dispatch table implementation for *Klass::oop_oop_iterate // // It allows for a single call to do a multi-dispatch to an optimized version // of oop_oop_iterate that statically know all these types: // - OopClosureType : static type give at call site // - Klass* : dynamic to static type through Klass::kind() -> table index // - UseCompressedOops : dynamic to static value determined once // // when users call obj->oop_iterate(&cl). // // oopDesc::oop_iterate() calls OopOopIterateDispatch::function(klass)(cl, obj, klass), // which dispatches to an optimized version of // [Instance, ObjArry, etc]Klass::oop_oop_iterate(oop, OopClosureType) // // OopClosureType : // If OopClosureType has an implementation of do_oop (and do_metadata et.al.), // then the static type of OopClosureType will be used to allow inlining of // do_oop (even though do_oop is virtual). Otherwise, a virtual call will be // used when calling do_oop. // // Klass* : // A table mapping from *Klass::Kind to function is setup. This happens once // when the program starts, when the static _table instance is initialized for // the OopOopIterateDispatch specialized with the OopClosureType. // // UseCompressedOops : // Initially the table is populated with an init function, and not the actual // oop_oop_iterate function. This is done, so that the first time we dispatch // through the init function we check what the value of UseCompressedOops // became, and use that to determine if we should install an optimized // narrowOop version or optimized oop version of oop_oop_iterate. The appropriate // oop_oop_iterate function replaces the init function in the table, and // succeeding calls will jump directly to oop_oop_iterate.
template <typename OopClosureType> class OopOopIterateDispatch : public AllStatic { private: typedefvoid (*FunctionType)(OopClosureType*, oop, Klass*);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.