src/share/vm/oops/klassOop.hpp

Thu, 07 Apr 2011 09:53:20 -0700

author
johnc
date
Thu, 07 Apr 2011 09:53:20 -0700
changeset 2781
e1162778c1c8
parent 2658
c7f3d0b4570f
child 3131
b0efc7ee3b31
permissions
-rw-r--r--

7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
Summary: A referent object that is only weakly reachable at the start of concurrent marking but is re-attached to the strongly reachable object graph during marking may not be marked as live. This can cause the reference object to be processed prematurely and leave dangling pointers to the referent object. Implement a read barrier for the java.lang.ref.Reference::referent field by intrinsifying the Reference.get() method, and intercepting accesses though JNI, reflection, and Unsafe, so that when a non-null referent object is read it is also logged in an SATB buffer.
Reviewed-by: kvn, iveresov, never, tonyp, dholmes

     1 /*
     2  * Copyright (c) 1997, 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  */
    25 #ifndef SHARE_VM_OOPS_KLASSOOP_HPP
    26 #define SHARE_VM_OOPS_KLASSOOP_HPP
    28 #include "oops/oop.hpp"
    30 // A klassOop is the C++ equivalent of a Java class.
    31 // Part of a klassOopDesc is a Klass which handle the
    32 // dispatching for the C++ method calls.
    34 //  klassOop object layout:
    35 //    [header     ]
    36 //    [klass_field]
    37 //    [KLASS      ]
    39 class klassOopDesc : public oopDesc {
    40  public:
    41   // size operation
    42   static int header_size()                       { return sizeof(klassOopDesc)/HeapWordSize; }
    44   // support for code generation
    45   static int klass_part_offset_in_bytes()        { return sizeof(klassOopDesc); }
    47   // returns the Klass part containing dispatching behavior
    48   Klass* klass_part() const                      { return (Klass*)((address)this + klass_part_offset_in_bytes()); }
    50   // Convenience wrapper
    51   inline oop java_mirror() const;
    53  private:
    54   // These have no implementation since klassOop should never be accessed in this fashion
    55   oop obj_field(int offset) const;
    56   void obj_field_put(int offset, oop value);
    57   void obj_field_raw_put(int offset, oop value);
    59   jbyte byte_field(int offset) const;
    60   void byte_field_put(int offset, jbyte contents);
    62   jchar char_field(int offset) const;
    63   void char_field_put(int offset, jchar contents);
    65   jboolean bool_field(int offset) const;
    66   void bool_field_put(int offset, jboolean contents);
    68   jint int_field(int offset) const;
    69   void int_field_put(int offset, jint contents);
    71   jshort short_field(int offset) const;
    72   void short_field_put(int offset, jshort contents);
    74   jlong long_field(int offset) const;
    75   void long_field_put(int offset, jlong contents);
    77   jfloat float_field(int offset) const;
    78   void float_field_put(int offset, jfloat contents);
    80   jdouble double_field(int offset) const;
    81   void double_field_put(int offset, jdouble contents);
    83   address address_field(int offset) const;
    84   void address_field_put(int offset, address contents);
    86   oop obj_field_acquire(int offset) const;
    87   void release_obj_field_put(int offset, oop value);
    89   jbyte byte_field_acquire(int offset) const;
    90   void release_byte_field_put(int offset, jbyte contents);
    92   jchar char_field_acquire(int offset) const;
    93   void release_char_field_put(int offset, jchar contents);
    95   jboolean bool_field_acquire(int offset) const;
    96   void release_bool_field_put(int offset, jboolean contents);
    98   jint int_field_acquire(int offset) const;
    99   void release_int_field_put(int offset, jint contents);
   101   jshort short_field_acquire(int offset) const;
   102   void release_short_field_put(int offset, jshort contents);
   104   jlong long_field_acquire(int offset) const;
   105   void release_long_field_put(int offset, jlong contents);
   107   jfloat float_field_acquire(int offset) const;
   108   void release_float_field_put(int offset, jfloat contents);
   110   jdouble double_field_acquire(int offset) const;
   111   void release_double_field_put(int offset, jdouble contents);
   113   address address_field_acquire(int offset) const;
   114   void release_address_field_put(int offset, address contents);
   115 };
   117 #endif // SHARE_VM_OOPS_KLASSOOP_HPP

mercurial