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

Commit 3444dbe0 authored by Yang Ni's avatar Yang Ni
Browse files

Destroy Type created by Allocation.createSized()

Bug: 27972184
Change-Id: I4f80c74079087eab20b75a701c56cde141322462
parent ba23e453
Loading
Loading
Loading
Loading
+23 −9
Original line number Diff line number Diff line
@@ -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);
        }
@@ -2152,7 +2159,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 {
@@ -2171,7 +2178,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();
@@ -2186,7 +2193,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);
            }
@@ -2364,7 +2371,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);
    }

    /**
@@ -2609,6 +2616,13 @@ public class Allocation extends BaseObj {
        if((mUsage & USAGE_IO_OUTPUT) != 0) {
            setSurface(null);
        }

        if (mType != null && mOwningType) {
            mType.destroy();
            mType = null;
        }

        super.destroy();
    }

}