167 return MemTracker::wbtest_wait_for_data_merge(); |
169 return MemTracker::wbtest_wait_for_data_merge(); |
168 WB_END |
170 WB_END |
169 |
171 |
170 #endif // INCLUDE_NMT |
172 #endif // INCLUDE_NMT |
171 |
173 |
|
174 static jmethodID reflected_method_to_jmid(JavaThread* thread, JNIEnv* env, jobject method) { |
|
175 assert(method != NULL, "method should not be null"); |
|
176 ThreadToNativeFromVM ttn(thread); |
|
177 return env->FromReflectedMethod(method); |
|
178 } |
|
179 |
|
180 WB_ENTRY(void, WB_DeoptimizeAll(JNIEnv* env, jobject o)) |
|
181 MutexLockerEx mu(Compile_lock); |
|
182 CodeCache::mark_all_nmethods_for_deoptimization(); |
|
183 VM_Deoptimize op; |
|
184 VMThread::execute(&op); |
|
185 WB_END |
|
186 |
|
187 WB_ENTRY(jint, WB_DeoptimizeMethod(JNIEnv* env, jobject o, jobject method)) |
|
188 jmethodID jmid = reflected_method_to_jmid(thread, env, method); |
|
189 MutexLockerEx mu(Compile_lock); |
|
190 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); |
|
191 int result = 0; |
|
192 nmethod* code = mh->code(); |
|
193 if (code != NULL) { |
|
194 code->mark_for_deoptimization(); |
|
195 ++result; |
|
196 } |
|
197 result += CodeCache::mark_for_deoptimization(mh()); |
|
198 if (result > 0) { |
|
199 VM_Deoptimize op; |
|
200 VMThread::execute(&op); |
|
201 } |
|
202 return result; |
|
203 WB_END |
|
204 |
|
205 WB_ENTRY(jboolean, WB_IsMethodCompiled(JNIEnv* env, jobject o, jobject method)) |
|
206 jmethodID jmid = reflected_method_to_jmid(thread, env, method); |
|
207 MutexLockerEx mu(Compile_lock); |
|
208 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); |
|
209 nmethod* code = mh->code(); |
|
210 if (code == NULL) { |
|
211 return JNI_FALSE; |
|
212 } |
|
213 return (code->is_alive() && !code->is_marked_for_deoptimization()); |
|
214 WB_END |
|
215 |
|
216 WB_ENTRY(jboolean, WB_IsMethodCompilable(JNIEnv* env, jobject o, jobject method)) |
|
217 jmethodID jmid = reflected_method_to_jmid(thread, env, method); |
|
218 MutexLockerEx mu(Compile_lock); |
|
219 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); |
|
220 return !mh->is_not_compilable(); |
|
221 WB_END |
|
222 |
|
223 WB_ENTRY(jboolean, WB_IsMethodQueuedForCompilation(JNIEnv* env, jobject o, jobject method)) |
|
224 jmethodID jmid = reflected_method_to_jmid(thread, env, method); |
|
225 MutexLockerEx mu(Compile_lock); |
|
226 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); |
|
227 return mh->queued_for_compilation(); |
|
228 WB_END |
|
229 |
|
230 WB_ENTRY(jint, WB_GetMethodCompilationLevel(JNIEnv* env, jobject o, jobject method)) |
|
231 jmethodID jmid = reflected_method_to_jmid(thread, env, method); |
|
232 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); |
|
233 nmethod* code = mh->code(); |
|
234 return (code != NULL ? code->comp_level() : CompLevel_none); |
|
235 WB_END |
|
236 |
|
237 |
|
238 WB_ENTRY(void, WB_MakeMethodNotCompilable(JNIEnv* env, jobject o, jobject method)) |
|
239 jmethodID jmid = reflected_method_to_jmid(thread, env, method); |
|
240 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); |
|
241 mh->set_not_compilable(); |
|
242 WB_END |
|
243 |
|
244 WB_ENTRY(jboolean, WB_SetDontInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value)) |
|
245 jmethodID jmid = reflected_method_to_jmid(thread, env, method); |
|
246 methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid)); |
|
247 bool result = mh->dont_inline(); |
|
248 mh->set_dont_inline(value == JNI_TRUE); |
|
249 return result; |
|
250 WB_END |
|
251 |
|
252 WB_ENTRY(jint, WB_GetCompileQueuesSize(JNIEnv* env, jobject o)) |
|
253 return CompileBroker::queue_size(CompLevel_full_optimization) /* C2 */ + |
|
254 CompileBroker::queue_size(CompLevel_full_profile) /* C1 */; |
|
255 WB_END |
|
256 |
172 //Some convenience methods to deal with objects from java |
257 //Some convenience methods to deal with objects from java |
173 int WhiteBox::offset_for_field(const char* field_name, oop object, |
258 int WhiteBox::offset_for_field(const char* field_name, oop object, |
174 Symbol* signature_symbol) { |
259 Symbol* signature_symbol) { |
175 assert(field_name != NULL && strlen(field_name) > 0, "Field name not valid"); |
260 assert(field_name != NULL && strlen(field_name) > 0, "Field name not valid"); |
176 Thread* THREAD = Thread::current(); |
261 Thread* THREAD = Thread::current(); |
223 #define CC (char*) |
308 #define CC (char*) |
224 |
309 |
225 static JNINativeMethod methods[] = { |
310 static JNINativeMethod methods[] = { |
226 {CC"getObjectAddress", CC"(Ljava/lang/Object;)J", (void*)&WB_GetObjectAddress }, |
311 {CC"getObjectAddress", CC"(Ljava/lang/Object;)J", (void*)&WB_GetObjectAddress }, |
227 {CC"getHeapOopSize", CC"()I", (void*)&WB_GetHeapOopSize }, |
312 {CC"getHeapOopSize", CC"()I", (void*)&WB_GetHeapOopSize }, |
228 {CC"isClassAlive0", CC"(Ljava/lang/String;)Z", (void*)&WB_IsClassAlive }, |
313 {CC"isClassAlive0", CC"(Ljava/lang/String;)Z", (void*)&WB_IsClassAlive }, |
229 {CC "parseCommandLine", |
314 {CC"parseCommandLine", |
230 CC "(Ljava/lang/String;[Lsun/hotspot/parser/DiagnosticCommand;)[Ljava/lang/Object;", |
315 CC"(Ljava/lang/String;[Lsun/hotspot/parser/DiagnosticCommand;)[Ljava/lang/Object;", |
231 (void*) &WB_ParseCommandLine |
316 (void*) &WB_ParseCommandLine |
232 }, |
317 }, |
233 #if INCLUDE_ALL_GCS |
318 #if INCLUDE_ALL_GCS |
234 {CC"g1InConcurrentMark", CC"()Z", (void*)&WB_G1InConcurrentMark}, |
319 {CC"g1InConcurrentMark", CC"()Z", (void*)&WB_G1InConcurrentMark}, |
235 {CC"g1IsHumongous", CC"(Ljava/lang/Object;)Z", (void*)&WB_G1IsHumongous }, |
320 {CC"g1IsHumongous", CC"(Ljava/lang/Object;)Z", (void*)&WB_G1IsHumongous }, |
239 #ifdef INCLUDE_NMT |
324 #ifdef INCLUDE_NMT |
240 {CC"NMTAllocTest", CC"()Z", (void*)&WB_NMTAllocTest }, |
325 {CC"NMTAllocTest", CC"()Z", (void*)&WB_NMTAllocTest }, |
241 {CC"NMTFreeTestMemory", CC"()Z", (void*)&WB_NMTFreeTestMemory }, |
326 {CC"NMTFreeTestMemory", CC"()Z", (void*)&WB_NMTFreeTestMemory }, |
242 {CC"NMTWaitForDataMerge",CC"()Z", (void*)&WB_NMTWaitForDataMerge}, |
327 {CC"NMTWaitForDataMerge",CC"()Z", (void*)&WB_NMTWaitForDataMerge}, |
243 #endif // INCLUDE_NMT |
328 #endif // INCLUDE_NMT |
|
329 {CC"deoptimizeAll", CC"()V", (void*)&WB_DeoptimizeAll }, |
|
330 {CC"deoptimizeMethod", CC"(Ljava/lang/reflect/Method;)I", |
|
331 (void*)&WB_DeoptimizeMethod }, |
|
332 {CC"isMethodCompiled", CC"(Ljava/lang/reflect/Method;)Z", |
|
333 (void*)&WB_IsMethodCompiled }, |
|
334 {CC"isMethodCompilable", CC"(Ljava/lang/reflect/Method;)Z", |
|
335 (void*)&WB_IsMethodCompilable}, |
|
336 {CC"isMethodQueuedForCompilation", |
|
337 CC"(Ljava/lang/reflect/Method;)Z", (void*)&WB_IsMethodQueuedForCompilation}, |
|
338 {CC"makeMethodNotCompilable", |
|
339 CC"(Ljava/lang/reflect/Method;)V", (void*)&WB_MakeMethodNotCompilable}, |
|
340 {CC"setDontInlineMethod", |
|
341 CC"(Ljava/lang/reflect/Method;Z)Z", (void*)&WB_SetDontInlineMethod}, |
|
342 {CC"getMethodCompilationLevel", |
|
343 CC"(Ljava/lang/reflect/Method;)I", (void*)&WB_GetMethodCompilationLevel}, |
|
344 {CC"getCompileQueuesSize", |
|
345 CC"()I", (void*)&WB_GetCompileQueuesSize}, |
244 }; |
346 }; |
245 |
347 |
246 #undef CC |
348 #undef CC |
247 |
349 |
248 JVM_ENTRY(void, JVM_RegisterWhiteBoxMethods(JNIEnv* env, jclass wbclass)) |
350 JVM_ENTRY(void, JVM_RegisterWhiteBoxMethods(JNIEnv* env, jclass wbclass)) |