10b80b746f295469f143b3088741642114c6e2a7dMingyao Yang/* 20b80b746f295469f143b3088741642114c6e2a7dMingyao Yang * Copyright (C) 2016 The Android Open Source Project 30b80b746f295469f143b3088741642114c6e2a7dMingyao Yang * 40b80b746f295469f143b3088741642114c6e2a7dMingyao Yang * Licensed under the Apache License, Version 2.0 (the "License"); 50b80b746f295469f143b3088741642114c6e2a7dMingyao Yang * you may not use this file except in compliance with the License. 60b80b746f295469f143b3088741642114c6e2a7dMingyao Yang * You may obtain a copy of the License at 70b80b746f295469f143b3088741642114c6e2a7dMingyao Yang * 80b80b746f295469f143b3088741642114c6e2a7dMingyao Yang * http://www.apache.org/licenses/LICENSE-2.0 90b80b746f295469f143b3088741642114c6e2a7dMingyao Yang * 100b80b746f295469f143b3088741642114c6e2a7dMingyao Yang * Unless required by applicable law or agreed to in writing, software 110b80b746f295469f143b3088741642114c6e2a7dMingyao Yang * distributed under the License is distributed on an "AS IS" BASIS, 120b80b746f295469f143b3088741642114c6e2a7dMingyao Yang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130b80b746f295469f143b3088741642114c6e2a7dMingyao Yang * See the License for the specific language governing permissions and 140b80b746f295469f143b3088741642114c6e2a7dMingyao Yang * limitations under the License. 150b80b746f295469f143b3088741642114c6e2a7dMingyao Yang */ 160b80b746f295469f143b3088741642114c6e2a7dMingyao Yang 170b80b746f295469f143b3088741642114c6e2a7dMingyao Yang#include "jni.h" 180b80b746f295469f143b3088741642114c6e2a7dMingyao Yang#include "mirror/class-inl.h" 190b80b746f295469f143b3088741642114c6e2a7dMingyao Yang#include "runtime.h" 200b80b746f295469f143b3088741642114c6e2a7dMingyao Yang#include "thread_list.h" 210b80b746f295469f143b3088741642114c6e2a7dMingyao Yang#include "thread_state.h" 220b80b746f295469f143b3088741642114c6e2a7dMingyao Yang#include "gc/gc_cause.h" 230b80b746f295469f143b3088741642114c6e2a7dMingyao Yang#include "gc/scoped_gc_critical_section.h" 240b80b746f295469f143b3088741642114c6e2a7dMingyao Yang 250b80b746f295469f143b3088741642114c6e2a7dMingyao Yangnamespace art { 260b80b746f295469f143b3088741642114c6e2a7dMingyao Yang 270b80b746f295469f143b3088741642114c6e2a7dMingyao Yangextern "C" JNIEXPORT void JNICALL Java_Main_deoptimizeAll( 280b80b746f295469f143b3088741642114c6e2a7dMingyao Yang JNIEnv* env, 290b80b746f295469f143b3088741642114c6e2a7dMingyao Yang jclass cls ATTRIBUTE_UNUSED) { 300b80b746f295469f143b3088741642114c6e2a7dMingyao Yang ScopedObjectAccess soa(env); 310b80b746f295469f143b3088741642114c6e2a7dMingyao Yang ScopedThreadSuspension sts(Thread::Current(), kWaitingForDeoptimization); 320b80b746f295469f143b3088741642114c6e2a7dMingyao Yang gc::ScopedGCCriticalSection gcs(Thread::Current(), 330b80b746f295469f143b3088741642114c6e2a7dMingyao Yang gc::kGcCauseInstrumentation, 340b80b746f295469f143b3088741642114c6e2a7dMingyao Yang gc::kCollectorTypeInstrumentation); 350b80b746f295469f143b3088741642114c6e2a7dMingyao Yang // We need to suspend mutator threads first. 360b80b746f295469f143b3088741642114c6e2a7dMingyao Yang ScopedSuspendAll ssa(__FUNCTION__); 370b80b746f295469f143b3088741642114c6e2a7dMingyao Yang static bool first = true; 380b80b746f295469f143b3088741642114c6e2a7dMingyao Yang if (first) { 390b80b746f295469f143b3088741642114c6e2a7dMingyao Yang // We need to enable deoptimization once in order to call DeoptimizeEverything(). 400b80b746f295469f143b3088741642114c6e2a7dMingyao Yang Runtime::Current()->GetInstrumentation()->EnableDeoptimization(); 410b80b746f295469f143b3088741642114c6e2a7dMingyao Yang first = false; 420b80b746f295469f143b3088741642114c6e2a7dMingyao Yang } 430b80b746f295469f143b3088741642114c6e2a7dMingyao Yang Runtime::Current()->GetInstrumentation()->DeoptimizeEverything("test"); 440b80b746f295469f143b3088741642114c6e2a7dMingyao Yang} 450b80b746f295469f143b3088741642114c6e2a7dMingyao Yang 460b80b746f295469f143b3088741642114c6e2a7dMingyao Yangextern "C" JNIEXPORT void JNICALL Java_Main_undeoptimizeAll( 470b80b746f295469f143b3088741642114c6e2a7dMingyao Yang JNIEnv* env, 480b80b746f295469f143b3088741642114c6e2a7dMingyao Yang jclass cls ATTRIBUTE_UNUSED) { 490b80b746f295469f143b3088741642114c6e2a7dMingyao Yang ScopedObjectAccess soa(env); 500b80b746f295469f143b3088741642114c6e2a7dMingyao Yang ScopedThreadSuspension sts(Thread::Current(), kWaitingForDeoptimization); 510b80b746f295469f143b3088741642114c6e2a7dMingyao Yang gc::ScopedGCCriticalSection gcs(Thread::Current(), 520b80b746f295469f143b3088741642114c6e2a7dMingyao Yang gc::kGcCauseInstrumentation, 530b80b746f295469f143b3088741642114c6e2a7dMingyao Yang gc::kCollectorTypeInstrumentation); 540b80b746f295469f143b3088741642114c6e2a7dMingyao Yang // We need to suspend mutator threads first. 550b80b746f295469f143b3088741642114c6e2a7dMingyao Yang ScopedSuspendAll ssa(__FUNCTION__); 560b80b746f295469f143b3088741642114c6e2a7dMingyao Yang Runtime::Current()->GetInstrumentation()->UndeoptimizeEverything("test"); 570b80b746f295469f143b3088741642114c6e2a7dMingyao Yang} 580b80b746f295469f143b3088741642114c6e2a7dMingyao Yang 590b80b746f295469f143b3088741642114c6e2a7dMingyao Yang} // namespace art 60