From 71f1d99494776b79e5d5b75d23053891a047a79f Mon Sep 17 00:00:00 2001 From: David Aurelio Date: Thu, 2 Aug 2018 03:50:16 -0700 Subject: [PATCH] Fix behaviour of `freeNatives()` Summary: @public Prevents repeated deallocation of weak references. Reviewed By: pasqualeanatriello Differential Revision: D9131551 fbshipit-source-id: bc79596e056ae0657a55146ad786422fd0f5badc --- .../facebook/yoga/YogaNodePropertiesByteBuffer.java | 12 ++++++++---- java/com/facebook/yoga/YogaNodePropertiesJNI.java | 5 +++-- java/jni/YGJNI.cpp | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/java/com/facebook/yoga/YogaNodePropertiesByteBuffer.java b/java/com/facebook/yoga/YogaNodePropertiesByteBuffer.java index b792062b..daca67db 100644 --- a/java/com/facebook/yoga/YogaNodePropertiesByteBuffer.java +++ b/java/com/facebook/yoga/YogaNodePropertiesByteBuffer.java @@ -25,6 +25,7 @@ public class YogaNodePropertiesByteBuffer implements YogaNodeProperties, Cloneab private final long mNativePointer; private boolean mHasBorderSet = false; private boolean mHasNewLayout = true; + private boolean isFreed = false; private static native ByteBuffer jni_getStyleBuffer(long nativePointer); @@ -48,12 +49,10 @@ public class YogaNodePropertiesByteBuffer implements YogaNodeProperties, Cloneab mLayoutBuffer = jni_getLayoutBuffer(nativePointer).order(ByteOrder.LITTLE_ENDIAN); } - private static native void jni_YGNodeFree(long nativePointer); - @Override protected void finalize() throws Throwable { try { - jni_YGNodeFree(getNativePointer()); + freeNatives(); } finally { super.finalize(); } @@ -482,9 +481,14 @@ public class YogaNodePropertiesByteBuffer implements YogaNodeProperties, Cloneab return YogaDirection.fromInt(getLayoutDirectionInt()); } + private static native void jni_YGNodeFree(long nativePointer); + @Override public void freeNatives() { - jni_YGNodeFree(mNativePointer); + if (!isFreed) { + isFreed = true; + jni_YGNodeFree(mNativePointer); + } } private int getLayoutDirectionInt() { diff --git a/java/com/facebook/yoga/YogaNodePropertiesJNI.java b/java/com/facebook/yoga/YogaNodePropertiesJNI.java index d7644ba5..2322193c 100644 --- a/java/com/facebook/yoga/YogaNodePropertiesJNI.java +++ b/java/com/facebook/yoga/YogaNodePropertiesJNI.java @@ -66,12 +66,13 @@ public class YogaNodePropertiesJNI implements Cloneable, YogaNodeProperties { } } - private native void jni_YGNodeFree(long nativePointer); + private static native void jni_YGNodeFree(long nativePointer); @Override public void freeNatives() { - jni_YGNodeFree(mNativePointer); + long nativePointer = mNativePointer; mNativePointer = 0; + jni_YGNodeFree(nativePointer); } @Override diff --git a/java/jni/YGJNI.cpp b/java/jni/YGJNI.cpp index ecf13a26..7f4dc041 100644 --- a/java/jni/YGJNI.cpp +++ b/java/jni/YGJNI.cpp @@ -384,7 +384,7 @@ jlong jni_YGNodeCloneNoProps( return jni_YGNodeClone(cls, nativePointer, clonedJavaObject, nullptr); } -void jni_YGNodeFree(alias_ref thiz, jlong nativePointer) { +void jni_YGNodeFree(alias_ref thiz, jlong nativePointer) { if (nativePointer == 0) { return; }