Remove SurfaceSession.nativeKill
SurfaceSession.nativeKill would call SurfaceComposerClient.dispose. This was unsafe since it would only clear the ISurfaceComposerClient binder object, but the SurfaceComposerClient object could still be around. Instead, when calling SurfaceSession.kill, just remove the Java reference, but allow the dtor of SurfaceComposerClient to handle disposing the binder object. Test: Force app to restart while in a sync transaction. No longer shows an error Fixes: 179459565 Change-Id: I322e7f3bd4e7efb3d85d1afe3c4704283f58a985
This commit is contained in:
@@ -32,7 +32,6 @@ public final class SurfaceSession {
|
||||
|
||||
private static native long nativeCreate();
|
||||
private static native void nativeDestroy(long ptr);
|
||||
private static native void nativeKill(long ptr);
|
||||
|
||||
/** Create a new connection with the surface flinger. */
|
||||
@UnsupportedAppUsage
|
||||
@@ -44,22 +43,22 @@ public final class SurfaceSession {
|
||||
@Override
|
||||
protected void finalize() throws Throwable {
|
||||
try {
|
||||
if (mNativeClient != 0) {
|
||||
nativeDestroy(mNativeClient);
|
||||
}
|
||||
kill();
|
||||
} finally {
|
||||
super.finalize();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Forcibly detach native resources associated with this object.
|
||||
* Unlike destroy(), after this call any surfaces that were created
|
||||
* from the session will no longer work.
|
||||
* Remove the reference to the native Session object. The native object may still exist if
|
||||
* there are other references to it, but it cannot be accessed from this Java object anymore.
|
||||
*/
|
||||
@UnsupportedAppUsage
|
||||
public void kill() {
|
||||
nativeKill(mNativeClient);
|
||||
if (mNativeClient != 0) {
|
||||
nativeDestroy(mNativeClient);
|
||||
mNativeClient = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -51,19 +51,12 @@ static void nativeDestroy(JNIEnv* env, jclass clazz, jlong ptr) {
|
||||
client->decStrong((void*)nativeCreate);
|
||||
}
|
||||
|
||||
static void nativeKill(JNIEnv* env, jclass clazz, jlong ptr) {
|
||||
SurfaceComposerClient* client = reinterpret_cast<SurfaceComposerClient*>(ptr);
|
||||
client->dispose();
|
||||
}
|
||||
|
||||
static const JNINativeMethod gMethods[] = {
|
||||
/* name, signature, funcPtr */
|
||||
{ "nativeCreate", "()J",
|
||||
(void*)nativeCreate },
|
||||
{ "nativeDestroy", "(J)V",
|
||||
(void*)nativeDestroy },
|
||||
{ "nativeKill", "(J)V",
|
||||
(void*)nativeKill }
|
||||
};
|
||||
|
||||
int register_android_view_SurfaceSession(JNIEnv* env) {
|
||||
|
||||
Reference in New Issue
Block a user