Merge "EGL: add deferred saving of the cache" into ics-mr1

This commit is contained in:
Jamie Gennis 2011-11-09 11:46:45 -08:00 committed by Android (Google) Code Review
commit 72f172e79f
2 changed files with 34 additions and 0 deletions

View File

@ -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();
}
}
}

View File

@ -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;