summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYang Ni <yangni@google.com>2016-04-01 00:33:57 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2016-04-01 00:33:58 +0000
commit0c6ed67c3ab80f406d31a2e4d666a680e62cb83c (patch)
treef64f3fe55b23960c162a4793304ce60b434611bc
parentb8572b3d50475918d3e2b25961b7c6189d6af39e (diff)
parent6484b6be5ca5233614d0a8991a5d909543824fc7 (diff)
Merge "Added CloseGuard for BaseObj" into nyc-dev
-rw-r--r--rs/java/android/renderscript/Allocation.java2
-rw-r--r--rs/java/android/renderscript/BaseObj.java13
-rw-r--r--rs/java/android/renderscript/Element.java2
-rw-r--r--rs/java/android/renderscript/FileA3D.java1
-rw-r--r--rs/java/android/renderscript/Font.java1
-rw-r--r--rs/java/android/renderscript/Mesh.java1
-rw-r--r--rs/java/android/renderscript/Program.java1
-rw-r--r--rs/java/android/renderscript/Sampler.java1
-rw-r--r--rs/java/android/renderscript/Script.java15
-rw-r--r--rs/java/android/renderscript/ScriptGroup.java6
-rw-r--r--rs/java/android/renderscript/Type.java1
11 files changed, 42 insertions, 2 deletions
diff --git a/rs/java/android/renderscript/Allocation.java b/rs/java/android/renderscript/Allocation.java
index 81f63aeab0a5..9ec6e8daf429 100644
--- a/rs/java/android/renderscript/Allocation.java
+++ b/rs/java/android/renderscript/Allocation.java
@@ -380,6 +380,7 @@ public class Allocation extends BaseObj {
Log.e(RenderScript.LOG_TAG, "Couldn't invoke registerNativeAllocation:" + e);
throw new RSRuntimeException("Couldn't invoke registerNativeAllocation:" + e);
}
+ guard.open("destroy");
}
Allocation(long id, RenderScript rs, Type t, int usage, MipmapControl mips) {
@@ -1915,6 +1916,7 @@ public class Allocation extends BaseObj {
if (type.getID(rs) == 0) {
throw new RSInvalidStateException("Bad Type");
}
+ // TODO: What if there is an exception after this? The native allocation would leak.
long id = rs.nAllocationCreateTyped(type.getID(rs), mips.mID, usage, 0);
if (id == 0) {
throw new RSRuntimeException("Allocation creation failed.");
diff --git a/rs/java/android/renderscript/BaseObj.java b/rs/java/android/renderscript/BaseObj.java
index 1372ab79e264..f95af1673730 100644
--- a/rs/java/android/renderscript/BaseObj.java
+++ b/rs/java/android/renderscript/BaseObj.java
@@ -16,6 +16,7 @@
package android.renderscript;
+import dalvik.system.CloseGuard;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
@@ -69,6 +70,7 @@ public class BaseObj {
}
private long mID;
+ final CloseGuard guard = CloseGuard.get();
private boolean mDestroyed;
private String mName;
RenderScript mRS;
@@ -119,6 +121,7 @@ public class BaseObj {
}
if (shouldDestroy) {
+ guard.close();
// must include nObjDestroy in the critical section
ReentrantReadWriteLock.ReadLock rlock = mRS.mRWLock.readLock();
rlock.lock();
@@ -133,8 +136,14 @@ public class BaseObj {
}
protected void finalize() throws Throwable {
- helpDestroy();
- super.finalize();
+ try {
+ if (guard != null) {
+ guard.warnIfOpen();
+ }
+ helpDestroy();
+ } finally {
+ super.finalize();
+ }
}
/**
diff --git a/rs/java/android/renderscript/Element.java b/rs/java/android/renderscript/Element.java
index 6efb6d6a5735..50226acc77b4 100644
--- a/rs/java/android/renderscript/Element.java
+++ b/rs/java/android/renderscript/Element.java
@@ -808,6 +808,7 @@ public class Element extends BaseObj {
mSize += mElements[ct].mSize * mArraySizes[ct];
}
updateVisibleSubElements();
+ guard.open("destroy");
}
Element(long id, RenderScript rs, DataType dt, DataKind dk, boolean norm, int size) {
@@ -827,6 +828,7 @@ public class Element extends BaseObj {
mKind = dk;
mNormalized = norm;
mVectorSize = size;
+ guard.open("destroy");
}
Element(long id, RenderScript rs) {
diff --git a/rs/java/android/renderscript/FileA3D.java b/rs/java/android/renderscript/FileA3D.java
index 9d8f1624a051..278d309c74f7 100644
--- a/rs/java/android/renderscript/FileA3D.java
+++ b/rs/java/android/renderscript/FileA3D.java
@@ -170,6 +170,7 @@ public class FileA3D extends BaseObj {
FileA3D(long id, RenderScript rs, InputStream stream) {
super(id, rs);
mInputStream = stream;
+ guard.open("destroy");
}
private void initEntries() {
diff --git a/rs/java/android/renderscript/Font.java b/rs/java/android/renderscript/Font.java
index 4318b9d4d21c..d5ca31e93418 100644
--- a/rs/java/android/renderscript/Font.java
+++ b/rs/java/android/renderscript/Font.java
@@ -150,6 +150,7 @@ public class Font extends BaseObj {
Font(long id, RenderScript rs) {
super(id, rs);
+ guard.open("destroy");
}
/**
diff --git a/rs/java/android/renderscript/Mesh.java b/rs/java/android/renderscript/Mesh.java
index 13c8e1c91052..9e4f90573ae9 100644
--- a/rs/java/android/renderscript/Mesh.java
+++ b/rs/java/android/renderscript/Mesh.java
@@ -91,6 +91,7 @@ public class Mesh extends BaseObj {
Mesh(long id, RenderScript rs) {
super(id, rs);
+ guard.open("destroy");
}
/**
diff --git a/rs/java/android/renderscript/Program.java b/rs/java/android/renderscript/Program.java
index 3eb9b7590f45..772021c7815c 100644
--- a/rs/java/android/renderscript/Program.java
+++ b/rs/java/android/renderscript/Program.java
@@ -76,6 +76,7 @@ public class Program extends BaseObj {
Program(long id, RenderScript rs) {
super(id, rs);
+ guard.open("destroy");
}
/**
diff --git a/rs/java/android/renderscript/Sampler.java b/rs/java/android/renderscript/Sampler.java
index a4edbb50ac10..5c4bae99ba8f 100644
--- a/rs/java/android/renderscript/Sampler.java
+++ b/rs/java/android/renderscript/Sampler.java
@@ -51,6 +51,7 @@ public class Sampler extends BaseObj {
Sampler(long id, RenderScript rs) {
super(id, rs);
+ guard.open("destroy");
}
/**
diff --git a/rs/java/android/renderscript/Script.java b/rs/java/android/renderscript/Script.java
index f6f93cb7b964..fc3280be3ac7 100644
--- a/rs/java/android/renderscript/Script.java
+++ b/rs/java/android/renderscript/Script.java
@@ -41,6 +41,7 @@ public class Script extends BaseObj {
mScript = s;
mSlot = slot;
mSig = sig;
+ guard.open("destroy");
}
}
@@ -118,6 +119,7 @@ public class Script extends BaseObj {
super(id, rs);
mScript = s;
mSlot = slot;
+ guard.open("destroy");
}
}
@@ -357,6 +359,19 @@ public class Script extends BaseObj {
super(id, rs);
mInIdsBuffer = new long[1];
+
+ /* The constructors for the derived classes (including ScriptIntrinsic
+ * derived classes and ScriptC derived classes generated by Slang
+ * reflection) seem to be simple enough, so we just put the guard.open()
+ * call here, rather than in the end of the constructor for the derived
+ * class. This, of course, assumes the derived constructor would not
+ * throw any exception after calling this constructor.
+ *
+ * If new derived classes are added with more complicated constructors
+ * that throw exceptions, this call has to be (duplicated and) moved
+ * to the end of each derived class constructor.
+ */
+ guard.open("destroy");
}
/**
diff --git a/rs/java/android/renderscript/ScriptGroup.java b/rs/java/android/renderscript/ScriptGroup.java
index 9357c3bb0428..219f16b91baf 100644
--- a/rs/java/android/renderscript/ScriptGroup.java
+++ b/rs/java/android/renderscript/ScriptGroup.java
@@ -148,6 +148,8 @@ public final class ScriptGroup extends BaseObj {
fieldIDs, values, sizes, depClosures, depFieldIDs);
setID(id);
+
+ guard.open("destroy");
}
Closure(RenderScript rs, Script.InvokeID invokeID,
@@ -181,6 +183,8 @@ public final class ScriptGroup extends BaseObj {
values, sizes);
setID(id);
+
+ guard.open("destroy");
}
private void retrieveValueAndDependenceInfo(RenderScript rs,
@@ -382,6 +386,7 @@ public final class ScriptGroup extends BaseObj {
ScriptGroup(long id, RenderScript rs) {
super(id, rs);
+ guard.open("destroy");
}
ScriptGroup(RenderScript rs, String name, List<Closure> closures,
@@ -398,6 +403,7 @@ public final class ScriptGroup extends BaseObj {
}
long id = rs.nScriptGroup2Create(name, RenderScript.getCachePath(), closureIDs);
setID(id);
+ guard.open("destroy");
}
/**
diff --git a/rs/java/android/renderscript/Type.java b/rs/java/android/renderscript/Type.java
index dc2378596d00..9252898781f4 100644
--- a/rs/java/android/renderscript/Type.java
+++ b/rs/java/android/renderscript/Type.java
@@ -227,6 +227,7 @@ public class Type extends BaseObj {
Type(long id, RenderScript rs) {
super(id, rs);
+ guard.open("destroy");
}
@Override