1 /*
   2  * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 #include "precompiled.hpp"
  26 #include "classfile/javaClasses.hpp"
  27 #include "gc_implementation/shared/markSweep.inline.hpp"
  28 #include "gc_interface/collectedHeap.hpp"
  29 #include "interpreter/bytecodes.hpp"
  30 #include "memory/genOopClosures.inline.hpp"
  31 #include "memory/permGen.hpp"
  32 #include "oops/constantPoolOop.hpp"
  33 #include "oops/cpCacheKlass.hpp"
  34 #include "oops/oop.inline.hpp"
  35 #include "runtime/handles.inline.hpp"
  36 #ifndef SERIALGC
  37 #include "gc_implementation/parNew/parOopClosures.inline.hpp"
  38 #include "gc_implementation/parallelScavenge/psPromotionManager.inline.hpp"
  39 #include "gc_implementation/parallelScavenge/psScavenge.inline.hpp"
  40 #include "memory/cardTableRS.hpp"
  41 #include "oops/oop.pcgc.inline.hpp"
  42 #endif
  43 
  44 
  45 int constantPoolCacheKlass::oop_size(oop obj) const {
  46   assert(obj->is_constantPoolCache(), "must be constantPool");
  47   return constantPoolCacheOop(obj)->object_size();
  48 }
  49 
  50 
  51 constantPoolCacheOop constantPoolCacheKlass::allocate(int length,
  52                                                       TRAPS) {
  53   // allocate memory
  54   int size = constantPoolCacheOopDesc::object_size(length);
  55 
  56   KlassHandle klass (THREAD, as_klassOop());
  57 
  58   // Commented out below is the original code.  The code from
  59   // permanent_obj_allocate() was in-lined so that we could
  60   // set the _length field, necessary to correctly compute its
  61   // size(), before setting its klass word further below.
  62   // constantPoolCacheOop cache = (constantPoolCacheOop)
  63   //   CollectedHeap::permanent_obj_allocate(klass, size, CHECK_NULL);
  64 
  65   oop obj = CollectedHeap::permanent_obj_allocate_no_klass_install(klass, size, CHECK_NULL);
  66   NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value((HeapWord*) obj,
  67                                                               size));
  68   constantPoolCacheOop cache = (constantPoolCacheOop) obj;
  69   assert(!UseConcMarkSweepGC || obj->klass_or_null() == NULL,
  70          "klass should be NULL here when using CMS");
  71   cache->set_length(length);  // should become visible before klass is set below.
  72   cache->set_constant_pool(NULL);
  73 
  74   OrderAccess::storestore();
  75   obj->set_klass(klass());
  76   assert(cache->size() == size, "Incorrect cache->size()");
  77   return cache;
  78 }
  79 
  80 klassOop constantPoolCacheKlass::create_klass(TRAPS) {
  81   constantPoolCacheKlass o;
  82   KlassHandle h_this_klass(THREAD, Universe::klassKlassObj());
  83   KlassHandle k = base_create_klass(h_this_klass, header_size(), o.vtbl_value(), CHECK_NULL);
  84   // Make sure size calculation is right
  85   assert(k()->size() == align_object_size(header_size()), "wrong size for object");
  86   java_lang_Class::create_mirror(k, CHECK_NULL); // Allocate mirror
  87   return k();
  88 }
  89 
  90 
  91 void constantPoolCacheKlass::oop_follow_contents(oop obj) {
  92   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
  93   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
  94   // Performance tweak: We skip iterating over the klass pointer since we
  95   // know that Universe::constantPoolCacheKlassObj never moves.
  96   // gc of constant pool cache instance variables
  97   MarkSweep::mark_and_push((oop*)cache->constant_pool_addr());
  98   // gc of constant pool cache entries
  99   int i = cache->length();
 100   while (i-- > 0) cache->entry_at(i)->follow_contents();
 101 }
 102 
 103 #ifndef SERIALGC
 104 void constantPoolCacheKlass::oop_follow_contents(ParCompactionManager* cm,
 105                                                  oop obj) {
 106   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
 107   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
 108   // Performance tweak: We skip iterating over the klass pointer since we
 109   // know that Universe::constantPoolCacheKlassObj never moves.
 110   // gc of constant pool cache instance variables
 111   PSParallelCompact::mark_and_push(cm, (oop*)cache->constant_pool_addr());
 112   // gc of constant pool cache entries
 113   int i = cache->length();
 114   while (i-- > 0) cache->entry_at(i)->follow_contents(cm);
 115 }
 116 #endif // SERIALGC
 117 
 118 
 119 int constantPoolCacheKlass::oop_oop_iterate(oop obj, OopClosure* blk) {
 120   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
 121   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
 122   // Get size before changing pointers.
 123   // Don't call size() or oop_size() since that is a virtual call.
 124   int size = cache->object_size();
 125   // Performance tweak: We skip iterating over the klass pointer since we
 126   // know that Universe::constantPoolCacheKlassObj never moves.
 127   // iteration over constant pool cache instance variables
 128   blk->do_oop((oop*)cache->constant_pool_addr());
 129   // iteration over constant pool cache entries
 130   for (int i = 0; i < cache->length(); i++) cache->entry_at(i)->oop_iterate(blk);
 131   return size;
 132 }
 133 
 134 
 135 int constantPoolCacheKlass::oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegion mr) {
 136   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
 137   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
 138   // Get size before changing pointers.
 139   // Don't call size() or oop_size() since that is a virtual call.
 140   int size = cache->object_size();
 141   // Performance tweak: We skip iterating over the klass pointer since we
 142   // know that Universe::constantPoolCacheKlassObj never moves.
 143   // iteration over constant pool cache instance variables
 144   oop* addr = (oop*)cache->constant_pool_addr();
 145   if (mr.contains(addr)) blk->do_oop(addr);
 146   // iteration over constant pool cache entries
 147   for (int i = 0; i < cache->length(); i++) cache->entry_at(i)->oop_iterate_m(blk, mr);
 148   return size;
 149 }
 150 
 151 int constantPoolCacheKlass::oop_adjust_pointers(oop obj) {
 152   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
 153   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
 154   // Get size before changing pointers.
 155   // Don't call size() or oop_size() since that is a virtual call.
 156   int size = cache->object_size();
 157   // Performance tweak: We skip iterating over the klass pointer since we
 158   // know that Universe::constantPoolCacheKlassObj never moves.
 159   // Iteration over constant pool cache instance variables
 160   MarkSweep::adjust_pointer((oop*)cache->constant_pool_addr());
 161   // iteration over constant pool cache entries
 162   for (int i = 0; i < cache->length(); i++)
 163     cache->entry_at(i)->adjust_pointers();
 164   return size;
 165 }
 166 
 167 #ifndef SERIALGC
 168 void constantPoolCacheKlass::oop_push_contents(PSPromotionManager* pm,
 169                                                oop obj) {
 170   assert(obj->is_constantPoolCache(), "should be constant pool");
 171   if (ScavengeRootsInCode) {
 172     constantPoolCacheOop cache = (constantPoolCacheOop)obj;
 173     // during a scavenge, it is safe to inspect my pool, since it is perm
 174     constantPoolOop pool = cache->constant_pool();
 175     assert(pool->is_constantPool(), "should be constant pool");
 176     for (int i = 0; i < cache->length(); i++) {
 177       ConstantPoolCacheEntry* e = cache->entry_at(i);
 178       oop* p = (oop*)&e->_f1;
 179       if (PSScavenge::should_scavenge(p))
 180         pm->claim_or_forward_depth(p);
 181       assert(!(e->is_vfinal() && PSScavenge::should_scavenge((oop*)&e->_f2)),
 182              "no live oops here");
 183     }
 184   }
 185 }
 186 
 187 int
 188 constantPoolCacheKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
 189   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
 190   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
 191 
 192   // Iteration over constant pool cache instance variables
 193   PSParallelCompact::adjust_pointer((oop*)cache->constant_pool_addr());
 194 
 195   // iteration over constant pool cache entries
 196   for (int i = 0; i < cache->length(); ++i) {
 197     cache->entry_at(i)->update_pointers();
 198   }
 199 
 200   return cache->object_size();
 201 }
 202 #endif // SERIALGC
 203 
 204 void constantPoolCacheKlass::oop_print_on(oop obj, outputStream* st) {
 205   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
 206   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
 207   // super print
 208   Klass::oop_print_on(obj, st);
 209   // print constant pool cache entries
 210   for (int i = 0; i < cache->length(); i++) cache->entry_at(i)->print(st, i);
 211 }
 212 
 213 void constantPoolCacheKlass::oop_print_value_on(oop obj, outputStream* st) {
 214   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
 215   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
 216   st->print("cache [%d]", cache->length());
 217   cache->print_address_on(st);
 218   st->print(" for ");
 219   cache->constant_pool()->print_value_on(st);
 220 }
 221 
 222 void constantPoolCacheKlass::oop_verify_on(oop obj, outputStream* st) {
 223   guarantee(obj->is_constantPoolCache(), "obj must be constant pool cache");
 224   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
 225   // super verify
 226   Klass::oop_verify_on(obj, st);
 227   // print constant pool cache entries
 228   for (int i = 0; i < cache->length(); i++) cache->entry_at(i)->verify(st);
 229 }
 230 
 231 
 232 const char* constantPoolCacheKlass::internal_name() const {
 233   return "{constant pool cache}";
 234 }