summaryrefslogtreecommitdiffstats
path: root/opengl
diff options
context:
space:
mode:
authorJamie Gennis <jgennis@google.com>2011-11-10 16:14:45 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2011-11-10 16:14:45 +0000
commit715bcd6d5b0cf76a65f17bac7e07f575f29834a9 (patch)
tree3362722343199a06b67249591a6b23b15f870872 /opengl
parentfe2d4abdd917aa98baf56d4b903999c2d8b68a7d (diff)
parent1bf15e79dcc89229c599987ed795e3fd99bcbc88 (diff)
downloadframeworks_base-715bcd6d5b0cf76a65f17bac7e07f575f29834a9.zip
frameworks_base-715bcd6d5b0cf76a65f17bac7e07f575f29834a9.tar.gz
frameworks_base-715bcd6d5b0cf76a65f17bac7e07f575f29834a9.tar.bz2
am 1bf15e79: am 97ece7a9: Merge "EGL: add deferred saving of the cache" into ics-mr1
* commit '1bf15e79dcc89229c599987ed795e3fd99bcbc88': EGL: add deferred saving of the cache
Diffstat (limited to 'opengl')
-rw-r--r--opengl/libs/EGL/egl_cache.cpp27
-rw-r--r--opengl/libs/EGL/egl_cache.h7
2 files changed, 34 insertions, 0 deletions
diff --git a/opengl/libs/EGL/egl_cache.cpp b/opengl/libs/EGL/egl_cache.cpp
index aa40d58..522421b 100644
--- a/opengl/libs/EGL/egl_cache.cpp
+++ b/opengl/libs/EGL/egl_cache.cpp
@@ -34,6 +34,9 @@ static const size_t maxTotalSize = 64 * 1024;
static const char* cacheFileMagic = "EGL$";
static const size_t cacheFileHeaderSize = 8;
+// The time in seconds to wait before saving newly inserted cache entries.
+static const unsigned int deferredSaveDelay = 4;
+
// ----------------------------------------------------------------------------
namespace android {
// ----------------------------------------------------------------------------
@@ -128,6 +131,30 @@ void egl_cache_t::setBlob(const void* key, EGLsizei keySize, const void* value,
if (mInitialized) {
sp<BlobCache> bc = getBlobCacheLocked();
bc->set(key, keySize, value, valueSize);
+
+ if (!mSavePending) {
+ class DeferredSaveThread : public Thread {
+ public:
+ DeferredSaveThread() : Thread(false) {}
+
+ virtual bool threadLoop() {
+ sleep(deferredSaveDelay);
+ egl_cache_t* c = egl_cache_t::get();
+ Mutex::Autolock lock(c->mMutex);
+ if (c->mInitialized) {
+ c->saveBlobCacheLocked();
+ }
+ c->mSavePending = false;
+ return false;
+ }
+ };
+
+ // The thread will hold a strong ref to itself until it has finished
+ // running, so there's no need to keep a ref around.
+ sp<Thread> deferredSaveThread(new DeferredSaveThread());
+ mSavePending = true;
+ deferredSaveThread->run();
+ }
}
}
diff --git a/opengl/libs/EGL/egl_cache.h b/opengl/libs/EGL/egl_cache.h
index 05d5873..4389623 100644
--- a/opengl/libs/EGL/egl_cache.h
+++ b/opengl/libs/EGL/egl_cache.h
@@ -108,6 +108,13 @@ private:
// from disk.
String8 mFilename;
+ // mSavePending indicates whether or not a deferred save operation is
+ // pending. Each time a key/value pair is inserted into the cache via
+ // setBlob, a deferred save is initiated if one is not already pending.
+ // This will wait some amount of time and then trigger a save of the cache
+ // contents to disk.
+ bool mSavePending;
+
// mMutex is the mutex used to prevent concurrent access to the member
// variables. It must be locked whenever the member variables are accessed.
mutable Mutex mMutex;