Enable asynchronous destruction of BaseObjs.

Change-Id: Iaddf8041a3c870a986ec8999e6ccc3aede38fc4c

Conflicts:
	rs/java/android/renderscript/BaseObj.java
This commit is contained in:
Tim Murray
2014-01-07 11:13:56 -08:00
parent e926dddb21
commit 504abb3626
2 changed files with 42 additions and 13 deletions

View File

@@ -16,7 +16,7 @@
package android.renderscript;
import android.util.Log;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* BaseObj is the base class for all RenderScript objects owned by a RS context.
@@ -109,17 +109,30 @@ public class BaseObj {
return mName;
}
protected void finalize() throws Throwable {
if (!mDestroyed) {
if(mID != 0 && mRS.isAlive()) {
private void helpDestroy() {
boolean shouldDestroy = false;
synchronized(this) {
if (!mDestroyed) {
shouldDestroy = true;
mDestroyed = true;
}
}
if (shouldDestroy) {
// must include nObjDestroy in the critical section
ReentrantReadWriteLock.ReadLock rlock = mRS.mRWLock.readLock();
rlock.lock();
if(mRS.isAlive()) {
mRS.nObjDestroy(mID);
}
rlock.unlock();
mRS = null;
mID = 0;
mDestroyed = true;
//Log.v(RenderScript.LOG_TAG, getClass() +
// " auto finalizing object without having released the RS reference.");
}
}
protected void finalize() throws Throwable {
helpDestroy();
super.finalize();
}
@@ -128,12 +141,11 @@ public class BaseObj {
* primary use is to force immediate cleanup of resources when it is
* believed the GC will not respond quickly enough.
*/
synchronized public void destroy() {
public void destroy() {
if(mDestroyed) {
throw new RSInvalidStateException("Object already destroyed.");
}
mDestroyed = true;
mRS.nObjDestroy(mID);
helpDestroy();
}
/**