Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ff265e61 authored by chaviw's avatar chaviw
Browse files

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
parent 0cc57111
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
@@ -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;
        }
    }
}
+0 −7
Original line number Diff line number Diff line
@@ -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) {