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