Global Metrics

path: .metrics.nexits.average
old: null
new: 1.411764705882353

path: .metrics.nexits.sum
old: 0.0
new: 24.0

path: .metrics.nom.functions
old: 0.0
new: 17.0

path: .metrics.nom.total
old: 0.0
new: 17.0

path: .metrics.nargs.average
old: null
new: 1.588235294117647

path: .metrics.nargs.sum
old: 0.0
new: 27.0

path: .metrics.loc.ploc
old: 31.0
new: 269.0

path: .metrics.loc.sloc
old: 63.0
new: 360.0

path: .metrics.loc.blank
old: 10.0
new: 61.0

path: .metrics.loc.lloc
old: 0.0
new: 94.0

path: .metrics.loc.cloc
old: 22.0
new: 30.0

path: .metrics.halstead.volume
old: 433.9617123740648
new: 9567.922322345832

path: .metrics.halstead.n1
old: 9.0
new: 31.0

path: .metrics.halstead.length
old: 81.0
new: 1202.0

path: .metrics.halstead.vocabulary
old: 41.0
new: 249.0

path: .metrics.halstead.bugs
old: 0.05941979052208534
new: 1.6199198881127927

path: .metrics.halstead.N1
old: 42.0
new: 704.0

path: .metrics.halstead.estimated_program_length
old: 188.5293250129808
new: 1847.044268423363

path: .metrics.halstead.purity_ratio
old: 2.3275225310244547
new: 1.5366424862091206

path: .metrics.halstead.effort
old: 2380.0087663015115
new: 338783.4514045297

path: .metrics.halstead.level
old: 0.18233618233618237
new: 0.02824200025910092

path: .metrics.halstead.n2
old: 32.0
new: 218.0

path: .metrics.halstead.N2
old: 39.0
new: 498.0

path: .metrics.halstead.difficulty
old: 5.484375
new: 35.408256880733944

path: .metrics.halstead.time
old: 132.22270923897287
new: 18821.302855807204

path: .metrics.cyclomatic.average
old: 1.0
new: 2.6666666666666665

path: .metrics.cyclomatic.sum
old: 8.0
new: 56.0

path: .metrics.cognitive.average
old: null
new: 2.4705882352941178

path: .metrics.cognitive.sum
old: 0.0
new: 42.0

path: .metrics.mi.mi_sei
old: 66.41128077785477
new: -26.590026013448337

path: .metrics.mi.mi_visual_studio
old: 41.20575708837435
new: 8.831007971114092

path: .metrics.mi.mi_original
old: 70.46184462112014
new: 15.101023630605098

Spaces Data

Minimal test - lines (139, 139)

path: .spaces[2].metrics.cognitive.average
old: null
new: 0.0

path: .spaces[2].metrics.halstead.bugs
old: 0.05154748076954636
new: 0.006240251469155711

path: .spaces[2].metrics.halstead.level
old: 0.18518518518518515
new: 0.3333333333333333

path: .spaces[2].metrics.halstead.length
old: 70.0
new: 9.0

path: .spaces[2].metrics.halstead.purity_ratio
old: 2.066081853676413
new: 1.9455305560363263

path: .spaces[2].metrics.halstead.effort
old: 1923.0609539926284
new: 81.0

path: .spaces[2].metrics.halstead.difficulty
old: 5.4
new: 3.0

path: .spaces[2].metrics.halstead.vocabulary
old: 34.0
new: 8.0

path: .spaces[2].metrics.halstead.N2
old: 30.0
new: 2.0

path: .spaces[2].metrics.halstead.estimated_program_length
old: 144.62572975734892
new: 17.509775004326936

path: .spaces[2].metrics.halstead.volume
old: 356.12239888752373
new: 27.0

path: .spaces[2].metrics.halstead.n1
old: 9.0
new: 6.0

path: .spaces[2].metrics.halstead.n2
old: 25.0
new: 2.0

path: .spaces[2].metrics.halstead.time
old: 106.83671966625712
new: 4.5

path: .spaces[2].metrics.halstead.N1
old: 40.0
new: 7.0

path: .spaces[2].metrics.loc.cloc
old: 16.0
new: 0.0

path: .spaces[2].metrics.loc.blank
old: 6.0
new: 0.0

path: .spaces[2].metrics.loc.lloc
old: 0.0
new: 1.0

path: .spaces[2].metrics.loc.ploc
old: 21.0
new: 1.0

path: .spaces[2].metrics.loc.sloc
old: 43.0
new: 1.0

path: .spaces[2].metrics.nargs.sum
old: 0.0
new: 1.0

path: .spaces[2].metrics.nargs.average
old: null
new: 1.0

path: .spaces[2].metrics.nom.total
old: 0.0
new: 1.0

path: .spaces[2].metrics.nom.functions
old: 0.0
new: 1.0

path: .spaces[2].metrics.cyclomatic.sum
old: 5.0
new: 1.0

path: .spaces[2].metrics.mi.mi_original
old: 78.36713078369092
new: 153.6316482967775

path: .spaces[2].metrics.mi.mi_sei
old: 78.39293791706353
new: 146.04458498874996

path: .spaces[2].metrics.mi.mi_visual_studio
old: 45.82873145245083
new: 89.84306917940205

path: .spaces[2].metrics.nexits.average
old: null
new: 0.0

Code

nsObserverService::~nsObserverService(void) { Shutdown(); }

Minimal test - lines (137, 137)

path: .spaces[1].metrics.halstead.difficulty
old: 0.0
new: 2.0

path: .spaces[1].metrics.halstead.time
old: 0.0
new: 2.495426597384537

path: .spaces[1].metrics.halstead.n1
old: 0.0
new: 4.0

path: .spaces[1].metrics.halstead.N2
old: 1.0
new: 3.0

path: .spaces[1].metrics.halstead.estimated_program_length
old: null
new: 12.754887502163468

path: .spaces[1].metrics.halstead.length
old: 1.0
new: 8.0

path: .spaces[1].metrics.halstead.N1
old: 0.0
new: 5.0

path: .spaces[1].metrics.halstead.effort
old: 0.0
new: 44.91767875292167

path: .spaces[1].metrics.halstead.level
old: null
new: 0.5

path: .spaces[1].metrics.halstead.volume
old: 0.0
new: 22.458839376460833

path: .spaces[1].metrics.halstead.bugs
old: 0.0
new: 0.00421201861424495

path: .spaces[1].metrics.halstead.purity_ratio
old: null
new: 1.5943609377704335

path: .spaces[1].metrics.halstead.n2
old: 1.0
new: 3.0

path: .spaces[1].metrics.halstead.vocabulary
old: 1.0
new: 7.0

path: .spaces[1].metrics.mi.mi_original
old: null
new: 154.58924178123317

path: .spaces[1].metrics.mi.mi_sei
old: null
new: 147.42610035996177

path: .spaces[1].metrics.mi.mi_visual_studio
old: null
new: 90.4030653691422

path: .spaces[1].metrics.nexits.average
old: null
new: 0.0

path: .spaces[1].metrics.cognitive.average
old: null
new: 0.0

path: .spaces[1].metrics.nom.total
old: 0.0
new: 1.0

path: .spaces[1].metrics.nom.functions
old: 0.0
new: 1.0

path: .spaces[1].metrics.nargs.average
old: null
new: 0.0

Code

nsObserverService::nsObserverService() : mShuttingDown(false) {}

Minimal test - lines (45, 129)

path: .spaces[0].metrics.cognitive.sum
old: 0.0
new: 17.0

path: .spaces[0].metrics.cognitive.average
old: null
new: 8.5

path: .spaces[0].metrics.mi.mi_original
old: null
new: 56.955261626451104

path: .spaces[0].metrics.mi.mi_visual_studio
old: null
new: 33.30717054178427

path: .spaces[0].metrics.mi.mi_sei
old: null
new: 23.97526391221701

path: .spaces[0].metrics.nargs.sum
old: 0.0
new: 5.0

path: .spaces[0].metrics.nargs.average
old: null
new: 2.5

path: .spaces[0].metrics.nom.total
old: 0.0
new: 2.0

path: .spaces[0].metrics.nom.functions
old: 0.0
new: 2.0

path: .spaces[0].metrics.loc.cloc
old: 0.0
new: 4.0

path: .spaces[0].metrics.loc.blank
old: 0.0
new: 10.0

path: .spaces[0].metrics.loc.ploc
old: 1.0
new: 71.0

path: .spaces[0].metrics.loc.lloc
old: 0.0
new: 20.0

path: .spaces[0].metrics.loc.sloc
old: 1.0
new: 85.0

path: .spaces[0].metrics.cyclomatic.average
old: 1.0
new: 3.3333333333333335

path: .spaces[0].metrics.cyclomatic.sum
old: 1.0
new: 10.0

path: .spaces[0].metrics.halstead.bugs
old: 0.0
new: 0.4730053409772802

path: .spaces[0].metrics.halstead.vocabulary
old: 1.0
new: 89.0

path: .spaces[0].metrics.halstead.effort
old: 0.0
new: 53454.091045914385

path: .spaces[0].metrics.halstead.estimated_program_length
old: null
new: 501.4930078641573

path: .spaces[0].metrics.halstead.difficulty
old: 0.0
new: 25.476923076923075

path: .spaces[0].metrics.halstead.n2
old: 1.0
new: 65.0

path: .spaces[0].metrics.halstead.volume
old: 0.0
new: 2098.137631633113

path: .spaces[0].metrics.halstead.level
old: null
new: 0.0392512077294686

path: .spaces[0].metrics.halstead.n1
old: 0.0
new: 24.0

path: .spaces[0].metrics.halstead.N2
old: 1.0
new: 138.0

path: .spaces[0].metrics.halstead.time
old: 0.0
new: 2969.671724773021

path: .spaces[0].metrics.halstead.N1
old: 0.0
new: 186.0

path: .spaces[0].metrics.halstead.length
old: 1.0
new: 324.0

path: .spaces[0].metrics.halstead.purity_ratio
old: null
new: 1.5478179255066582

path: .spaces[0].metrics.nexits.sum
old: 0.0
new: 1.0

path: .spaces[0].metrics.nexits.average
old: null
new: 0.5

Code

nsObserverService::CollectReports(nsIHandleReportCallback* aHandleReport,
                                  nsISupports* aData, bool aAnonymize) {
  struct SuspectObserver {
    SuspectObserver(const char* aTopic, size_t aReferentCount)
        : mTopic(aTopic), mReferentCount(aReferentCount) {}
    const char* mTopic;
    size_t mReferentCount;
  };

  size_t totalNumStrong = 0;
  size_t totalNumWeakAlive = 0;
  size_t totalNumWeakDead = 0;
  nsTArray suspectObservers;

  for (auto iter = mObserverTopicTable.Iter(); !iter.Done(); iter.Next()) {
    nsObserverList* observerList = iter.Get();
    if (!observerList) {
      continue;
    }

    size_t topicNumStrong = 0;
    size_t topicNumWeakAlive = 0;
    size_t topicNumWeakDead = 0;

    nsMaybeWeakPtrArray& observers = observerList->mObservers;
    for (uint32_t i = 0; i < observers.Length(); i++) {
      if (observers[i].IsWeak()) {
        nsCOMPtr ref = observers[i].GetValue();
        if (ref) {
          topicNumWeakAlive++;
        } else {
          topicNumWeakDead++;
        }
      } else {
        topicNumStrong++;
      }
    }

    totalNumStrong += topicNumStrong;
    totalNumWeakAlive += topicNumWeakAlive;
    totalNumWeakDead += topicNumWeakDead;

    // Keep track of topics that have a suspiciously large number
    // of referents (symptom of leaks).
    size_t topicTotal = topicNumStrong + topicNumWeakAlive + topicNumWeakDead;
    if (topicTotal > kSuspectReferentCount) {
      SuspectObserver suspect(observerList->GetKey(), topicTotal);
      suspectObservers.AppendElement(suspect);
    }
  }

  // These aren't privacy-sensitive and so don't need anonymizing.
  for (uint32_t i = 0; i < suspectObservers.Length(); i++) {
    SuspectObserver& suspect = suspectObservers[i];
    nsPrintfCString suspectPath("observer-service-suspect/referent(topic=%s)",
                                suspect.mTopic);
    aHandleReport->Callback(
        /* process */ ""_ns, suspectPath, KIND_OTHER, UNITS_COUNT,
        suspect.mReferentCount,
        nsLiteralCString("A topic with a suspiciously large number of "
                         "referents.  This may be symptomatic of a leak "
                         "if the number of referents is high with "
                         "respect to the number of windows."),
        aData);
  }

  MOZ_COLLECT_REPORT(
      "observer-service/referent/strong", KIND_OTHER, UNITS_COUNT,
      totalNumStrong,
      "The number of strong references held by the observer service.");

  MOZ_COLLECT_REPORT(
      "observer-service/referent/weak/alive", KIND_OTHER, UNITS_COUNT,
      totalNumWeakAlive,
      "The number of weak references held by the observer service that are "
      "still alive.");

  MOZ_COLLECT_REPORT(
      "observer-service/referent/weak/dead", KIND_OTHER, UNITS_COUNT,
      totalNumWeakDead,
      "The number of weak references held by the observer service that are "
      "dead.");

  return NS_OK;
}