diff options
author | Jamie Gennis <jgennis@google.com> | 2011-11-10 16:14:45 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2011-11-10 16:14:45 +0000 |
commit | 715bcd6d5b0cf76a65f17bac7e07f575f29834a9 (patch) | |
tree | 3362722343199a06b67249591a6b23b15f870872 /opengl | |
parent | fe2d4abdd917aa98baf56d4b903999c2d8b68a7d (diff) | |
parent | 1bf15e79dcc89229c599987ed795e3fd99bcbc88 (diff) | |
download | frameworks_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.cpp | 27 | ||||
-rw-r--r-- | opengl/libs/EGL/egl_cache.h | 7 |
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; |