< prev index next >
src/share/vm/classfile/loaderConstraints.cpp
Print this page
rev 13288 : imported patch 8181917-refactor-ul-logstream
*** 23,32 ****
--- 23,33 ----
*/
#include "precompiled.hpp"
#include "classfile/classLoaderData.inline.hpp"
#include "classfile/loaderConstraints.hpp"
+ #include "logging/log.hpp"
#include "memory/resourceArea.hpp"
#include "oops/oop.inline.hpp"
#include "runtime/handles.inline.hpp"
#include "runtime/safepoint.hpp"
#include "utilities/hashtable.inline.hpp"
*** 86,125 ****
}
void LoaderConstraintTable::purge_loader_constraints() {
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
// Remove unloaded entries from constraint table
for (int index = 0; index < table_size(); index++) {
LoaderConstraintEntry** p = bucket_addr(index);
while(*p) {
LoaderConstraintEntry* probe = *p;
InstanceKlass* klass = probe->klass();
// Remove klass that is no longer alive
if (klass != NULL &&
klass->class_loader_data()->is_unloading()) {
probe->set_klass(NULL);
! if (log_is_enabled(Info, class, loader, constraints)) {
ResourceMark rm;
! outputStream* out = Log(class, loader, constraints)::info_stream();
! out->print_cr("purging class object from constraint for name %s,"
" loader list:",
probe->name()->as_C_string());
for (int i = 0; i < probe->num_loaders(); i++) {
! out->print_cr(" [%d]: %s", i,
probe->loader_data(i)->loader_name());
}
}
}
// Remove entries no longer alive from loader array
int n = 0;
while (n < probe->num_loaders()) {
if (probe->loader_data(n)->is_unloading()) {
! if (log_is_enabled(Info, class, loader, constraints)) {
ResourceMark rm;
! outputStream* out = Log(class, loader, constraints)::info_stream();
! out->print_cr("purging loader %s from constraint for name %s",
probe->loader_data(n)->loader_name(),
probe->name()->as_C_string()
);
}
--- 87,125 ----
}
void LoaderConstraintTable::purge_loader_constraints() {
assert(SafepointSynchronize::is_at_safepoint(), "must be at safepoint");
+ LogTarget(Info, class, loader, constraints) lt;
// Remove unloaded entries from constraint table
for (int index = 0; index < table_size(); index++) {
LoaderConstraintEntry** p = bucket_addr(index);
while(*p) {
LoaderConstraintEntry* probe = *p;
InstanceKlass* klass = probe->klass();
// Remove klass that is no longer alive
if (klass != NULL &&
klass->class_loader_data()->is_unloading()) {
probe->set_klass(NULL);
! if (lt.is_enabled()) {
ResourceMark rm;
! lt.print("purging class object from constraint for name %s,"
" loader list:",
probe->name()->as_C_string());
for (int i = 0; i < probe->num_loaders(); i++) {
! lt.print(" [%d]: %s", i,
probe->loader_data(i)->loader_name());
}
}
}
// Remove entries no longer alive from loader array
int n = 0;
while (n < probe->num_loaders()) {
if (probe->loader_data(n)->is_unloading()) {
! if (lt.is_enabled()) {
ResourceMark rm;
! lt.print("purging loader %s from constraint for name %s",
probe->loader_data(n)->loader_name(),
probe->name()->as_C_string()
);
}
*** 127,142 ****
int num = probe->num_loaders() - 1;
probe->set_num_loaders(num);
probe->set_loader_data(n, probe->loader_data(num));
probe->set_loader_data(num, NULL);
! if (log_is_enabled(Info, class, loader, constraints)) {
ResourceMark rm;
! outputStream* out = Log(class, loader, constraints)::info_stream();
! out->print_cr("new loader list:");
for (int i = 0; i < probe->num_loaders(); i++) {
! out->print_cr(" [%d]: %s", i,
probe->loader_data(i)->loader_name());
}
}
continue; // current element replaced, so restart without
--- 127,141 ----
int num = probe->num_loaders() - 1;
probe->set_num_loaders(num);
probe->set_loader_data(n, probe->loader_data(num));
probe->set_loader_data(num, NULL);
! if (lt.is_enabled()) {
ResourceMark rm;
! lt.print("new loader list:");
for (int i = 0; i < probe->num_loaders(); i++) {
! lt.print(" [%d]: %s", i,
probe->loader_data(i)->loader_name());
}
}
continue; // current element replaced, so restart without
*** 144,157 ****
}
n++;
}
// Check whether entry should be purged
if (probe->num_loaders() < 2) {
! if (log_is_enabled(Info, class, loader, constraints)) {
ResourceMark rm;
! outputStream* out = Log(class, loader, constraints)::info_stream();
! out->print_cr("purging complete constraint for name %s",
probe->name()->as_C_string());
}
// Purge entry
*p = probe->next();
--- 143,155 ----
}
n++;
}
// Check whether entry should be purged
if (probe->num_loaders() < 2) {
! if (lt.is_enabled()) {
ResourceMark rm;
! lt.print("purging complete constraint for name %s",
probe->name()->as_C_string());
}
// Purge entry
*p = probe->next();
*** 172,185 ****
}
}
void log_ldr_constraint_msg(Symbol* class_name, const char* reason,
Handle class_loader1, Handle class_loader2) {
! if (log_is_enabled(Info, class, loader, constraints)) {
ResourceMark rm;
! outputStream* out = Log(class, loader, constraints)::info_stream();
! out->print_cr("Failed to add constraint for name: %s, loader[0]: %s,"
" loader[1]: %s, Reason: %s",
class_name->as_C_string(),
SystemDictionary::loader_name(class_loader1()),
SystemDictionary::loader_name(class_loader2()),
reason);
--- 170,183 ----
}
}
void log_ldr_constraint_msg(Symbol* class_name, const char* reason,
Handle class_loader1, Handle class_loader2) {
! LogTarget(Info, class, loader, constraints) lt;
! if (lt.is_enabled()) {
ResourceMark rm;
! lt.print("Failed to add constraint for name: %s, loader[0]: %s,"
" loader[1]: %s, Reason: %s",
class_name->as_C_string(),
SystemDictionary::loader_name(class_loader1()),
SystemDictionary::loader_name(class_loader2()),
reason);
*** 187,196 ****
--- 185,195 ----
}
bool LoaderConstraintTable::add_entry(Symbol* class_name,
InstanceKlass* klass1, Handle class_loader1,
InstanceKlass* klass2, Handle class_loader2) {
+ LogTarget(Info, class, loader, constraints) lt;
if (klass1 != NULL && klass2 != NULL) {
if (klass1 == klass2) {
// Same type already loaded in both places. There is no need for any constraint.
return true;
} else {
*** 242,269 ****
p->set_loader(0, class_loader1());
p->set_loader(1, class_loader2());
p->set_klass(klass);
p->set_next(bucket(index));
set_entry(index, p);
! if (log_is_enabled(Info, class, loader, constraints)) {
ResourceMark rm;
! outputStream* out = Log(class, loader, constraints)::info_stream();
! out->print_cr("adding new constraint for name: %s, loader[0]: %s,"
" loader[1]: %s",
class_name->as_C_string(),
SystemDictionary::loader_name(class_loader1()),
SystemDictionary::loader_name(class_loader2())
);
}
} else if (*pp1 == *pp2) {
/* constraint already imposed */
if ((*pp1)->klass() == NULL) {
(*pp1)->set_klass(klass);
! if (log_is_enabled(Info, class, loader, constraints)) {
ResourceMark rm;
! outputStream* out = Log(class, loader, constraints)::info_stream();
! out->print_cr("setting class object in existing constraint for"
" name: %s and loader %s",
class_name->as_C_string(),
SystemDictionary::loader_name(class_loader1())
);
}
--- 241,266 ----
p->set_loader(0, class_loader1());
p->set_loader(1, class_loader2());
p->set_klass(klass);
p->set_next(bucket(index));
set_entry(index, p);
! if (lt.is_enabled()) {
ResourceMark rm;
! lt.print("adding new constraint for name: %s, loader[0]: %s,"
" loader[1]: %s",
class_name->as_C_string(),
SystemDictionary::loader_name(class_loader1()),
SystemDictionary::loader_name(class_loader2())
);
}
} else if (*pp1 == *pp2) {
/* constraint already imposed */
if ((*pp1)->klass() == NULL) {
(*pp1)->set_klass(klass);
! if (lt.is_enabled()) {
ResourceMark rm;
! lt.print("setting class object in existing constraint for"
" name: %s and loader %s",
class_name->as_C_string(),
SystemDictionary::loader_name(class_loader1())
);
}
*** 285,312 ****
// return true if the constraint was updated, false if the constraint is
// violated
bool LoaderConstraintTable::check_or_update(InstanceKlass* k,
Handle loader,
Symbol* name) {
LoaderConstraintEntry* p = *(find_loader_constraint(name, loader));
if (p && p->klass() != NULL && p->klass() != k) {
! if (log_is_enabled(Info, class, loader, constraints)) {
ResourceMark rm;
! outputStream* out = Log(class, loader, constraints)::info_stream();
! out->print_cr("constraint check failed for name %s, loader %s: "
"the presented class object differs from that stored",
name->as_C_string(),
SystemDictionary::loader_name(loader()));
}
return false;
} else {
if (p && p->klass() == NULL) {
p->set_klass(k);
! if (log_is_enabled(Info, class, loader, constraints)) {
ResourceMark rm;
! outputStream* out = Log(class, loader, constraints)::info_stream();
! out->print_cr("updating constraint for name %s, loader %s, "
"by setting class object",
name->as_C_string(),
SystemDictionary::loader_name(loader()));
}
}
--- 282,308 ----
// return true if the constraint was updated, false if the constraint is
// violated
bool LoaderConstraintTable::check_or_update(InstanceKlass* k,
Handle loader,
Symbol* name) {
+ LogTarget(Info, class, loader, constraints) lt;
LoaderConstraintEntry* p = *(find_loader_constraint(name, loader));
if (p && p->klass() != NULL && p->klass() != k) {
! if (lt.is_enabled()) {
ResourceMark rm;
! lt.print("constraint check failed for name %s, loader %s: "
"the presented class object differs from that stored",
name->as_C_string(),
SystemDictionary::loader_name(loader()));
}
return false;
} else {
if (p && p->klass() == NULL) {
p->set_klass(k);
! if (lt.is_enabled()) {
ResourceMark rm;
! lt.print("updating constraint for name %s, loader %s, "
"by setting class object",
name->as_C_string(),
SystemDictionary::loader_name(loader()));
}
}
*** 350,363 ****
InstanceKlass* klass) {
ensure_loader_constraint_capacity(p, 1);
int num = p->num_loaders();
p->set_loader(num, loader());
p->set_num_loaders(num + 1);
! if (log_is_enabled(Info, class, loader, constraints)) {
ResourceMark rm;
! outputStream* out = Log(class, loader, constraints)::info_stream();
! out->print_cr("extending constraint for name %s by adding loader[%d]: %s %s",
p->name()->as_C_string(),
num,
SystemDictionary::loader_name(loader()),
(p->klass() == NULL ? " and setting class object" : "")
);
--- 346,359 ----
InstanceKlass* klass) {
ensure_loader_constraint_capacity(p, 1);
int num = p->num_loaders();
p->set_loader(num, loader());
p->set_num_loaders(num + 1);
! LogTarget(Info, class, loader, constraints) lt;
! if (lt.is_enabled()) {
ResourceMark rm;
! lt.print("extending constraint for name %s by adding loader[%d]: %s %s",
p->name()->as_C_string(),
num,
SystemDictionary::loader_name(loader()),
(p->klass() == NULL ? " and setting class object" : "")
);
*** 390,412 ****
int num = p1->num_loaders();
p1->set_loader_data(num, p2->loader_data(i));
p1->set_num_loaders(num + 1);
}
! if (log_is_enabled(Info, class, loader, constraints)) {
ResourceMark rm;
! outputStream* out = Log(class, loader, constraints)::info_stream();
! out->print_cr("merged constraints for name %s, new loader list:",
p1->name()->as_C_string()
);
for (int i = 0; i < p1->num_loaders(); i++) {
! out->print_cr(" [%d]: %s", i,
p1->loader_data(i)->loader_name());
}
if (p1->klass() == NULL) {
! out->print_cr("... and setting class object");
}
}
// p1->klass() will hold NULL if klass, p2->klass(), and old
// p1->klass() are all NULL. In addition, all three must have
--- 386,408 ----
int num = p1->num_loaders();
p1->set_loader_data(num, p2->loader_data(i));
p1->set_num_loaders(num + 1);
}
! LogTarget(Info, class, loader, constraints) lt;
! if (lt.is_enabled()) {
ResourceMark rm;
! lt.print("merged constraints for name %s, new loader list:",
p1->name()->as_C_string()
);
for (int i = 0; i < p1->num_loaders(); i++) {
! lt.print(" [%d]: %s", i,
p1->loader_data(i)->loader_name());
}
if (p1->klass() == NULL) {
! lt.print("... and setting class object");
}
}
// p1->klass() will hold NULL if klass, p2->klass(), and old
// p1->klass() are all NULL. In addition, all three must have
< prev index next >