2273N/A * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. 0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 0N/A * This code is free software; you can redistribute it and/or modify it 0N/A * under the terms of the GNU General Public License version 2 only, as 0N/A * published by the Free Software Foundation. 0N/A * This code is distributed in the hope that it will be useful, but WITHOUT 0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 0N/A * version 2 for more details (a copy is included in the LICENSE file that 0N/A * accompanied this code). 0N/A * You should have received a copy of the GNU General Public License version 0N/A * 2 along with this work; if not, write to the Free Software Foundation, 0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 1472N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2062N/A // decrement name refcount before freeing 0N/A// The loaderConstraintTable must always be accessed with the 0N/A// SystemDictionary lock held. This is true even for readers as 0N/A// entries in the table could be being dynamically resized. 0N/A // Remove unloaded entries from constraint table 0N/A // Remove klass that is no longer alive 0N/A // Remove entries no longer alive from loader array 0N/A continue;
// current element replaced, so restart without 0N/A // Check whether entry should be purged 0N/A tty->
print(
"[Purging complete constraint for name %s\n",
0N/A tty->
print(
"[Adding new constraint for name: %s, loader[0]: %s," 0N/A " loader[1]: %s ]\n",
0N/A /* constraint already imposed */ 0N/A tty->
print(
"[Setting class object in existing constraint for" 0N/A " name: %s and loader %s ]\n",
0N/A case 1:
reason =
"the class objects presented by loader[0] and loader[1]" 0N/A " are different";
break;
0N/A case 2:
reason =
"the class object presented by loader[0] does not match" 0N/A " the stored class object in the constraint";
break;
0N/A case 3:
reason =
"the class object presented by loader[1] does not match" 0N/A " the stored class object in the constraint";
break;
0N/A tty->
print(
"[Failed to add constraint for name: %s, loader[0]: %s," 0N/A " loader[1]: %s, Reason: %s ]\n",
0N/A// return true if the constraint was updated, false if the constraint is 0N/A tty->
print(
"[Constraint check failed for name %s, loader %s: " 0N/A "the presented class object differs from that stored ]\n",
0N/A tty->
print(
"[Updating constraint for name %s, loader %s, " 0N/A "by setting class object ]\n",
2116N/A // Only return fully loaded classes. Classes found through the 2116N/A // constraints might still be in the process of loading. 0N/A // No constraints, or else no klass loaded yet. 0N/A tty->
print(
"[Extending constraint for name %s by adding loader[%d]: %s %s",
0N/A (p->
klass() ==
NULL ?
" and setting class object ]\n" :
" ]\n")
0N/A // make sure *pp1 has higher capacity 0N/A // p1->klass() will hold NULL if klass, p2->klass(), and old 0N/A // p1->klass() are all NULL. In addition, all three must have 0N/A // matching non-NULL values, otherwise either the constraints would 0N/A // have been violated, or the constraints had been corrupted (and an 0N/A // assertion would fail). 1258N/A // We found the class in the system dictionary, so we should 1258N/A // make sure that the klassOop matches what we already have. 1258N/A // If we don't find the class in the system dictionary, it 1258N/A // has to be in the placeholders table. 1258N/A // The instanceKlass might not be on the entry, so the only 1258N/A // thing we can check here is whether we were successful in 1258N/A // finding the class in the placeholders table. 0N/A// Called with the system dictionary lock held