diff options
author | Raph Levien <raph@google.com> | 2014-05-05 16:11:17 -0700 |
---|---|---|
committer | Raph Levien <raph@google.com> | 2014-05-12 10:28:15 -0700 |
commit | b80c1f19c58b927820a8a24bf2218e5645724608 (patch) | |
tree | e00dec46530cfec05ea82512605ff2bf3ff32f28 /include | |
parent | ecc2d34ac23a497988f21e5f415b53c007b9d8c5 (diff) | |
download | android_frameworks_minikin-b80c1f19c58b927820a8a24bf2218e5645724608.tar.gz android_frameworks_minikin-b80c1f19c58b927820a8a24bf2218e5645724608.tar.bz2 android_frameworks_minikin-b80c1f19c58b927820a8a24bf2218e5645724608.zip |
Better refcounting and locking
All major externally accessible objects (especially FontFamily and
FontCollection) are now reference counted. In addition, there is a
global lock intended to make operations thread-safe.
WIP notice: in this version of the patch, not all external API entry
points are protected by the lock. That should be fixed.
Change-Id: I14106196e99eb101e8bf1bcb4b81359759d2086c
Diffstat (limited to 'include')
-rw-r--r-- | include/minikin/FontCollection.h | 11 | ||||
-rw-r--r-- | include/minikin/FontFamily.h | 6 | ||||
-rw-r--r-- | include/minikin/MinikinFont.h | 19 | ||||
-rw-r--r-- | include/minikin/MinikinRefCounted.h | 42 |
4 files changed, 56 insertions, 22 deletions
diff --git a/include/minikin/FontCollection.h b/include/minikin/FontCollection.h index a2a5391..dc48f8e 100644 --- a/include/minikin/FontCollection.h +++ b/include/minikin/FontCollection.h @@ -19,13 +19,14 @@ #include <vector> +#include <minikin/MinikinRefCounted.h> #include <minikin/MinikinFont.h> #include <minikin/SparseBitSet.h> #include <minikin/FontFamily.h> namespace android { -class FontCollection { +class FontCollection : public MinikinRefCounted { public: explicit FontCollection(const std::vector<FontFamily*>& typefaces); @@ -37,17 +38,17 @@ public: // Do copy constructor, assignment, destructor so it can be used in vectors Run() : font(NULL) { } Run(const Run& other): font(other.font), start(other.start), end(other.end) { - if (font) font->Ref(); + if (font) font->RefLocked(); } Run& operator=(const Run& other) { - if (other.font) other.font->Ref(); - if (font) font->Unref(); + if (other.font) other.font->RefLocked(); + if (font) font->UnrefLocked(); font = other.font; start = other.start; end = other.end; return *this; } - ~Run() { if (font) font->Unref(); } + ~Run() { if (font) font->UnrefLocked(); } MinikinFont* font; int start; diff --git a/include/minikin/FontFamily.h b/include/minikin/FontFamily.h index 290220b..3b59017 100644 --- a/include/minikin/FontFamily.h +++ b/include/minikin/FontFamily.h @@ -19,6 +19,8 @@ #include <vector> +#include <minikin/MinikinRefCounted.h> + namespace android { // FontStyle represents all style information needed to select an actual font @@ -39,8 +41,10 @@ private: uint32_t bits; }; -class FontFamily { +class FontFamily : public MinikinRefCounted { public: + ~FontFamily(); + // Add font to family, extracting style information from the font bool addFont(MinikinFont* typeface); diff --git a/include/minikin/MinikinFont.h b/include/minikin/MinikinFont.h index e84f5df..568f19d 100644 --- a/include/minikin/MinikinFont.h +++ b/include/minikin/MinikinFont.h @@ -17,6 +17,8 @@ #ifndef MINIKIN_FONT_H #define MINIKIN_FONT_H +#include <minikin/MinikinRefCounted.h> + // An abstraction for platform fonts, allowing Minikin to be used with // multiple actual implementations of fonts. @@ -56,15 +58,8 @@ struct MinikinRect { class MinikinFontFreeType; -class MinikinFont { +class MinikinFont : public MinikinRefCounted { public: - void Ref() { mRefcount_++; } - void Unref() { if (--mRefcount_ == 0) { delete this; } } - - MinikinFont() : mRefcount_(1) { } - - virtual ~MinikinFont() { }; - virtual bool GetGlyph(uint32_t codepoint, uint32_t *glyph) const = 0; virtual float GetHorizontalAdvance(uint32_t glyph_id, @@ -82,14 +77,6 @@ public: return ((uint32_t)c1 << 24) | ((uint32_t)c2 << 16) | ((uint32_t)c3 << 8) | (uint32_t)c4; } - - // This is used to implement a downcast without RTTI - virtual MinikinFontFreeType* GetFreeType() { - return NULL; - } - -private: - int mRefcount_; }; } // namespace android diff --git a/include/minikin/MinikinRefCounted.h b/include/minikin/MinikinRefCounted.h new file mode 100644 index 0000000..74d27fe --- /dev/null +++ b/include/minikin/MinikinRefCounted.h @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Base class for reference counted objects in Minikin + +#ifndef MINIKIN_REF_COUNTED_H +#define MINIKIN_REF_COUNTED_H + +namespace android { + +class MinikinRefCounted { +public: + void RefLocked() { mRefcount_++; } + void UnrefLocked() { if (--mRefcount_ == 0) { delete this; } } + + // These refcount operations take the global lock. + void Ref(); + void Unref(); + + MinikinRefCounted() : mRefcount_(1) { } + + virtual ~MinikinRefCounted() { }; +private: + int mRefcount_; +}; + +} + +#endif // MINIKIN_REF_COUNTED_H
\ No newline at end of file |