summaryrefslogtreecommitdiff
path: root/graphics/java/android/renderscript/RenderScript.java
diff options
context:
space:
mode:
authorTim Murray <timmurray@google.com>2013-04-12 00:10:47 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2013-04-12 00:10:47 -0700
commite1f8089a94a5c2bc271a1c23c1e07ff92b551ea8 (patch)
tree6e6bfab5a31ac044398bc403273bdca2dbf8a841 /graphics/java/android/renderscript/RenderScript.java
parent3ba01a7cc37690447a15be59c221f98eab061b4d (diff)
parent5c18ff0f2b9eab8481acfe13603e253e9c16fb32 (diff)
am 5c18ff0f: am 869d2735: Merge "Fix issues with GC thread." into jb-mr2-dev
* commit '5c18ff0f2b9eab8481acfe13603e253e9c16fb32': Fix issues with GC thread.
Diffstat (limited to 'graphics/java/android/renderscript/RenderScript.java')
-rw-r--r--graphics/java/android/renderscript/RenderScript.java44
1 files changed, 29 insertions, 15 deletions
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index dd0274189be8..a734b477f40c 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -18,7 +18,9 @@ package android.renderscript;
import java.io.File;
import java.lang.reflect.Field;
+import java.util.concurrent.locks.*;
+import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
@@ -1056,8 +1058,11 @@ public class RenderScript {
RenderScript mRS;
boolean mRun = true;
- int currentSize = 0;
- final static int targetSize = 256*1024*1024; // call System.gc after 256MB of allocs
+ long currentSize = 0;
+ long targetSize; // call System.gc after 512MB of allocs
+
+ final Lock lock = new ReentrantLock();
+ final Condition cond = lock.newCondition();
GCThread(RenderScript rs) {
super("RSGCThread");
@@ -1066,29 +1071,37 @@ public class RenderScript {
}
public void run() {
+ ActivityManager am = (ActivityManager)mRS.getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
+ ActivityManager.MemoryInfo meminfo = new ActivityManager.MemoryInfo();
+ am.getMemoryInfo(meminfo);
+ targetSize = (long)(meminfo.totalMem * .5f);
+
while(mRun) {
- boolean doGC = false;
- synchronized(this) {
- if (currentSize >= targetSize) {
- doGC = true;
- }
- }
- if (doGC == true) {
- System.gc();
- }
+ System.gc();
+ lock.lock();
try {
- sleep(1, 0);
- } catch(InterruptedException e) {
+ cond.awaitUninterruptibly();
+ } finally {
+ lock.unlock();
}
}
+
Log.d(LOG_TAG, "GCThread exiting.");
}
- public synchronized void addAllocSize(int bytes) {
+ public synchronized void addAllocSize(long bytes) {
currentSize += bytes;
+ if (currentSize >= targetSize) {
+ lock.lock();
+ try {
+ cond.signal();
+ } finally {
+ lock.unlock();
+ }
+ }
}
- public synchronized void removeAllocSize(int bytes) {
+ public synchronized void removeAllocSize(long bytes) {
currentSize -= bytes;
}
@@ -1205,6 +1218,7 @@ public class RenderScript {
nContextDeinitToClient(mContext);
mMessageThread.mRun = false;
mGCThread.mRun = false;
+ mGCThread.addAllocSize(0);
try {
mMessageThread.join();
mGCThread.join();