Global Metrics

path: .metrics.cognitive.sum
old: 36.0
new: 6.0

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

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

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

path: .metrics.cyclomatic.average
old: 2.8947368421052633
new: 1.4545454545454546

path: .metrics.cyclomatic.sum
old: 55.0
new: 16.0

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

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

path: .metrics.mi.mi_sei
old: -29.509388235226385
new: 34.25866506970071

path: .metrics.mi.mi_visual_studio
old: 1.268978424672195
new: 26.484609383282763

path: .metrics.mi.mi_original
old: 2.1699531061894533
new: 45.28868204541352

path: .metrics.halstead.volume
old: 16129.879753876166
new: 1543.5865269956753

path: .metrics.halstead.effort
old: 240304.10388143884
new: 23773.98892024589

path: .metrics.halstead.vocabulary
old: 379.0
new: 71.0

path: .metrics.halstead.N1
old: 1207.0
new: 136.0

path: .metrics.halstead.n1
old: 16.0
new: 15.0

path: .metrics.halstead.estimated_program_length
old: 3150.8887428924577
new: 383.8152345693536

path: .metrics.halstead.bugs
old: 1.28840639095166
new: 0.27560057284144757

path: .metrics.halstead.n2
old: 363.0
new: 56.0

path: .metrics.halstead.time
old: 13350.22799341327
new: 1320.7771622358828

path: .metrics.halstead.N2
old: 676.0
new: 115.0

path: .metrics.halstead.difficulty
old: 14.898071625344352
new: 15.401785714285714

path: .metrics.halstead.length
old: 1883.0
new: 251.0

path: .metrics.halstead.level
old: 0.06712278106508876
new: 0.06492753623188406

path: .metrics.halstead.purity_ratio
old: 1.6733344359492606
new: 1.529144360834078

path: .metrics.loc.ploc
old: 384.0
new: 74.0

path: .metrics.loc.blank
old: 97.0
new: 24.0

path: .metrics.loc.lloc
old: 1.0
new: 9.0

path: .metrics.loc.cloc
old: 205.0
new: 79.0

path: .metrics.loc.sloc
old: 686.0
new: 177.0

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

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

Spaces Data

Minimal test - lines (25, 175)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Code

namespace mozilla {

#if defined(XP_WIN)
typedef void* filedesc_t;
typedef const wchar_t* pathstr_t;
#else
typedef int filedesc_t;
typedef const char* pathstr_t;
#endif

/**
 * ScopedCloseFD is a RAII wrapper for POSIX file descriptors
 *
 * Instances |close()| their fds when they go out of scope.
 */
struct ScopedCloseFDTraits {
  typedef int type;
  static type empty() { return -1; }
  static void release(type aFd) {
    if (aFd != -1) {
      while (close(aFd) == -1 && errno == EINTR) {
      }
    }
  }
};
typedef Scoped ScopedClose;

#if defined(MOZILLA_INTERNAL_API)

/**
 * AutoFDClose is a RAII wrapper for PRFileDesc.
 *
 * Instances |PR_Close| their fds when they go out of scope.
 **/
struct ScopedClosePRFDTraits {
  typedef PRFileDesc* type;
  static type empty() { return nullptr; }
  static void release(type aFd) {
    if (aFd) {
      PR_Close(aFd);
    }
  }
};
typedef Scoped AutoFDClose;

/* RAII wrapper for FILE descriptors */
struct ScopedCloseFileTraits {
  typedef FILE* type;
  static type empty() { return nullptr; }
  static void release(type aFile) {
    if (aFile) {
      fclose(aFile);
    }
  }
};
typedef Scoped ScopedCloseFile;

/**
 * Fallocate efficiently and continuously allocates files via fallocate-type
 * APIs. This is useful for avoiding fragmentation. On sucess the file be padded
 * with zeros to grow to aLength.
 *
 * @param aFD file descriptor.
 * @param aLength length of file to grow to.
 * @return true on success.
 */
bool fallocate(PRFileDesc* aFD, int64_t aLength);

/**
 * Use readahead to preload shared libraries into the file cache before loading.
 * WARNING: This function should not be used without a telemetry field trial
 *          demonstrating a clear performance improvement!
 *
 * @param aFile nsIFile representing path to shared library
 */
void ReadAheadLib(nsIFile* aFile);

/**
 * Use readahead to preload a file into the file cache before reading.
 * WARNING: This function should not be used without a telemetry field trial
 *          demonstrating a clear performance improvement!
 *
 * @param aFile nsIFile representing path to shared library
 * @param aOffset Offset into the file to begin preloading
 * @param aCount Number of bytes to preload (SIZE_MAX implies file size)
 * @param aOutFd Pointer to file descriptor. If specified, ReadAheadFile will
 *        return its internal, opened file descriptor instead of closing it.
 */
void ReadAheadFile(nsIFile* aFile, const size_t aOffset = 0,
                   const size_t aCount = SIZE_MAX,
                   filedesc_t* aOutFd = nullptr);

/*
 * Wrappers for PR_GetLibraryName and PR_GetLibraryFilePathname.
 */
PathString GetLibraryName(pathstr_t aDirectory, const char* aLib);
PathString GetLibraryFilePathname(pathstr_t aName, PRFuncPtr aAddr);

#endif  // MOZILLA_INTERNAL_API

/**
 * Use readahead to preload shared libraries into the file cache before loading.
 * WARNING: This function should not be used without a telemetry field trial
 *          demonstrating a clear performance improvement!
 *
 * @param aFilePath path to shared library
 */
void ReadAheadLib(pathstr_t aFilePath);

/**
 * Use readahead to preload a file into the file cache before loading.
 * WARNING: This function should not be used without a telemetry field trial
 *          demonstrating a clear performance improvement!
 *
 * @param aFilePath path to shared library
 * @param aOffset Offset into the file to begin preloading
 * @param aCount Number of bytes to preload (SIZE_MAX implies file size)
 * @param aOutFd Pointer to file descriptor. If specified, ReadAheadFile will
 *        return its internal, opened file descriptor instead of closing it.
 */
void ReadAheadFile(pathstr_t aFilePath, const size_t aOffset = 0,
                   const size_t aCount = SIZE_MAX,
                   filedesc_t* aOutFd = nullptr);

/**
 * Use readahead to preload a file into the file cache before reading.
 * When this function exits, the file pointer is guaranteed to be in the same
 * position it was in before this function was called.
 * WARNING: This function should not be used without a telemetry field trial
 *          demonstrating a clear performance improvement!
 *
 * @param aFd file descriptor opened for read access
 * (on Windows, file must be opened with FILE_FLAG_SEQUENTIAL_SCAN)
 * @param aOffset Offset into the file to begin preloading
 * @param aCount Number of bytes to preload (SIZE_MAX implies file size)
 */
void ReadAhead(filedesc_t aFd, const size_t aOffset = 0,
               const size_t aCount = SIZE_MAX);

#if defined(XP_UNIX)
#  define MOZ_TEMP_FAILURE_RETRY(exp)        \
    (__extension__({                         \
      typeof(exp) _rc;                       \
      do {                                   \
        _rc = (exp);                         \
      } while (_rc == -1 && errno == EINTR); \
      _rc;                                   \
    }))
#endif

}  // namespace mozilla