diff options
author | Yang Ni <yangni@google.com> | 2016-04-12 23:37:00 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2016-04-12 23:37:01 +0000 |
commit | 0f10f043bea760c2f1480c3852ddc344553e625d (patch) | |
tree | a0160836a89d0eb58c93cf4c36f53f07e131a114 /rs/java/android/renderscript | |
parent | d7e1d429c49c2925d921878d26250afc3e862888 (diff) | |
parent | e1798e4284f5c886c280f7e439da8070cad6a915 (diff) |
Merge "Destroy Type created by Allocation.createSized()" into nyc-dev
Diffstat (limited to 'rs/java/android/renderscript')
-rw-r--r-- | rs/java/android/renderscript/Allocation.java | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/rs/java/android/renderscript/Allocation.java b/rs/java/android/renderscript/Allocation.java index 9ec6e8daf429..04ea8e5a663f 100644 --- a/rs/java/android/renderscript/Allocation.java +++ b/rs/java/android/renderscript/Allocation.java @@ -58,6 +58,7 @@ public class Allocation extends BaseObj { private static final int MAX_NUMBER_IO_INPUT_ALLOC = 16; Type mType; + boolean mOwningType = false; Bitmap mBitmap; int mUsage; Allocation mAdaptedAllocation; @@ -383,13 +384,16 @@ public class Allocation extends BaseObj { guard.open("destroy"); } - Allocation(long id, RenderScript rs, Type t, int usage, MipmapControl mips) { + Allocation(long id, RenderScript rs, Type t, boolean owningType, int usage, MipmapControl mips) { this(id, rs, t, usage); + mOwningType = owningType; mMipmapControl = mips; } protected void finalize() throws Throwable { RenderScript.registerNativeFree.invoke(RenderScript.sRuntime, mSize); + // Set mType null to avoid double-destroying it in case its finalizer races ahead + mType = null; super.finalize(); } @@ -1578,6 +1582,9 @@ public class Allocation extends BaseObj { mRS.finish(); // Necessary because resize is fifoed and update is async. long typeID = mRS.nAllocationGetType(getID(mRS)); + // Sets zero the mID so that the finalizer of the old mType value won't + // destroy the native object that is being reused. + mType.setID(0); mType = new Type(typeID, mRS); mType.updateFromNative(); updateCacheInfo(mType); @@ -1921,7 +1928,7 @@ public class Allocation extends BaseObj { if (id == 0) { throw new RSRuntimeException("Allocation creation failed."); } - return new Allocation(id, rs, type, usage, mips); + return new Allocation(id, rs, type, false, usage, mips); } finally { Trace.traceEnd(RenderScript.TRACE_TAG); } @@ -1979,7 +1986,7 @@ public class Allocation extends BaseObj { if (id == 0) { throw new RSRuntimeException("Allocation creation failed."); } - return new Allocation(id, rs, t, usage, MipmapControl.MIPMAP_NONE); + return new Allocation(id, rs, t, true, usage, MipmapControl.MIPMAP_NONE); } finally { Trace.traceEnd(RenderScript.TRACE_TAG); } @@ -2068,7 +2075,7 @@ public class Allocation extends BaseObj { } // keep a reference to the Bitmap around to prevent GC - Allocation alloc = new Allocation(id, rs, t, usage, mips); + Allocation alloc = new Allocation(id, rs, t, true, usage, mips); alloc.setBitmap(b); return alloc; } @@ -2078,7 +2085,7 @@ public class Allocation extends BaseObj { if (id == 0) { throw new RSRuntimeException("Load failed."); } - return new Allocation(id, rs, t, usage, mips); + return new Allocation(id, rs, t, true, usage, mips); } finally { Trace.traceEnd(RenderScript.TRACE_TAG); } @@ -2150,7 +2157,7 @@ public class Allocation extends BaseObj { } for (int i=1; i<numAlloc; i++) { - mAllocationArray[i] = createFromAllcation(rs, mAllocationArray[0]); + mAllocationArray[i] = createFromAllocation(rs, mAllocationArray[0]); } return mAllocationArray; } finally { @@ -2169,7 +2176,7 @@ public class Allocation extends BaseObj { * @param alloc RenderScript Allocation describing data layout. * @return Allocation sharing the same data structure. */ - static Allocation createFromAllcation(RenderScript rs, Allocation alloc) { + static Allocation createFromAllocation(RenderScript rs, Allocation alloc) { try { Trace.traceBegin(RenderScript.TRACE_TAG, "createFromAllcation"); rs.validate(); @@ -2184,7 +2191,7 @@ public class Allocation extends BaseObj { if (id == 0) { throw new RSRuntimeException("Allocation creation failed."); } - Allocation outAlloc = new Allocation(id, rs, type, usage, mips); + Allocation outAlloc = new Allocation(id, rs, type, false, usage, mips); if ((usage & USAGE_IO_INPUT) != 0) { outAlloc.shareBufferQueue(alloc); } @@ -2360,7 +2367,7 @@ public class Allocation extends BaseObj { if(id == 0) { throw new RSRuntimeException("Load failed for bitmap " + b + " element " + e); } - return new Allocation(id, rs, t, usage, mips); + return new Allocation(id, rs, t, true, usage, mips); } /** @@ -2605,6 +2612,13 @@ public class Allocation extends BaseObj { if((mUsage & USAGE_IO_OUTPUT) != 0) { setSurface(null); } + + if (mType != null && mOwningType) { + mType.destroy(); + mType = null; + } + super.destroy(); } + } |