ActivityThread: purge jemalloc at appropriate times
am: 59f3dc1995
Change-Id: Id2cbabd4369a2769d44ac36a13aca0af819ffd98
This commit is contained in:
@@ -386,6 +386,9 @@ public final class ActivityThread extends ClientTransactionHandler {
|
||||
= new ArrayMap<Activity, ArrayList<OnActivityPausedListener>>();
|
||||
|
||||
final GcIdler mGcIdler = new GcIdler();
|
||||
final PurgeIdler mPurgeIdler = new PurgeIdler();
|
||||
|
||||
boolean mPurgeIdlerScheduled = false;
|
||||
boolean mGcIdlerScheduled = false;
|
||||
|
||||
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
|
||||
@@ -1668,6 +1671,7 @@ public final class ActivityThread extends ClientTransactionHandler {
|
||||
public static final int RUN_ISOLATED_ENTRY_POINT = 158;
|
||||
public static final int EXECUTE_TRANSACTION = 159;
|
||||
public static final int RELAUNCH_ACTIVITY = 160;
|
||||
public static final int PURGE_RESOURCES = 161;
|
||||
|
||||
String codeToString(int code) {
|
||||
if (DEBUG_MESSAGES) {
|
||||
@@ -1711,6 +1715,7 @@ public final class ActivityThread extends ClientTransactionHandler {
|
||||
case RUN_ISOLATED_ENTRY_POINT: return "RUN_ISOLATED_ENTRY_POINT";
|
||||
case EXECUTE_TRANSACTION: return "EXECUTE_TRANSACTION";
|
||||
case RELAUNCH_ACTIVITY: return "RELAUNCH_ACTIVITY";
|
||||
case PURGE_RESOURCES: return "PURGE_RESOURCES";
|
||||
}
|
||||
}
|
||||
return Integer.toString(code);
|
||||
@@ -1748,6 +1753,7 @@ public final class ActivityThread extends ClientTransactionHandler {
|
||||
case UNBIND_SERVICE:
|
||||
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceUnbind");
|
||||
handleUnbindService((BindServiceData)msg.obj);
|
||||
schedulePurgeIdler();
|
||||
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
|
||||
break;
|
||||
case SERVICE_ARGS:
|
||||
@@ -1758,6 +1764,7 @@ public final class ActivityThread extends ClientTransactionHandler {
|
||||
case STOP_SERVICE:
|
||||
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceStop");
|
||||
handleStopService((IBinder)msg.obj);
|
||||
schedulePurgeIdler();
|
||||
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
|
||||
break;
|
||||
case CONFIGURATION_CHANGED:
|
||||
@@ -1891,6 +1898,9 @@ public final class ActivityThread extends ClientTransactionHandler {
|
||||
case RELAUNCH_ACTIVITY:
|
||||
handleRelaunchActivityLocally((IBinder) msg.obj);
|
||||
break;
|
||||
case PURGE_RESOURCES:
|
||||
schedulePurgeIdler();
|
||||
break;
|
||||
}
|
||||
Object obj = msg.obj;
|
||||
if (obj instanceof SomeArgs) {
|
||||
@@ -1943,6 +1953,17 @@ public final class ActivityThread extends ClientTransactionHandler {
|
||||
@Override
|
||||
public final boolean queueIdle() {
|
||||
doGcIfNeeded();
|
||||
nPurgePendingResources();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
final class PurgeIdler implements MessageQueue.IdleHandler {
|
||||
@Override
|
||||
public boolean queueIdle() {
|
||||
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "purgePendingResources");
|
||||
nPurgePendingResources();
|
||||
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -2272,6 +2293,22 @@ public final class ActivityThread extends ClientTransactionHandler {
|
||||
mH.removeMessages(H.GC_WHEN_IDLE);
|
||||
}
|
||||
|
||||
void schedulePurgeIdler() {
|
||||
if (!mPurgeIdlerScheduled) {
|
||||
mPurgeIdlerScheduled = true;
|
||||
Looper.myQueue().addIdleHandler(mPurgeIdler);
|
||||
}
|
||||
mH.removeMessages(H.PURGE_RESOURCES);
|
||||
}
|
||||
|
||||
void unschedulePurgeIdler() {
|
||||
if (mPurgeIdlerScheduled) {
|
||||
mPurgeIdlerScheduled = false;
|
||||
Looper.myQueue().removeIdleHandler(mPurgeIdler);
|
||||
}
|
||||
mH.removeMessages(H.PURGE_RESOURCES);
|
||||
}
|
||||
|
||||
void doGcIfNeeded() {
|
||||
mGcIdlerScheduled = false;
|
||||
final long now = SystemClock.uptimeMillis();
|
||||
@@ -4561,6 +4598,7 @@ public final class ActivityThread extends ClientTransactionHandler {
|
||||
}
|
||||
r.setState(ON_DESTROY);
|
||||
}
|
||||
schedulePurgeIdler();
|
||||
mActivities.remove(token);
|
||||
StrictMode.decrementExpectedActivityCount(activityClass);
|
||||
return r;
|
||||
@@ -6793,6 +6831,6 @@ public final class ActivityThread extends ClientTransactionHandler {
|
||||
}
|
||||
|
||||
// ------------------ Regular JNI ------------------------
|
||||
|
||||
private native void nPurgePendingResources();
|
||||
private native void nDumpGraphicsInfo(FileDescriptor fd);
|
||||
}
|
||||
|
||||
@@ -42,6 +42,7 @@ cc_library_shared {
|
||||
"com_google_android_gles_jni_EGLImpl.cpp",
|
||||
"com_google_android_gles_jni_GLImpl.cpp", // TODO: .arm
|
||||
"android_app_Activity.cpp",
|
||||
"android_app_ActivityThread.cpp",
|
||||
"android_app_NativeActivity.cpp",
|
||||
"android_app_admin_SecurityLog.cpp",
|
||||
"android_opengl_EGL14.cpp",
|
||||
|
||||
55
core/jni/android_app_ActivityThread.cpp
Normal file
55
core/jni/android_app_ActivityThread.cpp
Normal file
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright (C) 2018 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include "jni.h"
|
||||
#include "GraphicsJNI.h"
|
||||
#include <nativehelper/JNIHelp.h>
|
||||
|
||||
#include <minikin/Layout.h>
|
||||
#include <renderthread/RenderProxy.h>
|
||||
|
||||
#include "core_jni_helpers.h"
|
||||
#include <unistd.h>
|
||||
|
||||
namespace android {
|
||||
|
||||
static void android_app_ActivityThread_purgePendingResources(JNIEnv* env, jobject clazz) {
|
||||
// Don't care about return values.
|
||||
mallopt(M_PURGE, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
android_app_ActivityThread_dumpGraphics(JNIEnv* env, jobject clazz, jobject javaFileDescriptor) {
|
||||
int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor);
|
||||
android::uirenderer::renderthread::RenderProxy::dumpGraphicsMemory(fd);
|
||||
minikin::Layout::dumpMinikinStats(fd);
|
||||
}
|
||||
|
||||
|
||||
static JNINativeMethod gActivityThreadMethods[] = {
|
||||
// ------------ Regular JNI ------------------
|
||||
{ "nPurgePendingResources", "()V",
|
||||
(void*) android_app_ActivityThread_purgePendingResources },
|
||||
{ "nDumpGraphicsInfo", "(Ljava/io/FileDescriptor;)V",
|
||||
(void*) android_app_ActivityThread_dumpGraphics }
|
||||
};
|
||||
|
||||
int register_android_app_ActivityThread(JNIEnv* env) {
|
||||
return RegisterMethodsOrDie(env, "android/app/ActivityThread",
|
||||
gActivityThreadMethods, NELEM(gActivityThreadMethods));
|
||||
}
|
||||
|
||||
};
|
||||
@@ -88,17 +88,6 @@ private:
|
||||
sp<InvokeRunnableMessage> mMessage;
|
||||
};
|
||||
|
||||
|
||||
// ---------------- Regular JNI -----------------------------
|
||||
|
||||
static void
|
||||
android_app_ActivityThread_dumpGraphics(JNIEnv* env, jobject clazz, jobject javaFileDescriptor) {
|
||||
int fd = jniGetFDFromFileDescriptor(env, javaFileDescriptor);
|
||||
android::uirenderer::renderthread::RenderProxy::dumpGraphicsMemory(fd);
|
||||
minikin::Layout::dumpMinikinStats(fd);
|
||||
}
|
||||
|
||||
|
||||
// ---------------- @FastNative -----------------------------
|
||||
|
||||
static void android_view_DisplayListCanvas_callDrawGLFunction(JNIEnv* env, jobject clazz,
|
||||
@@ -215,12 +204,6 @@ static JNINativeMethod gMethods[] = {
|
||||
{ "nDrawRoundRect", "(JJJJJJJJ)V",(void*) android_view_DisplayListCanvas_drawRoundRectProps },
|
||||
};
|
||||
|
||||
static JNINativeMethod gActivityThreadMethods[] = {
|
||||
// ------------ Regular JNI ------------------
|
||||
{ "nDumpGraphicsInfo", "(Ljava/io/FileDescriptor;)V",
|
||||
(void*) android_app_ActivityThread_dumpGraphics }
|
||||
};
|
||||
|
||||
int register_android_view_DisplayListCanvas(JNIEnv* env) {
|
||||
jclass runnableClass = FindClassOrDie(env, "java/lang/Runnable");
|
||||
gRunnableMethodId = GetMethodIDOrDie(env, runnableClass, "run", "()V");
|
||||
@@ -228,9 +211,4 @@ int register_android_view_DisplayListCanvas(JNIEnv* env) {
|
||||
return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
|
||||
}
|
||||
|
||||
int register_android_app_ActivityThread(JNIEnv* env) {
|
||||
return RegisterMethodsOrDie(env, "android/app/ActivityThread",
|
||||
gActivityThreadMethods, NELEM(gActivityThreadMethods));
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user