am 5c18ff0f: am 869d2735: Merge "Fix issues with GC thread." into jb-mr2-dev

* commit '5c18ff0f2b9eab8481acfe13603e253e9c16fb32':
  Fix issues with GC thread.
This commit is contained in:
Tim Murray
2013-04-12 00:10:47 -07:00
committed by Android Git Automerger

View File

@ -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();