diff options
author | Yang Ni <yangni@google.com> | 2016-04-07 11:17:59 -0700 |
---|---|---|
committer | Yang Ni <yangni@google.com> | 2016-04-12 15:11:31 -0700 |
commit | e1798e4284f5c886c280f7e439da8070cad6a915 (patch) | |
tree | 9a5b3cf01bb7b2d3b0770f3c760cce2c701881c3 /rs/java/android | |
parent | 390a81302f13a0285e58e550cf786255ce5f8bd8 (diff) |
Destroy Type created by Allocation.createSized()
Bug: 27972184
Change-Id: I4f80c74079087eab20b75a701c56cde141322462
(cherry picked from commit 3444dbe025ad78cae9fd77a4d2203a1a806ae1af)
Diffstat (limited to 'rs/java/android')
-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(); } + } |