8194736: Refactor weak oops in ProtectionDomain table to use the Access API
Reviewed-by: coleenp, pliden
--- a/src/hotspot/share/classfile/dictionary.cpp Thu Jan 11 21:49:51 2018 -0500
+++ b/src/hotspot/share/classfile/dictionary.cpp Wed Jan 10 22:40:47 2018 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2018, 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
@@ -167,7 +167,7 @@
for (ProtectionDomainEntry* current = pd_set_acquire();
current != NULL;
current = current->next()) {
- if (current->protection_domain() == protection_domain) {
+ if (current->object_no_keepalive() == protection_domain) {
in_pd_set = true;
break;
}
@@ -187,7 +187,7 @@
for (ProtectionDomainEntry* current = pd_set_acquire();
current != NULL;
current = current->next()) {
- if (current->protection_domain() == protection_domain) return true;
+ if (current->object_no_keepalive() == protection_domain) return true;
}
return false;
}
--- a/src/hotspot/share/classfile/dictionary.hpp Thu Jan 11 21:49:51 2018 -0500
+++ b/src/hotspot/share/classfile/dictionary.hpp Wed Jan 10 22:40:47 2018 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2018, 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
@@ -189,7 +189,7 @@
for (ProtectionDomainEntry* current = pd_set(); // accessed at a safepoint
current != NULL;
current = current->_next) {
- current->_pd_cache->protection_domain()->verify();
+ current->_pd_cache->object_no_keepalive()->verify();
}
}
--- a/src/hotspot/share/classfile/protectionDomainCache.cpp Thu Jan 11 21:49:51 2018 -0500
+++ b/src/hotspot/share/classfile/protectionDomainCache.cpp Wed Jan 10 22:40:47 2018 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2018, 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
@@ -52,14 +52,14 @@
ProtectionDomainCacheEntry** p = bucket_addr(i);
ProtectionDomainCacheEntry* entry = bucket(i);
while (entry != NULL) {
- if (is_alive->do_object_b(entry->literal())) {
+ if (is_alive->do_object_b(entry->object_no_keepalive())) {
p = entry->next_addr();
} else {
LogTarget(Debug, protectiondomain) lt;
if (lt.is_enabled()) {
LogStream ls(lt);
ls.print("protection domain unlinked: ");
- entry->literal()->print_value_on(&ls);
+ entry->object_no_keepalive()->print_value_on(&ls);
ls.cr();
}
*p = entry->next();
@@ -87,7 +87,7 @@
for (ProtectionDomainCacheEntry* probe = bucket(index);
probe != NULL;
probe = probe->next()) {
- st->print_cr("%4d: protection_domain: " PTR_FORMAT, index, p2i(probe->literal()));
+ st->print_cr("%4d: protection_domain: " PTR_FORMAT, index, p2i(probe->object_no_keepalive()));
}
}
}
@@ -96,8 +96,27 @@
verify_table<ProtectionDomainCacheEntry>("Protection Domain Table");
}
+oop ProtectionDomainCacheEntry::object() {
+ return RootAccess<ON_PHANTOM_OOP_REF>::oop_load(literal_addr());
+}
+
+oop ProtectionDomainEntry::object() {
+ return _pd_cache->object();
+}
+
+// The object_no_keepalive() call peeks at the phantomly reachable oop without
+// keeping it alive. This is okay to do in the VM thread state if it is not
+// leaked out to become strongly reachable.
+oop ProtectionDomainCacheEntry::object_no_keepalive() {
+ return RootAccess<ON_PHANTOM_OOP_REF | AS_NO_KEEPALIVE>::oop_load(literal_addr());
+}
+
+oop ProtectionDomainEntry::object_no_keepalive() {
+ return _pd_cache->object_no_keepalive();
+}
+
void ProtectionDomainCacheEntry::verify() {
- guarantee(oopDesc::is_oop(literal()), "must be an oop");
+ guarantee(oopDesc::is_oop(object_no_keepalive()), "must be an oop");
}
ProtectionDomainCacheEntry* ProtectionDomainCacheTable::get(Handle protection_domain) {
@@ -113,7 +132,7 @@
ProtectionDomainCacheEntry* ProtectionDomainCacheTable::find_entry(int index, Handle protection_domain) {
for (ProtectionDomainCacheEntry* e = bucket(index); e != NULL; e = e->next()) {
- if (e->protection_domain() == protection_domain()) {
+ if (e->object_no_keepalive() == protection_domain()) {
return e;
}
}
--- a/src/hotspot/share/classfile/protectionDomainCache.hpp Thu Jan 11 21:49:51 2018 -0500
+++ b/src/hotspot/share/classfile/protectionDomainCache.hpp Wed Jan 10 22:40:47 2018 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2018, 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
@@ -37,7 +37,8 @@
class ProtectionDomainCacheEntry : public HashtableEntry<oop, mtClass> {
friend class VMStructs;
public:
- oop protection_domain() { return literal(); }
+ oop object();
+ oop object_no_keepalive();
ProtectionDomainCacheEntry* next() {
return (ProtectionDomainCacheEntry*)HashtableEntry<oop, mtClass>::next();
@@ -112,6 +113,7 @@
}
ProtectionDomainEntry* next() { return _next; }
- oop protection_domain() { return _pd_cache->protection_domain(); }
+ oop object();
+ oop object_no_keepalive();
};
#endif // SHARE_VM_CLASSFILE_PROTECTIONDOMAINCACHE_HPP