summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSeigo Nonaka <nona@google.com>2016-01-05 15:20:39 +0900
committerSeigo Nonaka <nona@google.com>2016-01-06 03:21:37 +0000
commita6f5c46836090d1197e453c15c7f04c3c796a7ab (patch)
tree92eb3e9d75db3196da22b0b185262fddaa7f2997
parent3d629534d7c69c6796eb1c8d4fc4f8e66ecd8ae8 (diff)
downloadandroid_frameworks_minikin-a6f5c46836090d1197e453c15c7f04c3c796a7ab.tar.gz
android_frameworks_minikin-a6f5c46836090d1197e453c15c7f04c3c796a7ab.tar.bz2
android_frameworks_minikin-a6f5c46836090d1197e453c15c7f04c3c796a7ab.zip
Fix race condition in Paint.hasGlyph()
The caller of FontFamily::hasVariationSelector needs to acquire the lock before calling it, but FontCollection::hasVariationSelector didn't acquire the lock. This caused a race condition. This CL fixes this race condition. Also, it turned out that assertMinikinLocked didn't assert even on eng or userdebug device. This CL enables assertion on eng and userdebug device since this assertion must be treated as bug. BUG: 26323806 Change-Id: I9c4b1e1f09c6793e387fbdb8bb654cc0a13c65d5
-rw-r--r--libs/minikin/Android.mk13
-rw-r--r--libs/minikin/FontCollection.cpp1
-rw-r--r--libs/minikin/MinikinInternal.cpp4
3 files changed, 14 insertions, 4 deletions
diff --git a/libs/minikin/Android.mk b/libs/minikin/Android.mk
index 4c945a6..b2e1dc8 100644
--- a/libs/minikin/Android.mk
+++ b/libs/minikin/Android.mk
@@ -47,11 +47,18 @@ minikin_shared_libraries := \
libicuuc \
libutils
+ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
+# Enable race detection on eng and userdebug build.
+enable_race_detection := -DENABLE_RACE_DETECTION
+else
+enable_race_detection :=
+endif
+
LOCAL_MODULE := libminikin
LOCAL_EXPORT_C_INCLUDE_DIRS := frameworks/minikin/include
LOCAL_SRC_FILES := $(minikin_src_files)
LOCAL_C_INCLUDES := $(minikin_c_includes)
-LOCAL_CPPFLAGS += -Werror -Wall -Wextra
+LOCAL_CPPFLAGS += -Werror -Wall -Wextra $(enable_race_detection)
LOCAL_SHARED_LIBRARIES := $(minikin_shared_libraries)
include $(BUILD_SHARED_LIBRARY)
@@ -63,7 +70,7 @@ LOCAL_MODULE_TAGS := optional
LOCAL_EXPORT_C_INCLUDE_DIRS := frameworks/minikin/include
LOCAL_SRC_FILES := $(minikin_src_files)
LOCAL_C_INCLUDES := $(minikin_c_includes)
-LOCAL_CPPFLAGS += -Werror -Wall -Wextra
+LOCAL_CPPFLAGS += -Werror -Wall -Wextra $(enable_race_detection)
LOCAL_SHARED_LIBRARIES := $(minikin_shared_libraries)
include $(BUILD_STATIC_LIBRARY)
@@ -76,7 +83,7 @@ LOCAL_MODULE := libminikin_host
LOCAL_MODULE_TAGS := optional
LOCAL_EXPORT_C_INCLUDE_DIRS := frameworks/minikin/include
LOCAL_C_INCLUDES := $(minikin_c_includes)
-LOCAL_CPPFLAGS += -Werror -Wall -Wextra
+LOCAL_CPPFLAGS += -Werror -Wall -Wextra $(enable_race_detection)
LOCAL_SHARED_LIBRARIES := liblog libicuuc-host
LOCAL_SRC_FILES := Hyphenator.cpp
diff --git a/libs/minikin/FontCollection.cpp b/libs/minikin/FontCollection.cpp
index bba2ef9..529b5c0 100644
--- a/libs/minikin/FontCollection.cpp
+++ b/libs/minikin/FontCollection.cpp
@@ -223,6 +223,7 @@ bool FontCollection::hasVariationSelector(uint32_t baseCodepoint,
// Currently mRanges can not be used here since it isn't aware of the variation sequence.
// TODO: Use mRanges for narrowing down the search range.
for (size_t i = 0; i < mFamilies.size(); i++) {
+ AutoMutex _l(gMinikinLock);
if (mFamilies[i]->hasVariationSelector(baseCodepoint, variationSelector)) {
return true;
}
diff --git a/libs/minikin/MinikinInternal.cpp b/libs/minikin/MinikinInternal.cpp
index 5a21ef9..c2aa01a 100644
--- a/libs/minikin/MinikinInternal.cpp
+++ b/libs/minikin/MinikinInternal.cpp
@@ -25,7 +25,9 @@ namespace android {
Mutex gMinikinLock;
void assertMinikinLocked() {
- LOG_FATAL_IF(gMinikinLock.tryLock() == 0);
+#ifdef ENABLE_RACE_DETECTION
+ LOG_ALWAYS_FATAL_IF(gMinikinLock.tryLock() == 0);
+#endif
}
}