src/share/vm/oops/cpCacheKlass.cpp

Mon, 09 Mar 2009 13:28:46 -0700

author
xdono
date
Mon, 09 Mar 2009 13:28:46 -0700
changeset 1014
0fbdb4381b99
parent 981
05c6d52fa7a9
child 1161
be93aad57795
permissions
-rw-r--r--

6814575: Update copyright year
Summary: Update copyright for files that have been modified in 2009, up to 03/09
Reviewed-by: katleman, tbell, ohair

     1 /*
     2  * Copyright 1998-2009 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
    20  * CA 95054 USA or visit www.sun.com if you need additional information or
    21  * have any questions.
    22  *
    23  */
    25 #include "incls/_precompiled.incl"
    26 #include "incls/_cpCacheKlass.cpp.incl"
    29 int constantPoolCacheKlass::oop_size(oop obj) const {
    30   assert(obj->is_constantPoolCache(), "must be constantPool");
    31   return constantPoolCacheOop(obj)->object_size();
    32 }
    35 constantPoolCacheOop constantPoolCacheKlass::allocate(int length,
    36                                                       bool is_conc_safe,
    37                                                       TRAPS) {
    38   // allocate memory
    39   int size = constantPoolCacheOopDesc::object_size(length);
    41   KlassHandle klass (THREAD, as_klassOop());
    43   // This is the original code.  The code from permanent_obj_allocate()
    44   // was in-lined to allow the setting of is_conc_safe before the klass
    45   // is installed.
    46   // constantPoolCacheOop cache = (constantPoolCacheOop)
    47   //   CollectedHeap::permanent_obj_allocate(klass, size, CHECK_NULL);
    49   oop obj = CollectedHeap::permanent_obj_allocate_no_klass_install(klass, size, CHECK_NULL);
    50   constantPoolCacheOop cache = (constantPoolCacheOop) obj;
    51   cache->set_is_conc_safe(is_conc_safe);
    52   // The store to is_conc_safe must be visible before the klass
    53   // is set.  This should be done safely because _is_conc_safe has
    54   // been declared volatile.  If there are any problems, consider adding
    55   // OrderAccess::storestore();
    56   CollectedHeap::post_allocation_install_obj_klass(klass, obj, size);
    57   NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value((HeapWord*) obj,
    58                                                               size));
    60   // The length field affects the size of the object.  The allocation
    61   // above allocates the correct size (see calculation of "size") but
    62   // the size() method of the constant pool cache oop will not reflect
    63   // that size until the correct length is set.
    64   cache->set_length(length);
    66   // The store of the length must be visible before is_conc_safe is
    67   // set to a safe state.
    68   // This should be done safely because _is_conc_safe has
    69   // been declared volatile.  If there are any problems, consider adding
    70   // OrderAccess::storestore();
    71   cache->set_is_conc_safe(methodOopDesc::IsSafeConc);
    72   cache->set_constant_pool(NULL);
    73   return cache;
    74 }
    76 klassOop constantPoolCacheKlass::create_klass(TRAPS) {
    77   constantPoolCacheKlass o;
    78   KlassHandle h_this_klass(THREAD, Universe::klassKlassObj());
    79   KlassHandle k = base_create_klass(h_this_klass, header_size(), o.vtbl_value(), CHECK_NULL);
    80   // Make sure size calculation is right
    81   assert(k()->size() == align_object_size(header_size()), "wrong size for object");
    82   java_lang_Class::create_mirror(k, CHECK_NULL); // Allocate mirror
    83   return k();
    84 }
    87 void constantPoolCacheKlass::oop_follow_contents(oop obj) {
    88   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
    89   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
    90   // Performance tweak: We skip iterating over the klass pointer since we
    91   // know that Universe::constantPoolCacheKlassObj never moves.
    92   // gc of constant pool cache instance variables
    93   MarkSweep::mark_and_push((oop*)cache->constant_pool_addr());
    94   // gc of constant pool cache entries
    95   int i = cache->length();
    96   while (i-- > 0) cache->entry_at(i)->follow_contents();
    97 }
    99 #ifndef SERIALGC
   100 void constantPoolCacheKlass::oop_follow_contents(ParCompactionManager* cm,
   101                                                  oop obj) {
   102   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
   103   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
   104   // Performance tweak: We skip iterating over the klass pointer since we
   105   // know that Universe::constantPoolCacheKlassObj never moves.
   106   // gc of constant pool cache instance variables
   107   PSParallelCompact::mark_and_push(cm, (oop*)cache->constant_pool_addr());
   108   // gc of constant pool cache entries
   109   int i = cache->length();
   110   while (i-- > 0) cache->entry_at(i)->follow_contents(cm);
   111 }
   112 #endif // SERIALGC
   115 int constantPoolCacheKlass::oop_oop_iterate(oop obj, OopClosure* blk) {
   116   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
   117   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
   118   // Get size before changing pointers.
   119   // Don't call size() or oop_size() since that is a virtual call.
   120   int size = cache->object_size();
   121   // Performance tweak: We skip iterating over the klass pointer since we
   122   // know that Universe::constantPoolCacheKlassObj never moves.
   123   // iteration over constant pool cache instance variables
   124   blk->do_oop((oop*)cache->constant_pool_addr());
   125   // iteration over constant pool cache entries
   126   for (int i = 0; i < cache->length(); i++) cache->entry_at(i)->oop_iterate(blk);
   127   return size;
   128 }
   131 int constantPoolCacheKlass::oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegion mr) {
   132   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
   133   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
   134   // Get size before changing pointers.
   135   // Don't call size() or oop_size() since that is a virtual call.
   136   int size = cache->object_size();
   137   // Performance tweak: We skip iterating over the klass pointer since we
   138   // know that Universe::constantPoolCacheKlassObj never moves.
   139   // iteration over constant pool cache instance variables
   140   oop* addr = (oop*)cache->constant_pool_addr();
   141   if (mr.contains(addr)) blk->do_oop(addr);
   142   // iteration over constant pool cache entries
   143   for (int i = 0; i < cache->length(); i++) cache->entry_at(i)->oop_iterate_m(blk, mr);
   144   return size;
   145 }
   147 int constantPoolCacheKlass::oop_adjust_pointers(oop obj) {
   148   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
   149   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
   150   // Get size before changing pointers.
   151   // Don't call size() or oop_size() since that is a virtual call.
   152   int size = cache->object_size();
   153   // Performance tweak: We skip iterating over the klass pointer since we
   154   // know that Universe::constantPoolCacheKlassObj never moves.
   155   // Iteration over constant pool cache instance variables
   156   MarkSweep::adjust_pointer((oop*)cache->constant_pool_addr());
   157   // iteration over constant pool cache entries
   158   for (int i = 0; i < cache->length(); i++)
   159     cache->entry_at(i)->adjust_pointers();
   160   return size;
   161 }
   163 bool constantPoolCacheKlass::oop_is_conc_safe(oop obj) const {
   164   assert(obj->is_constantPoolCache(), "should be constant pool");
   165   return constantPoolCacheOop(obj)->is_conc_safe();
   166 }
   168 #ifndef SERIALGC
   169 void constantPoolCacheKlass::oop_copy_contents(PSPromotionManager* pm,
   170                                                oop obj) {
   171   assert(obj->is_constantPoolCache(), "should be constant pool");
   172 }
   174 void constantPoolCacheKlass::oop_push_contents(PSPromotionManager* pm,
   175                                                oop obj) {
   176   assert(obj->is_constantPoolCache(), "should be constant pool");
   177 }
   179 int
   180 constantPoolCacheKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
   181   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
   182   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
   184   // Iteration over constant pool cache instance variables
   185   PSParallelCompact::adjust_pointer((oop*)cache->constant_pool_addr());
   187   // iteration over constant pool cache entries
   188   for (int i = 0; i < cache->length(); ++i) {
   189     cache->entry_at(i)->update_pointers();
   190   }
   192   return cache->object_size();
   193 }
   195 int
   196 constantPoolCacheKlass::oop_update_pointers(ParCompactionManager* cm, oop obj,
   197                                             HeapWord* beg_addr,
   198                                             HeapWord* end_addr) {
   199   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
   200   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
   202   // Iteration over constant pool cache instance variables
   203   oop* p;
   204   p = (oop*)cache->constant_pool_addr();
   205   PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
   207   // Iteration over constant pool cache entries
   208   for (int i = 0; i < cache->length(); ++i) {
   209     cache->entry_at(i)->update_pointers(beg_addr, end_addr);
   210   }
   211   return cache->object_size();
   212 }
   213 #endif // SERIALGC
   215 #ifndef PRODUCT
   217 void constantPoolCacheKlass::oop_print_on(oop obj, outputStream* st) {
   218   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
   219   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
   220   // super print
   221   Klass::oop_print_on(obj, st);
   222   // print constant pool cache entries
   223   for (int i = 0; i < cache->length(); i++) cache->entry_at(i)->print(st, i);
   224 }
   226 #endif
   228 void constantPoolCacheKlass::oop_verify_on(oop obj, outputStream* st) {
   229   guarantee(obj->is_constantPoolCache(), "obj must be constant pool cache");
   230   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
   231   // super verify
   232   Klass::oop_verify_on(obj, st);
   233   // print constant pool cache entries
   234   for (int i = 0; i < cache->length(); i++) cache->entry_at(i)->verify(st);
   235 }
   238 const char* constantPoolCacheKlass::internal_name() const {
   239   return "{constant pool cache}";
   240 }

mercurial