summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaph Levien <raph@google.com>2014-05-19 13:21:21 -0700
committerRaph Levien <raph@google.com>2014-05-19 14:01:37 -0700
commitc31e3883456e018d742e9f29815ba5ff8b315ea1 (patch)
treeca0e5d7f03ad7a06496c89c432220d5f08c0d80e
parenta3998d4f51e862f00b3dc6b8b99cfbeea2622b2d (diff)
downloadandroid_frameworks_minikin-c31e3883456e018d742e9f29815ba5ff8b315ea1.tar.gz
android_frameworks_minikin-c31e3883456e018d742e9f29815ba5ff8b315ea1.tar.bz2
android_frameworks_minikin-c31e3883456e018d742e9f29815ba5ff8b315ea1.zip
Fix incomplete refcounting and locking
These changes were supposed to be committed in the previous patch "Better refcounting and locking" but seem to have gotten lost in a rebase. It fixes a memory leak and some possible race conditions. Change-Id: I54ca1e37500ec49756fe317cc6d6d03da9911501
-rw-r--r--include/minikin/FontFamily.h2
-rw-r--r--include/minikin/Layout.h6
-rw-r--r--libs/minikin/FontCollection.cpp2
-rw-r--r--libs/minikin/FontFamily.cpp11
-rw-r--r--libs/minikin/Layout.cpp7
5 files changed, 26 insertions, 2 deletions
diff --git a/include/minikin/FontFamily.h b/include/minikin/FontFamily.h
index 3b59017..82fcfe9 100644
--- a/include/minikin/FontFamily.h
+++ b/include/minikin/FontFamily.h
@@ -56,6 +56,8 @@ public:
MinikinFont* getFont(size_t index) const;
FontStyle getStyle(size_t index) const;
private:
+ void addFontLocked(MinikinFont* typeface, FontStyle style);
+
class Font {
public:
Font(MinikinFont* typeface, FontStyle style) :
diff --git a/include/minikin/Layout.h b/include/minikin/Layout.h
index 896478b..4fe9d87 100644
--- a/include/minikin/Layout.h
+++ b/include/minikin/Layout.h
@@ -55,8 +55,14 @@ struct LayoutGlyph {
float y;
};
+// Lifecycle and threading assumptions for Layout:
+// The object is assumed to be owned by a single thread; multiple threads
+// may not mutate it at the same time.
+// The lifetime of the FontCollection set through setFontCollection must
+// extend through the lifetime of the Layout object.
class Layout {
public:
+ ~Layout();
void dump() const;
void setFontCollection(const FontCollection* collection);
diff --git a/libs/minikin/FontCollection.cpp b/libs/minikin/FontCollection.cpp
index 18e528e..cd7b19e 100644
--- a/libs/minikin/FontCollection.cpp
+++ b/libs/minikin/FontCollection.cpp
@@ -19,6 +19,7 @@
#define LOG_TAG "Minikin"
#include <cutils/log.h>
+#include "MinikinInternal.h"
#include <minikin/CmapCoverage.h>
#include <minikin/FontCollection.h>
@@ -33,6 +34,7 @@ static inline T max(T a, T b) {
FontCollection::FontCollection(const vector<FontFamily*>& typefaces) :
mMaxChar(0) {
+ AutoMutex _l(gMinikinLock);
vector<uint32_t> lastChar;
size_t nTypefaces = typefaces.size();
#ifdef VERBOSE_DEBUG
diff --git a/libs/minikin/FontFamily.cpp b/libs/minikin/FontFamily.cpp
index d8525ff..d818f77 100644
--- a/libs/minikin/FontFamily.cpp
+++ b/libs/minikin/FontFamily.cpp
@@ -19,6 +19,8 @@
#include <cutils/log.h>
#include <stdlib.h>
#include <stdint.h>
+
+#include "MinikinInternal.h"
#include <minikin/MinikinFont.h>
#include <minikin/AnalyzeStyle.h>
#include <minikin/FontFamily.h>
@@ -35,6 +37,7 @@ FontFamily::~FontFamily() {
}
bool FontFamily::addFont(MinikinFont* typeface) {
+ AutoMutex _l(gMinikinLock);
const uint32_t os2Tag = MinikinFont::MakeTag('O', 'S', '/', '2');
size_t os2Size = 0;
bool ok = typeface->GetTable(os2Tag, NULL, &os2Size);
@@ -47,7 +50,7 @@ bool FontFamily::addFont(MinikinFont* typeface) {
if (analyzeStyle(os2Data.get(), os2Size, &weight, &italic)) {
//ALOGD("analyzed weight = %d, italic = %s", weight, italic ? "true" : "false");
FontStyle style(weight, italic);
- addFont(typeface, style);
+ addFontLocked(typeface, style);
return true;
} else {
ALOGD("failed to analyze style");
@@ -56,7 +59,11 @@ bool FontFamily::addFont(MinikinFont* typeface) {
}
void FontFamily::addFont(MinikinFont* typeface, FontStyle style) {
- typeface->RefLocked();
+ AutoMutex _l(gMinikinLock);
+ addFontLocked(typeface, style);
+}
+
+void FontFamily::addFontLocked(MinikinFont* typeface, FontStyle style) { typeface->RefLocked();
mFonts.push_back(Font(typeface, style));
}
diff --git a/libs/minikin/Layout.cpp b/libs/minikin/Layout.cpp
index 3a0be6a..f32e9f4 100644
--- a/libs/minikin/Layout.cpp
+++ b/libs/minikin/Layout.cpp
@@ -161,6 +161,7 @@ hb_font_funcs_t* getHbFontFuncs() {
hb_font_t* create_hb_font(MinikinFont* minikinFont, MinikinPaint* minikinPaint) {
hb_face_t* face = hb_face_create_for_tables(referenceTable, minikinFont, NULL);
hb_font_t* font = hb_font_create(face);
+ hb_face_destroy(face);
hb_font_set_funcs(font, getHbFontFuncs(), minikinPaint, 0);
// TODO: manage ownership of face
return font;
@@ -176,6 +177,12 @@ static hb_position_t HBFloatToFixed(float v)
return scalbnf (v, +8);
}
+Layout::~Layout() {
+ for (size_t ix = 0; ix < mHbFonts.size(); ix++) {
+ hb_font_destroy(mHbFonts[ix]);
+ }
+}
+
void Layout::dump() const {
for (size_t i = 0; i < mGlyphs.size(); i++) {
const LayoutGlyph& glyph = mGlyphs[i];