diff options
author | Tim Murray <timmurray@google.com> | 2013-04-12 00:07:01 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2013-04-12 00:07:01 -0700 |
commit | 5c18ff0f2b9eab8481acfe13603e253e9c16fb32 (patch) | |
tree | 7ef10b1e7cd6d6382b02efc33b63d4c18ee7ac94 /graphics/java/android/renderscript/RenderScript.java | |
parent | 9d02928e4349cecfa14e195d3d6f40e68c5fc468 (diff) | |
parent | 869d273503adbccfae3bac7425649f2e1d2aefad (diff) |
am 869d2735: Merge "Fix issues with GC thread." into jb-mr2-dev
* commit '869d273503adbccfae3bac7425649f2e1d2aefad':
Fix issues with GC thread.
Diffstat (limited to 'graphics/java/android/renderscript/RenderScript.java')
-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 d87ca32fdc52..a49070e4dda8 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(); |