hotspot/src/share/vm/oops/methodDataKlass.hpp
author ysr
Thu, 03 Dec 2009 15:01:57 -0800
changeset 4461 c17c526d36ef
parent 1 489c9b5090e2
child 4584 e2a449e8cc6f
permissions -rw-r--r--
6906727: UseCompressedOops: some card-marking fixes related to object arrays Summary: Introduced a new write_ref_array(HeapWords* start, size_t count) method that does the requisite MemRegion range calculation so (some of the) clients of the erstwhile write_ref_array(MemRegion mr) do not need to worry. This removed all external uses of array_size(), which was also simplified and made private. Asserts were added to catch other possible issues. Further, less essential, fixes stemming from this investigation are deferred to CR 6904516 (to follow shortly in hs17). Reviewed-by: kvn, coleenp, jmasa
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
     2
 * Copyright 2000-2006 Sun Microsystems, Inc.  All Rights Reserved.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    19
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    20
 * CA 95054 USA or visit www.sun.com if you need additional information or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    21
 * have any questions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
489c9b5090e2 Initial load
duke
parents:
diff changeset
    25
// a methodDataKlass is the klass of a methodDataOop
489c9b5090e2 Initial load
duke
parents:
diff changeset
    26
489c9b5090e2 Initial load
duke
parents:
diff changeset
    27
class methodDataKlass : public Klass {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    28
  friend class VMStructs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    29
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    30
  juint _alloc_size; // allocation profiling support
489c9b5090e2 Initial load
duke
parents:
diff changeset
    31
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    32
  // Testing
489c9b5090e2 Initial load
duke
parents:
diff changeset
    33
  bool oop_is_methodData() const { return true; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
  // Allocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
  DEFINE_ALLOCATE_PERMANENT(methodDataKlass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
  methodDataOop allocate(methodHandle method, TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
  static klassOop create_klass(TRAPS);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
  // Sizing
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
  int oop_size(oop obj) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
  int klass_oop_size() const { return object_size(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
  // Casting from klassOop
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
  static methodDataKlass* cast(klassOop k) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
    assert(k->klass_part()->oop_is_methodData(), "cast to methodDataKlass");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
    return (methodDataKlass*) k->klass_part();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
  // Sizing
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
  static int header_size() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
    return oopDesc::header_size() + sizeof(methodDataKlass)/wordSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
  int object_size() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
    return align_object_size(header_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
  // Garbage collection
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
  void oop_follow_contents(oop obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
  int  oop_adjust_pointers(oop obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
  bool oop_is_parsable(oop obj) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
  // Parallel Scavenge and Parallel Old
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
  PARALLEL_GC_DECLS
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  // Allocation profiling support
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  juint alloc_size() const { return _alloc_size; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  void  set_alloc_size(juint n) { _alloc_size = n; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  // Iterators
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  int oop_oop_iterate(oop obj, OopClosure* blk);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  int oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegion mr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  // Printing
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  void oop_print_on      (oop obj, outputStream* st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  void oop_print_value_on(oop obj, outputStream* st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
#endif // !PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  // Verify operations
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  const char* internal_name() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  void oop_verify_on(oop obj, outputStream* st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
};