Merge "Fix bug #5274332 TextLayoutCache is having multiple instances"

This commit is contained in:
Fabrice Di Meglio
2011-09-07 18:30:13 -07:00
committed by Android (Google) Code Review
6 changed files with 26 additions and 32 deletions

View File

@@ -760,7 +760,8 @@ public:
jint count = end - start;
sp<TextLayoutCacheValue> value;
#if USE_TEXT_LAYOUT_CACHE
value = gTextLayoutCache.getValue(paint, textArray, start, count, end, flags);
value = TextLayoutCache::getInstance().getValue(paint, textArray, start, count,
end, flags);
if (value == NULL) {
LOGE("Cannot get TextLayoutCache value");
return ;
@@ -780,7 +781,8 @@ public:
sp<TextLayoutCacheValue> value;
#if USE_TEXT_LAYOUT_CACHE
value = gTextLayoutCache.getValue(paint, textArray, start, count, contextCount, flags);
value = TextLayoutCache::getInstance().getValue(paint, textArray, start, count,
contextCount, flags);
if (value == NULL) {
LOGE("Cannot get TextLayoutCache value");
return ;

View File

@@ -257,7 +257,7 @@ void TextLayout::getTextRunAdvances(SkPaint* paint, const jchar* chars, jint sta
sp<TextLayoutCacheValue> value;
#if USE_TEXT_LAYOUT_CACHE
// Return advances from the cache. Compute them if needed
value = gTextLayoutCache.getValue(
value = TextLayoutCache::getInstance().getValue(
paint, chars, start, count, contextCount, dirFlags);
#else
value = new TextLayoutCacheValue();

View File

@@ -41,11 +41,6 @@ namespace android {
*/
#define USE_TEXT_LAYOUT_CACHE 1
#if USE_TEXT_LAYOUT_CACHE
static TextLayoutCache gTextLayoutCache;
#endif
enum {
kBidi_LTR = 0,
kBidi_RTL = 1,

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
#define LOG_TAG "TextLayoutCache"
#include "TextLayoutCache.h"
#include "TextLayout.h"
@@ -23,6 +25,12 @@ extern "C" {
namespace android {
//--------------------------------------------------------------------------------------------------
#if USE_TEXT_LAYOUT_CACHE
ANDROID_SINGLETON_STATIC_INSTANCE(TextLayoutCache);
#endif
//--------------------------------------------------------------------------------------------------
TextLayoutCache::TextLayoutCache() :
mCache(GenerationCache<TextLayoutCacheKey, sp<TextLayoutCacheValue> >::kUnlimitedCapacity),
mSize(0), mMaxSize(MB(DEFAULT_TEXT_LAYOUT_CACHE_SIZE_IN_MB)),
@@ -30,13 +38,6 @@ TextLayoutCache::TextLayoutCache() :
init();
}
TextLayoutCache::TextLayoutCache(uint32_t max):
mCache(GenerationCache<TextLayoutCacheKey, sp<TextLayoutCacheValue> >::kUnlimitedCapacity),
mSize(0), mMaxSize(max),
mCacheHitCount(0), mNanosecondsSaved(0) {
init();
}
TextLayoutCache::~TextLayoutCache() {
mCache.clear();
}
@@ -46,25 +47,21 @@ void TextLayoutCache::init() {
mDebugLevel = readRtlDebugLevel();
mDebugEnabled = mDebugLevel & kRtlDebugCaches;
LOGD("Using TextLayoutCache debug level: %d - Debug Enabled: %d", mDebugLevel, mDebugEnabled);
LOGD("Using debug level: %d - Debug Enabled: %d", mDebugLevel, mDebugEnabled);
mCacheStartTime = systemTime(SYSTEM_TIME_MONOTONIC);
if (mDebugEnabled) {
LOGD("TextLayoutCache start time: %lld", mCacheStartTime);
}
mInitialized = true;
if (mDebugEnabled) {
LOGD("Start time: %lld", mCacheStartTime);
#if RTL_USE_HARFBUZZ
LOGD("TextLayoutCache is using HARFBUZZ");
LOGD("Using HARFBUZZ");
#else
LOGD("TextLayoutCache is using ICU");
LOGD("Using ICU");
#endif
LOGD("Initialization is done");
}
if (mDebugEnabled) {
LOGD("TextLayoutCache initialization is done");
}
mInitialized = true;
}
/*
@@ -147,8 +144,7 @@ sp<TextLayoutCacheValue> TextLayoutCache::getValue(SkPaint* paint,
// Cleanup to make some room if needed
if (mSize + size > mMaxSize) {
if (mDebugEnabled) {
LOGD("TextLayoutCache: need to clean some entries "
"for making some room for a new entry");
LOGD("Need to clean some entries for making some room for a new entry");
}
while (mSize + size > mMaxSize) {
// This will call the callback
@@ -213,7 +209,7 @@ void TextLayoutCache::dumpCacheStats() {
float remainingPercent = 100 * ((mMaxSize - mSize) / ((float)mMaxSize));
float timeRunningInSec = (systemTime(SYSTEM_TIME_MONOTONIC) - mCacheStartTime) / 1000000000;
LOGD("------------------------------------------------");
LOGD("TextLayoutCache stats");
LOGD("Cache stats");
LOGD("------------------------------------------------");
LOGD("pid : %d", getpid());
LOGD("running : %.0f seconds", timeRunningInSec);

View File

@@ -25,6 +25,7 @@
#include <utils/GenerationCache.h>
#include <utils/Compare.h>
#include <utils/RefBase.h>
#include <utils/Singleton.h>
#include <SkPaint.h>
#include <SkTemplates.h>
@@ -187,11 +188,11 @@ private:
/**
* Cache of text layout information.
*/
class TextLayoutCache : public OnEntryRemoved<TextLayoutCacheKey, sp<TextLayoutCacheValue> >
class TextLayoutCache : public OnEntryRemoved<TextLayoutCacheKey, sp<TextLayoutCacheValue> >,
public Singleton<TextLayoutCache>
{
public:
TextLayoutCache();
TextLayoutCache(uint32_t maxByteSize);
virtual ~TextLayoutCache();

View File

@@ -477,7 +477,7 @@ static void renderText(OpenGLRenderer* renderer, const jchar* text, int count,
#if RTL_USE_HARFBUZZ
sp<TextLayoutCacheValue> value;
#if USE_TEXT_LAYOUT_CACHE
value = gTextLayoutCache.getValue(paint, text, 0, count, count, flags);
value = TextLayoutCache::getInstance().getValue(paint, text, 0, count, count, flags);
if (value == NULL) {
LOGE("Cannot get TextLayoutCache value");
return ;
@@ -507,7 +507,7 @@ static void renderTextRun(OpenGLRenderer* renderer, const jchar* text,
#if RTL_USE_HARFBUZZ
sp<TextLayoutCacheValue> value;
#if USE_TEXT_LAYOUT_CACHE
value = gTextLayoutCache.getValue(paint, text, start, count, contextCount, flags);
value = TextLayoutCache::getInstance().getValue(paint, text, start, count, contextCount, flags);
if (value == NULL) {
LOGE("Cannot get TextLayoutCache value");
return ;