8194736: Refactor weak oops in ProtectionDomain table to use the Access API
authoreosterlund
Wed, 10 Jan 2018 22:40:47 +0100
changeset 48781 6ebef5cd0c8d
parent 48636 b96f03796580
child 48782 c823eca266c3
8194736: Refactor weak oops in ProtectionDomain table to use the Access API Reviewed-by: coleenp, pliden
src/hotspot/share/classfile/dictionary.cpp
src/hotspot/share/classfile/dictionary.hpp
src/hotspot/share/classfile/protectionDomainCache.cpp
src/hotspot/share/classfile/protectionDomainCache.hpp
--- 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