Verified Commit 9a10e774 authored by Jonathan Kew's avatar Jonathan Kew Committed by ma1
Browse files

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

parent 42609411
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -1378,6 +1378,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 {
@@ -1391,9 +1392,12 @@ void gfxFont::CheckForFeaturesInvolvingSpace() const {
  // spaces in default features of default script?
  // ==> can't use word cache, skip GPOS analysis
  bool canUseWordCache = true;
  {
    MutexAutoLock lock(mFontEntry->mFeatureInfoLock);
    if (HasSubstitution(mFontEntry->mDefaultSubSpaceFeatures, Script::COMMON)) {
      canUseWordCache = false;
    }
  }

  // GPOS lookups - distinguish kerning from non-kerning features
  if (canUseWordCache && hb_ot_layout_has_positioning(face)) {
@@ -1411,6 +1415,7 @@ void gfxFont::CheckForFeaturesInvolvingSpace() const {
  }

  if (MOZ_UNLIKELY(log)) {
    MutexAutoLock lock(mFontEntry->mFeatureInfoLock);
    TimeDuration elapsed = TimeStamp::Now() - start;
    LOG_FONTINIT((
        "(fontinit-spacelookups) font: %s - "
@@ -1445,6 +1450,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;
+4 −3
Original line number Diff line number Diff line
@@ -592,9 +592,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;