Bug 1988244 - Guard the space-features bit vectors with the feature-info mutex. a=RyanVM DONTBUILD

Original Revision: https://phabricator.services.mozilla.com/D266136

Differential Revision: https://phabricator.services.mozilla.com/D267025
This commit is contained in:
Jonathan Kew
2025-10-01 23:53:56 +00:00
committed by rvandermeulen@mozilla.com
parent f51bb96e4e
commit 7d396ff5b4
2 changed files with 12 additions and 5 deletions

View File

@@ -1427,6 +1427,7 @@ void gfxFont::CheckForFeaturesInvolvingSpace() const {
flags = flags | gfxFontEntry::SpaceFeatures::HasFeatures;
uint32_t index = static_cast<uint32_t>(s) >> 5;
uint32_t bit = static_cast<uint32_t>(s) & 0x1f;
MutexAutoLock lock(mFontEntry->mFeatureInfoLock);
if (isDefaultFeature) {
mFontEntry->mDefaultSubSpaceFeatures[index] |= (1 << bit);
} else {
@@ -1440,8 +1441,11 @@ void gfxFont::CheckForFeaturesInvolvingSpace() const {
// spaces in default features of default script?
// ==> can't use word cache, skip GPOS analysis
bool canUseWordCache = true;
if (HasSubstitution(mFontEntry->mDefaultSubSpaceFeatures, Script::COMMON)) {
canUseWordCache = false;
{
MutexAutoLock lock(mFontEntry->mFeatureInfoLock);
if (HasSubstitution(mFontEntry->mDefaultSubSpaceFeatures, Script::COMMON)) {
canUseWordCache = false;
}
}
// GPOS lookups - distinguish kerning from non-kerning features
@@ -1460,6 +1464,7 @@ void gfxFont::CheckForFeaturesInvolvingSpace() const {
}
if (MOZ_UNLIKELY(log)) {
MutexAutoLock lock(mFontEntry->mFeatureInfoLock);
TimeDuration elapsed = TimeStamp::Now() - start;
LOG_FONTINIT((
"(fontinit-spacelookups) font: %s - "
@@ -1494,6 +1499,7 @@ bool gfxFont::HasSubstitutionRulesWithSpaceLookups(Script aRunScript) const {
}
// default features have space lookups ==> true
MutexAutoLock lock(mFontEntry->mFeatureInfoLock);
if (HasSubstitution(mFontEntry->mDefaultSubSpaceFeatures, Script::COMMON) ||
HasSubstitution(mFontEntry->mDefaultSubSpaceFeatures, aRunScript)) {
return true;

View File

@@ -606,9 +606,10 @@ class gfxFontEntry {
// bitvector of substitution space features per script, one each
// for default and non-default features
uint32_t mDefaultSubSpaceFeatures[(int(Script::NUM_SCRIPT_CODES) + 31) / 32];
uint32_t
mNonDefaultSubSpaceFeatures[(int(Script::NUM_SCRIPT_CODES) + 31) / 32];
uint32_t mDefaultSubSpaceFeatures[(int(Script::NUM_SCRIPT_CODES) + 31) /
32] MOZ_GUARDED_BY(mFeatureInfoLock);
uint32_t mNonDefaultSubSpaceFeatures[(int(Script::NUM_SCRIPT_CODES) + 31) /
32] MOZ_GUARDED_BY(mFeatureInfoLock);
mozilla::Atomic<uint32_t> mUVSOffset;