diff options
Diffstat (limited to 'graphics/java/android/renderscript/RenderScript.java')
-rw-r--r-- | graphics/java/android/renderscript/RenderScript.java | 50 |
1 files changed, 35 insertions, 15 deletions
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java index 75186895ff3d..716315119a9b 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; @@ -994,6 +996,7 @@ public class RenderScript { static final int RS_MESSAGE_TO_CLIENT_RESIZE = 2; static final int RS_MESSAGE_TO_CLIENT_ERROR = 3; static final int RS_MESSAGE_TO_CLIENT_USER = 4; + static final int RS_MESSAGE_TO_CLIENT_NEW_BUFFER = 5; static final int RS_ERROR_FATAL_UNKNOWN = 0x1000; @@ -1053,6 +1056,11 @@ public class RenderScript { continue; } + if (msg == RS_MESSAGE_TO_CLIENT_NEW_BUFFER) { + Allocation.sendBufferNotification(subID); + continue; + } + // 2: teardown. // But we want to avoid starving other threads during // teardown by yielding until the next line in the destructor @@ -1070,8 +1078,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"); @@ -1080,29 +1091,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; } @@ -1214,6 +1233,7 @@ public class RenderScript { nContextDeinitToClient(mContext); mMessageThread.mRun = false; mGCThread.mRun = false; + mGCThread.addAllocSize(0); try { mMessageThread.join(); mGCThread.join(); |