annotate src/share/vm/prims/jvmtiRawMonitor.hpp @ 3249:e1162778c1c8

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
author johnc
date Thu, 07 Apr 2011 09:53:20 -0700
parents f95d63e2154a
children 8b46b0196eb0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1878
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
1 /*
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1878
diff changeset
2 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
1878
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
4 *
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
7 * published by the Free Software Foundation.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
8 *
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
13 * accompanied this code).
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
14 *
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
18 *
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
21 * questions.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
22 *
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
23 */
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1878
diff changeset
25 #ifndef SHARE_VM_PRIMS_JVMTIRAWMONITOR_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1878
diff changeset
26 #define SHARE_VM_PRIMS_JVMTIRAWMONITOR_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1878
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1878
diff changeset
28 #ifndef JVMTI_KERNEL
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1878
diff changeset
29 #include "runtime/objectMonitor.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1878
diff changeset
30 #include "utilities/growableArray.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1878
diff changeset
31 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1878
diff changeset
32
1878
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
33 //
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
34 // class JvmtiRawMonitor
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
35 //
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
36 // Used by JVMTI methods: All RawMonitor methods (CreateRawMonitor, EnterRawMonitor, etc.)
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
37 //
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
38 // Wrapper for ObjectMonitor class that saves the Monitor's name
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
39 //
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
40
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
41 class JvmtiRawMonitor : public ObjectMonitor {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
42 private:
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
43 int _magic;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
44 char * _name;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
45 // JVMTI_RM_MAGIC is set in contructor and unset in destructor.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
46 enum { JVMTI_RM_MAGIC = (int)(('T' << 24) | ('I' << 16) | ('R' << 8) | 'M') };
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
47
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
48 int SimpleEnter (Thread * Self) ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
49 int SimpleExit (Thread * Self) ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
50 int SimpleWait (Thread * Self, jlong millis) ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
51 int SimpleNotify (Thread * Self, bool All) ;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
52
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
53 public:
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
54 JvmtiRawMonitor(const char *name);
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
55 ~JvmtiRawMonitor();
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
56 int raw_enter(TRAPS);
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
57 int raw_exit(TRAPS);
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
58 int raw_wait(jlong millis, bool interruptable, TRAPS);
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
59 int raw_notify(TRAPS);
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
60 int raw_notifyAll(TRAPS);
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
61 int magic() { return _magic; }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
62 const char *get_name() { return _name; }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
63 bool is_valid();
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
64 };
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
65
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
66 // Onload pending raw monitors
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
67 // Class is used to cache onload or onstart monitor enter
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
68 // which will transition into real monitor when
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
69 // VM is fully initialized.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
70 class JvmtiPendingMonitors : public AllStatic {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
71
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
72 private:
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
73 static GrowableArray<JvmtiRawMonitor*> *_monitors; // Cache raw monitor enter
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
74
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
75 inline static GrowableArray<JvmtiRawMonitor*>* monitors() { return _monitors; }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
76
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
77 static void dispose() {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
78 delete monitors();
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
79 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
80
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
81 public:
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
82 static void enter(JvmtiRawMonitor *monitor) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
83 monitors()->append(monitor);
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
84 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
85
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
86 static int count() {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
87 return monitors()->length();
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
88 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
89
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
90 static void destroy(JvmtiRawMonitor *monitor) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
91 while (monitors()->contains(monitor)) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
92 monitors()->remove(monitor);
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
93 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
94 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
95
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
96 // Return false if monitor is not found in the list.
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
97 static bool exit(JvmtiRawMonitor *monitor) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
98 if (monitors()->contains(monitor)) {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
99 monitors()->remove(monitor);
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
100 return true;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
101 } else {
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
102 return false;
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
103 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
104 }
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
105
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
106 static void transition_raw_monitors();
fa83ab460c54 6988353: refactor contended sync subsystem
acorn
parents:
diff changeset
107 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1878
diff changeset
108
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1878
diff changeset
109 #endif // SHARE_VM_PRIMS_JVMTIRAWMONITOR_HPP