Global Metrics

path: .metrics.loc.ploc
old: 715.0
new: 72.0

path: .metrics.loc.blank
old: 0.0
new: 18.0

path: .metrics.loc.lloc
old: 86.0
new: 26.0

path: .metrics.loc.cloc
old: 325.0
new: 10.0

path: .metrics.loc.sloc
old: 878.0
new: 100.0

path: .metrics.cognitive.average
old: 2.4
new: 0.4444444444444444

path: .metrics.cognitive.sum
old: 12.0
new: 4.0

path: .metrics.cyclomatic.average
old: 3.0
new: 1.7272727272727273

path: .metrics.cyclomatic.sum
old: 18.0
new: 19.0

path: .metrics.nom.total
old: 5.0
new: 9.0

path: .metrics.nom.functions
old: 5.0
new: 9.0

path: .metrics.mi.mi_sei
old: -24.423882747631424
new: 26.287918783891215

path: .metrics.mi.mi_original
old: 6.232445247903158
new: 53.04475246627268

path: .metrics.mi.mi_visual_studio
old: 3.644704823335181
new: 31.02032307969163

path: .metrics.halstead.N2
old: 1182.0
new: 116.0

path: .metrics.halstead.difficulty
old: 48.57534246575342
new: 22.307692307692307

path: .metrics.halstead.effort
old: 854314.3484516473
new: 40189.94224016423

path: .metrics.halstead.level
old: 0.02058657642413988
new: 0.04482758620689655

path: .metrics.halstead.N1
old: 936.0
new: 176.0

path: .metrics.halstead.n2
old: 292.0
new: 52.0

path: .metrics.halstead.length
old: 2118.0
new: 292.0

path: .metrics.halstead.volume
old: 17587.4076246391
new: 1801.618100421155

path: .metrics.halstead.n1
old: 24.0
new: 20.0

path: .metrics.halstead.vocabulary
old: 316.0
new: 72.0

path: .metrics.halstead.bugs
old: 3.0011696481268983
new: 0.3911022669860427

path: .metrics.halstead.purity_ratio
old: 1.181051874981243
new: 1.3111692713735754

path: .metrics.halstead.time
old: 47461.90824731374
new: 2232.7745688980126

path: .metrics.halstead.estimated_program_length
old: 2501.4678712102727
new: 382.861427241084

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

path: .metrics.nexits.average
old: 0.0
new: 0.2222222222222222

path: .metrics.nargs.average
old: 7.2
new: 0.5555555555555556

path: .metrics.nargs.sum
old: 36.0
new: 5.0

Spaces Data

Minimal test - lines (16, 100)

path: .spaces[0].metrics.nom.functions
old: 1.0
new: 9.0

path: .spaces[0].metrics.nom.total
old: 1.0
new: 9.0

path: .spaces[0].metrics.halstead.n2
old: 94.0
new: 47.0

path: .spaces[0].metrics.halstead.n1
old: 14.0
new: 20.0

path: .spaces[0].metrics.halstead.N2
old: 185.0
new: 111.0

path: .spaces[0].metrics.halstead.volume
old: 2438.514388281012
new: 1728.835419280465

path: .spaces[0].metrics.halstead.vocabulary
old: 108.0
new: 67.0

path: .spaces[0].metrics.halstead.N1
old: 176.0
new: 174.0

path: .spaces[0].metrics.halstead.time
old: 1866.3570524964011
new: 2268.3301600488367

path: .spaces[0].metrics.halstead.level
old: 0.07258687258687259
new: 0.04234234234234235

path: .spaces[0].metrics.halstead.bugs
old: 0.347048552059426
new: 0.39524336992823594

path: .spaces[0].metrics.halstead.estimated_program_length
old: 669.4343209665043
new: 347.5042379265962

path: .spaces[0].metrics.halstead.effort
old: 33594.42694493522
new: 40829.94288087906

path: .spaces[0].metrics.halstead.purity_ratio
old: 1.854388700738239
new: 1.2193131155319166

path: .spaces[0].metrics.halstead.length
old: 361.0
new: 285.0

path: .spaces[0].metrics.halstead.difficulty
old: 13.77659574468085
new: 23.617021276595743

path: .spaces[0].metrics.loc.blank
old: 11.0
new: 14.0

path: .spaces[0].metrics.loc.lloc
old: 11.0
new: 26.0

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

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

path: .spaces[0].metrics.loc.ploc
old: 86.0
new: 67.0

path: .spaces[0].metrics.mi.mi_original
old: 54.59029209434624
new: 56.12199252247105

path: .spaces[0].metrics.mi.mi_sei
old: 23.99515409398772
new: 23.58766958341467

path: .spaces[0].metrics.mi.mi_visual_studio
old: 31.92414742359429
new: 32.81987866811172

path: .spaces[0].metrics.cognitive.average
old: 1.0
new: 0.4444444444444444

path: .spaces[0].metrics.cognitive.sum
old: 1.0
new: 4.0

path: .spaces[0].metrics.nargs.average
old: 6.0
new: 0.5555555555555556

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

path: .spaces[0].metrics.nexits.average
old: 0.0
new: 0.2222222222222222

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

path: .spaces[0].metrics.cyclomatic.average
old: 2.0
new: 1.8

path: .spaces[0].metrics.cyclomatic.sum
old: 2.0
new: 18.0

Code

namespace mozilla {

/* static */
already_AddRefed ChildProfilerController::Create(
    mozilla::ipc::Endpoint&& aEndpoint) {
  MOZ_RELEASE_ASSERT(NS_IsMainThread());
  RefPtr cpc = new ChildProfilerController();
  cpc->Init(std::move(aEndpoint));
  return cpc.forget();
}

ChildProfilerController::ChildProfilerController() {
  MOZ_COUNT_CTOR(ChildProfilerController);
}

void ChildProfilerController::Init(Endpoint&& aEndpoint) {
  if (NS_SUCCEEDED(
          NS_NewNamedThread("ProfilerChild", getter_AddRefs(mThread)))) {
    // Now that mThread has been set, run SetupProfilerChild on the thread.
    mThread->Dispatch(
        NewRunnableMethod&&>(
            "ChildProfilerController::SetupProfilerChild", this,
            &ChildProfilerController::SetupProfilerChild, std::move(aEndpoint)),
        NS_DISPATCH_NORMAL);
  }
}

nsCString ChildProfilerController::GrabShutdownProfileAndShutdown() {
  nsCString shutdownProfile;
  ShutdownAndMaybeGrabShutdownProfileFirst(&shutdownProfile);
  return shutdownProfile;
}

void ChildProfilerController::Shutdown() {
  ShutdownAndMaybeGrabShutdownProfileFirst(nullptr);
}

void ChildProfilerController::ShutdownAndMaybeGrabShutdownProfileFirst(
    nsCString* aOutShutdownProfile) {
  if (mThread) {
    mThread->Dispatch(NewRunnableMethod(
                          "ChildProfilerController::ShutdownProfilerChild",
                          this, &ChildProfilerController::ShutdownProfilerChild,
                          aOutShutdownProfile),
                      NS_DISPATCH_NORMAL);
    // Shut down the thread. This call will spin until all runnables (including
    // the ShutdownProfilerChild runnable) have been processed.
    mThread->Shutdown();
    mThread = nullptr;
  }
}

ChildProfilerController::~ChildProfilerController() {
  MOZ_COUNT_DTOR(ChildProfilerController);

  MOZ_ASSERT(!mThread,
             "Please call Shutdown before destroying ChildProfilerController");
  MOZ_ASSERT(!mProfilerChild);
}

void ChildProfilerController::SetupProfilerChild(
    Endpoint&& aEndpoint) {
  MOZ_RELEASE_ASSERT(mThread == NS_GetCurrentThread());
  MOZ_ASSERT(aEndpoint.IsValid());

  mProfilerChild = new ProfilerChild();
  Endpoint endpoint = std::move(aEndpoint);

  if (!endpoint.Bind(mProfilerChild)) {
    MOZ_CRASH("Failed to bind ProfilerChild!");
  }
}

void ChildProfilerController::ShutdownProfilerChild(
    nsCString* aOutShutdownProfile) {
  MOZ_RELEASE_ASSERT(mThread == NS_GetCurrentThread());

  if (aOutShutdownProfile) {
    *aOutShutdownProfile = mProfilerChild->GrabShutdownProfile();
  }
  mProfilerChild->Destroy();
  mProfilerChild = nullptr;
}

}  // namespace mozilla