Thu, 07 Apr 2011 09:53:20 -0700
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