diff options
Diffstat (limited to 'graphics')
-rw-r--r-- | graphics/java/android/renderscript/RenderScript.java | 44 |
1 files changed, 29 insertions, 15 deletions
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java index d87ca32..a49070e 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; @@ -1048,8 +1050,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"); @@ -1058,29 +1063,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; } @@ -1192,6 +1205,7 @@ public class RenderScript { nContextDeinitToClient(mContext); mMessageThread.mRun = false; mGCThread.mRun = false; + mGCThread.addAllocSize(0); try { mMessageThread.join(); mGCThread.join(); |