From 99c3d700d2d0886fe27fa961c89dae7c6c3b8195 Mon Sep 17 00:00:00 2001 From: Jamie Gennis Date: Tue, 8 Nov 2011 17:59:36 -0800 Subject: [PATCH] EGL: add deferred saving of the cache This change causes any insertions into the EGL cache to trigger an attempt to save the cache contents to disk. The save operation is deferred to allow multiple cache insertions to be batched up. Change-Id: I6cfec9c0dbbef94d3f8880860e2a365dccc296c7 --- opengl/libs/EGL/egl_cache.cpp | 27 +++++++++++++++++++++++++++ opengl/libs/EGL/egl_cache.h | 7 +++++++ 2 files changed, 34 insertions(+) diff --git a/opengl/libs/EGL/egl_cache.cpp b/opengl/libs/EGL/egl_cache.cpp index aa40d5888..522421b1d 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 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 deferredSaveThread(new DeferredSaveThread()); + mSavePending = true; + deferredSaveThread->run(); + } } } diff --git a/opengl/libs/EGL/egl_cache.h b/opengl/libs/EGL/egl_cache.h index 05d587318..4389623c5 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;