# Global Metrics

path: .metrics.loc.blank
old: 13.0
new: 27.0
path: .metrics.loc.sloc
old: 70.0
new: 115.0
path: .metrics.loc.cloc
old: 31.0
new: 19.0
path: .metrics.loc.lloc
old: 0.0
new: 20.0
path: .metrics.loc.ploc
old: 26.0
new: 69.0
path: .metrics.mi.mi_original
old: 68.46213724751476
new: 50.23099945764207
path: .metrics.mi.mi_visual_studio
old: 40.036337571646065
new: 29.374853484001218
path: .metrics.mi.mi_sei
old: 66.16214816207993
new: 28.85958306972296
path: .metrics.cognitive.average
old: null
new: 0.0
path: .metrics.nargs.sum
old: 0.0
new: 5.0
path: .metrics.nargs.average
old: null
new: 0.2777777777777778
path: .metrics.cyclomatic.sum
old: 2.0
new: 26.0
path: .metrics.halstead.vocabulary
old: 30.0
new: 46.0
path: .metrics.halstead.volume
old: 598.6406526642393
new: 1469.2674803111654
path: .metrics.halstead.n1
old: 5.0
new: 13.0
path: .metrics.halstead.bugs
old: 0.07466462709861242
new: 0.33074612979006524
path: .metrics.halstead.N1
old: 66.0
new: 158.0
path: .metrics.halstead.effort
old: 3352.38765491974
new: 31255.32639934661
path: .metrics.halstead.estimated_program_length
old: 127.70604521880492
new: 214.57072227466315
path: .metrics.halstead.length
old: 122.0
new: 266.0
path: .metrics.halstead.n2
old: 25.0
new: 33.0
path: .metrics.halstead.difficulty
old: 5.6
new: 21.272727272727273
path: .metrics.halstead.time
old: 186.24375860665225
new: 1736.4070221859229
path: .metrics.halstead.N2
old: 56.0
new: 108.0
path: .metrics.halstead.level
old: 0.17857142857142858
new: 0.04700854700854701
path: .metrics.halstead.purity_ratio
old: 1.046770862449221
new: 0.8066568506566284
path: .metrics.nexits.sum
old: 0.0
new: 4.0
path: .metrics.nexits.average
old: null
new: 0.2222222222222222
path: .metrics.nom.functions
old: 0.0
new: 18.0
path: .metrics.nom.total
old: 0.0
new: 18.0

# Spaces Data

## Minimal test - lines (17, 113)

path: .spaces[0].metrics.nom.total
old: 0.0
new: 18.0
path: .spaces[0].metrics.nom.functions
old: 0.0
new: 18.0
path: .spaces[0].metrics.cognitive.average
old: null
new: 0.0
path: .spaces[0].metrics.halstead.n2
old: 1.0
new: 32.0
path: .spaces[0].metrics.halstead.effort
old: 0.0
new: 31217.06596281195
path: .spaces[0].metrics.halstead.purity_ratio
old: null
new: 0.7882792285448265
path: .spaces[0].metrics.halstead.volume
old: 0.0
new: 1449.849217431034
path: .spaces[0].metrics.halstead.difficulty
old: 0.0
new: 21.53125
path: .spaces[0].metrics.halstead.level
old: null
new: 0.04644412191582003
path: .spaces[0].metrics.halstead.length
old: 1.0
new: 264.0
path: .spaces[0].metrics.halstead.n1
old: 0.0
new: 13.0
path: .spaces[0].metrics.halstead.estimated_program_length
old: null
new: 208.1057163358342
path: .spaces[0].metrics.halstead.vocabulary
old: 1.0
new: 45.0
path: .spaces[0].metrics.halstead.N1
old: 0.0
new: 158.0
path: .spaces[0].metrics.halstead.N2
old: 1.0
new: 106.0
path: .spaces[0].metrics.halstead.bugs
old: 0.0
new: 0.3304761582161031
path: .spaces[0].metrics.halstead.time
old: 0.0
new: 1734.2814423784416
path: .spaces[0].metrics.nexits.sum
old: 0.0
new: 4.0
path: .spaces[0].metrics.nexits.average
old: null
new: 0.2222222222222222
path: .spaces[0].metrics.mi.mi_visual_studio
old: null
new: 31.162435654792365
path: .spaces[0].metrics.mi.mi_sei
old: null
new: 26.45117707112069
path: .spaces[0].metrics.mi.mi_original
old: null
new: 53.28776496969495
path: .spaces[0].metrics.loc.cloc
old: 0.0
new: 9.0
path: .spaces[0].metrics.loc.blank
old: 0.0
new: 24.0
path: .spaces[0].metrics.loc.lloc
old: 0.0
new: 20.0
path: .spaces[0].metrics.loc.ploc
old: 1.0
new: 64.0
path: .spaces[0].metrics.loc.sloc
old: 1.0
new: 97.0
path: .spaces[0].metrics.nargs.sum
old: 0.0
new: 5.0
path: .spaces[0].metrics.nargs.average
old: null
new: 0.2777777777777778
path: .spaces[0].metrics.cyclomatic.sum
old: 1.0
new: 25.0

### Code

    namespace mozilla {
    namespace IOInterposer {

    /**
     * The following classes are simple wrappers for PRLock and PRCondVar.
     * IOInterposer and friends use these instead of Mozilla::Mutex et al because
     * of the fact that IOInterposer is permitted to run until the process
     * terminates; we can't use anything that plugs into leak checkers or deadlock
     * detectors because IOInterposer will outlive those and generate false
     * positives.
     */

    class Monitor {
     public:
      Monitor() : mLock(PR_NewLock()), mCondVar(PR_NewCondVar(mLock)) {}

      ~Monitor() {
        PR_DestroyCondVar(mCondVar);
        mCondVar = nullptr;
        PR_DestroyLock(mLock);
        mLock = nullptr;
      }

      void Lock() { PR_Lock(mLock); }

      void Unlock() { PR_Unlock(mLock); }

      bool Wait(PRIntervalTime aTimeout = PR_INTERVAL_NO_TIMEOUT) {
        return PR_WaitCondVar(mCondVar, aTimeout) == PR_SUCCESS;
      }

      bool Notify() { return PR_NotifyCondVar(mCondVar) == PR_SUCCESS; }

     private:
      PRLock* mLock;
      PRCondVar* mCondVar;
    };

    class MonitorAutoLock {
     public:
      explicit MonitorAutoLock(Monitor& aMonitor) : mMonitor(aMonitor) {
        mMonitor.Lock();
      }

      ~MonitorAutoLock() { mMonitor.Unlock(); }

      bool Wait(PRIntervalTime aTimeout = PR_INTERVAL_NO_TIMEOUT) {
        return mMonitor.Wait(aTimeout);
      }

      bool Notify() { return mMonitor.Notify(); }

     private:
      Monitor& mMonitor;
    };

    class MonitorAutoUnlock {
     public:
      explicit MonitorAutoUnlock(Monitor& aMonitor) : mMonitor(aMonitor) {
        mMonitor.Unlock();
      }

      ~MonitorAutoUnlock() { mMonitor.Lock(); }

     private:
      Monitor& mMonitor;
    };

    class Mutex {
     public:
      Mutex() : mPRLock(PR_NewLock()) {}

      ~Mutex() {
        PR_DestroyLock(mPRLock);
        mPRLock = nullptr;
      }

      void Lock() { PR_Lock(mPRLock); }

      void Unlock() { PR_Unlock(mPRLock); }

     private:
      PRLock* mPRLock;
    };

    class AutoLock {
     public:
      explicit AutoLock(Mutex& aLock) : mLock(aLock) { mLock.Lock(); }

      ~AutoLock() { mLock.Unlock(); }

     private:
      Mutex& mLock;
    };

    }  // namespace IOInterposer
    }  // namespace mozilla