annotate src/share/vm/runtime/jniHandles.hpp @ 6862:8a5ea0a9ccc4

7127708: G1: change task num types from int to uint in concurrent mark Summary: Change the type of various task num fields, parameters etc to unsigned and rename them to be more consistent with the other collectors. Code changes were also reviewed by Vitaly Davidovich. Reviewed-by: johnc Contributed-by: Kaushik Srenevasan <kaushik@twitter.com>
author johnc
date Sat, 06 Oct 2012 01:17:44 -0700
parents da91efe96a93
children 63a4eb8bcd23
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6197
diff changeset
2 * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1536
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1536
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1536
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
25 #ifndef SHARE_VM_RUNTIME_JNIHANDLES_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #define SHARE_VM_RUNTIME_JNIHANDLES_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "runtime/handles.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "utilities/top.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30
0
a61af66fc99e Initial load
duke
parents:
diff changeset
31 class JNIHandleBlock;
a61af66fc99e Initial load
duke
parents:
diff changeset
32
a61af66fc99e Initial load
duke
parents:
diff changeset
33
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // Interface for creating and resolving local/global JNI handles
a61af66fc99e Initial load
duke
parents:
diff changeset
35
a61af66fc99e Initial load
duke
parents:
diff changeset
36 class JNIHandles : AllStatic {
a61af66fc99e Initial load
duke
parents:
diff changeset
37 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
39 static JNIHandleBlock* _global_handles; // First global handle block
a61af66fc99e Initial load
duke
parents:
diff changeset
40 static JNIHandleBlock* _weak_global_handles; // First weak global handle block
a61af66fc99e Initial load
duke
parents:
diff changeset
41 static oop _deleted_handle; // Sentinel marking deleted handles
a61af66fc99e Initial load
duke
parents:
diff changeset
42
a61af66fc99e Initial load
duke
parents:
diff changeset
43 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // Resolve handle into oop
a61af66fc99e Initial load
duke
parents:
diff changeset
45 inline static oop resolve(jobject handle);
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // Resolve externally provided handle into oop with some guards
a61af66fc99e Initial load
duke
parents:
diff changeset
47 inline static oop resolve_external_guard(jobject handle);
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // Resolve handle into oop, result guaranteed not to be null
a61af66fc99e Initial load
duke
parents:
diff changeset
49 inline static oop resolve_non_null(jobject handle);
a61af66fc99e Initial load
duke
parents:
diff changeset
50
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // Local handles
a61af66fc99e Initial load
duke
parents:
diff changeset
52 static jobject make_local(oop obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
53 static jobject make_local(JNIEnv* env, oop obj); // Fast version when env is known
a61af66fc99e Initial load
duke
parents:
diff changeset
54 static jobject make_local(Thread* thread, oop obj); // Even faster version when current thread is known
a61af66fc99e Initial load
duke
parents:
diff changeset
55 inline static void destroy_local(jobject handle);
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // Global handles
a61af66fc99e Initial load
duke
parents:
diff changeset
58 static jobject make_global(Handle obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
59 static void destroy_global(jobject handle);
a61af66fc99e Initial load
duke
parents:
diff changeset
60
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // Weak global handles
a61af66fc99e Initial load
duke
parents:
diff changeset
62 static jobject make_weak_global(Handle obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
63 static void destroy_weak_global(jobject handle);
a61af66fc99e Initial load
duke
parents:
diff changeset
64
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // Sentinel marking deleted handles in block. Note that we cannot store NULL as
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // the sentinel, since clearing weak global JNI refs are done by storing NULL in
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // the handle. The handle may not be reused before destroy_weak_global is called.
a61af66fc99e Initial load
duke
parents:
diff changeset
68 static oop deleted_handle() { return _deleted_handle; }
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // Initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
71 static void initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // Debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
74 static void print_on(outputStream* st);
a61af66fc99e Initial load
duke
parents:
diff changeset
75 static void print() { print_on(tty); }
a61af66fc99e Initial load
duke
parents:
diff changeset
76 static void verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
77 static bool is_local_handle(Thread* thread, jobject handle);
a61af66fc99e Initial load
duke
parents:
diff changeset
78 static bool is_frame_handle(JavaThread* thr, jobject obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
79 static bool is_global_handle(jobject handle);
a61af66fc99e Initial load
duke
parents:
diff changeset
80 static bool is_weak_global_handle(jobject handle);
a61af66fc99e Initial load
duke
parents:
diff changeset
81 static long global_handle_memory_usage();
a61af66fc99e Initial load
duke
parents:
diff changeset
82 static long weak_global_handle_memory_usage();
a61af66fc99e Initial load
duke
parents:
diff changeset
83
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // Garbage collection support(global handles only, local handles are traversed from thread)
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // Traversal of regular global handles
a61af66fc99e Initial load
duke
parents:
diff changeset
86 static void oops_do(OopClosure* f);
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // Traversal of weak global handles. Unreachable oops are cleared.
a61af66fc99e Initial load
duke
parents:
diff changeset
88 static void weak_oops_do(BoolObjectClosure* is_alive, OopClosure* f);
a61af66fc99e Initial load
duke
parents:
diff changeset
89 };
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
92
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // JNI handle blocks holding local/global JNI handles
a61af66fc99e Initial load
duke
parents:
diff changeset
94
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 1972
diff changeset
95 class JNIHandleBlock : public CHeapObj<mtInternal> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
96 friend class VMStructs;
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents: 917
diff changeset
97 friend class CppInterpreter;
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents: 917
diff changeset
98
0
a61af66fc99e Initial load
duke
parents:
diff changeset
99 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
100 enum SomeConstants {
a61af66fc99e Initial load
duke
parents:
diff changeset
101 block_size_in_oops = 32 // Number of handles per handle block
a61af66fc99e Initial load
duke
parents:
diff changeset
102 };
a61af66fc99e Initial load
duke
parents:
diff changeset
103
a61af66fc99e Initial load
duke
parents:
diff changeset
104 oop _handles[block_size_in_oops]; // The handles
a61af66fc99e Initial load
duke
parents:
diff changeset
105 int _top; // Index of next unused handle
a61af66fc99e Initial load
duke
parents:
diff changeset
106 JNIHandleBlock* _next; // Link to next block
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 // The following instance variables are only used by the first block in a chain.
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // Having two types of blocks complicates the code and the space overhead in negligble.
a61af66fc99e Initial load
duke
parents:
diff changeset
110 JNIHandleBlock* _last; // Last block in use
a61af66fc99e Initial load
duke
parents:
diff changeset
111 JNIHandleBlock* _pop_frame_link; // Block to restore on PopLocalFrame call
a61af66fc99e Initial load
duke
parents:
diff changeset
112 oop* _free_list; // Handle free list
a61af66fc99e Initial load
duke
parents:
diff changeset
113 int _allocate_before_rebuild; // Number of blocks to allocate before rebuilding free list
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
116 JNIHandleBlock* _block_list_link; // Link for list below
a61af66fc99e Initial load
duke
parents:
diff changeset
117 static JNIHandleBlock* _block_list; // List of all allocated blocks (for debugging only)
a61af66fc99e Initial load
duke
parents:
diff changeset
118 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 static JNIHandleBlock* _block_free_list; // Free list of currently unused blocks
a61af66fc99e Initial load
duke
parents:
diff changeset
121 static int _blocks_allocated; // For debugging/printing
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // Fill block with bad_handle values
a61af66fc99e Initial load
duke
parents:
diff changeset
124 void zap();
a61af66fc99e Initial load
duke
parents:
diff changeset
125
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents: 917
diff changeset
126 protected:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // No more handles in the both the current and following blocks
a61af66fc99e Initial load
duke
parents:
diff changeset
128 void clear() { _top = 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
129
1010
354d3184f6b2 6890308: integrate zero assembler hotspot changes
never
parents: 917
diff changeset
130 private:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // Free list computation
a61af66fc99e Initial load
duke
parents:
diff changeset
132 void rebuild_free_list();
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
135 // Handle allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
136 jobject allocate_handle(oop obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // Block allocation and block free list management
a61af66fc99e Initial load
duke
parents:
diff changeset
139 static JNIHandleBlock* allocate_block(Thread* thread = NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
140 static void release_block(JNIHandleBlock* block, Thread* thread = NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142 // JNI PushLocalFrame/PopLocalFrame support
a61af66fc99e Initial load
duke
parents:
diff changeset
143 JNIHandleBlock* pop_frame_link() const { return _pop_frame_link; }
a61af66fc99e Initial load
duke
parents:
diff changeset
144 void set_pop_frame_link(JNIHandleBlock* block) { _pop_frame_link = block; }
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // Stub generator support
a61af66fc99e Initial load
duke
parents:
diff changeset
147 static int top_offset_in_bytes() { return offset_of(JNIHandleBlock, _top); }
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // Garbage collection support
a61af66fc99e Initial load
duke
parents:
diff changeset
150 // Traversal of regular handles
a61af66fc99e Initial load
duke
parents:
diff changeset
151 void oops_do(OopClosure* f);
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // Traversal of weak handles. Unreachable oops are cleared.
a61af66fc99e Initial load
duke
parents:
diff changeset
153 void weak_oops_do(BoolObjectClosure* is_alive, OopClosure* f);
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 // Debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
156 bool chain_contains(jobject handle) const; // Does this block or following blocks contain handle
a61af66fc99e Initial load
duke
parents:
diff changeset
157 bool contains(jobject handle) const; // Does this block contain handle
a61af66fc99e Initial load
duke
parents:
diff changeset
158 int length() const; // Length of chain starting with this block
a61af66fc99e Initial load
duke
parents:
diff changeset
159 long memory_usage() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
160 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
161 static bool any_contains(jobject handle); // Does any block currently in use contain handle
a61af66fc99e Initial load
duke
parents:
diff changeset
162 static void print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
163 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
164 };
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 inline oop JNIHandles::resolve(jobject handle) {
a61af66fc99e Initial load
duke
parents:
diff changeset
168 oop result = (handle == NULL ? (oop)NULL : *(oop*)handle);
a61af66fc99e Initial load
duke
parents:
diff changeset
169 assert(result != NULL || (handle == NULL || !CheckJNICalls || is_weak_global_handle(handle)), "Invalid value read from jni handle");
a61af66fc99e Initial load
duke
parents:
diff changeset
170 assert(result != badJNIHandle, "Pointing to zapped jni handle area");
a61af66fc99e Initial load
duke
parents:
diff changeset
171 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
172 };
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174
a61af66fc99e Initial load
duke
parents:
diff changeset
175 inline oop JNIHandles::resolve_external_guard(jobject handle) {
a61af66fc99e Initial load
duke
parents:
diff changeset
176 if (handle == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
177 oop result = *(oop*)handle;
a61af66fc99e Initial load
duke
parents:
diff changeset
178 if (result == NULL || result == badJNIHandle) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
179 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
180 };
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182
a61af66fc99e Initial load
duke
parents:
diff changeset
183 inline oop JNIHandles::resolve_non_null(jobject handle) {
a61af66fc99e Initial load
duke
parents:
diff changeset
184 assert(handle != NULL, "JNI handle should not be null");
a61af66fc99e Initial load
duke
parents:
diff changeset
185 oop result = *(oop*)handle;
a61af66fc99e Initial load
duke
parents:
diff changeset
186 assert(result != NULL, "Invalid value read from jni handle");
a61af66fc99e Initial load
duke
parents:
diff changeset
187 assert(result != badJNIHandle, "Pointing to zapped jni handle area");
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // Don't let that private _deleted_handle object escape into the wild.
a61af66fc99e Initial load
duke
parents:
diff changeset
189 assert(result != deleted_handle(), "Used a deleted global handle.");
a61af66fc99e Initial load
duke
parents:
diff changeset
190 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
191 };
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193 inline void JNIHandles::destroy_local(jobject handle) {
a61af66fc99e Initial load
duke
parents:
diff changeset
194 if (handle != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
195 *((oop*)handle) = deleted_handle(); // Mark the handle as deleted, allocate will reuse it
a61af66fc99e Initial load
duke
parents:
diff changeset
196 }
a61af66fc99e Initial load
duke
parents:
diff changeset
197 }
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
198
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
199 #endif // SHARE_VM_RUNTIME_JNIHANDLES_HPP