Global Metrics
path: .metrics.halstead.N2
old: 51.0
new: 84.0
path: .metrics.halstead.estimated_program_length
old: 125.54887502163469
new: 281.4351007880244
path: .metrics.halstead.difficulty
old: 6.375
new: 12.69767441860465
path: .metrics.halstead.vocabulary
old: 30.0
new: 56.0
path: .metrics.halstead.effort
old: 2815.3284792303875
new: 15264.159720948708
path: .metrics.halstead.volume
old: 441.6201536047667
new: 1202.122468865924
path: .metrics.halstead.level
old: 0.1568627450980392
new: 0.07875457875457875
path: .metrics.halstead.n1
old: 6.0
new: 13.0
path: .metrics.halstead.n2
old: 24.0
new: 43.0
path: .metrics.halstead.length
old: 90.0
new: 207.0
path: .metrics.halstead.purity_ratio
old: 1.394987500240385
new: 1.359589858879345
path: .metrics.halstead.N1
old: 39.0
new: 123.0
path: .metrics.halstead.bugs
old: 0.06646068211642485
new: 0.20511339031022563
path: .metrics.halstead.time
old: 156.40713773502154
new: 848.0088733860393
path: .metrics.loc.sloc
old: 143.0
new: 111.0
path: .metrics.loc.blank
old: 15.0
new: 20.0
path: .metrics.loc.cloc
old: 100.0
new: 37.0
path: .metrics.loc.ploc
old: 28.0
new: 54.0
path: .metrics.nom.functions
old: 0.0
new: 2.0
path: .metrics.nom.total
old: 0.0
new: 2.0
path: .metrics.nexits.average
old: null
new: 0.0
path: .metrics.mi.mi_original
old: 57.781576305399454
new: 56.21802195184101
path: .metrics.mi.mi_sei
old: 56.286682825135784
new: 45.10988102157327
path: .metrics.mi.mi_visual_studio
old: 33.7903955002336
new: 32.87603622914679
path: .metrics.nargs.average
old: null
new: 0.0
path: .metrics.cyclomatic.sum
old: 5.0
new: 7.0
path: .metrics.cognitive.average
old: null
new: 0.0
Spaces Data
Minimal test - lines (16, 109)
path: .spaces[0].metrics.nexits.average
old: null
new: 0.0
path: .spaces[0].metrics.mi.mi_visual_studio
old: null
new: 34.80784321503811
path: .spaces[0].metrics.mi.mi_original
old: null
new: 59.52141189771517
path: .spaces[0].metrics.mi.mi_sei
old: null
new: 49.6240997896565
path: .spaces[0].metrics.cyclomatic.sum
old: 1.0
new: 6.0
path: .spaces[0].metrics.nargs.average
old: null
new: 0.0
path: .spaces[0].metrics.halstead.level
old: null
new: 0.07287449392712551
path: .spaces[0].metrics.halstead.N1
old: 0.0
new: 123.0
path: .spaces[0].metrics.halstead.difficulty
old: 0.0
new: 13.72222222222222
path: .spaces[0].metrics.halstead.purity_ratio
old: null
new: 1.1770000823505398
path: .spaces[0].metrics.halstead.n1
old: 0.0
new: 13.0
path: .spaces[0].metrics.halstead.vocabulary
old: 1.0
new: 49.0
path: .spaces[0].metrics.halstead.N2
old: 1.0
new: 76.0
path: .spaces[0].metrics.halstead.bugs
old: 0.0
new: 0.2057225853425428
path: .spaces[0].metrics.halstead.effort
old: 0.0
new: 15332.212942655267
path: .spaces[0].metrics.halstead.estimated_program_length
old: null
new: 234.2230163877574
path: .spaces[0].metrics.halstead.n2
old: 1.0
new: 36.0
path: .spaces[0].metrics.halstead.length
old: 1.0
new: 199.0
path: .spaces[0].metrics.halstead.volume
old: 0.0
new: 1117.3272589789265
path: .spaces[0].metrics.halstead.time
old: 0.0
new: 851.7896079252927
path: .spaces[0].metrics.cognitive.average
old: null
new: 0.0
path: .spaces[0].metrics.loc.sloc
old: 1.0
new: 94.0
path: .spaces[0].metrics.loc.blank
old: 0.0
new: 18.0
path: .spaces[0].metrics.loc.ploc
old: 1.0
new: 45.0
path: .spaces[0].metrics.loc.cloc
old: 0.0
new: 31.0
path: .spaces[0].metrics.nom.functions
old: 0.0
new: 2.0
path: .spaces[0].metrics.nom.total
old: 0.0
new: 2.0
Code
namespace mozilla {
class VsyncObserver {
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VsyncObserver)
public:
// The method called when a vsync occurs. Return true if some work was done.
// In general, this vsync notification will occur on the hardware vsync
// thread from VsyncSource. But it might also be called on PVsync ipc thread
// if this notification is cross process. Thus all observer should check the
// thread model before handling the real task.
virtual bool NotifyVsync(const VsyncEvent& aVsync) = 0;
protected:
VsyncObserver() = default;
virtual ~VsyncObserver() = default;
}; // VsyncObserver
// Used to dispatch vsync events in the parent process to compositors.
//
// When the compositor is in-process, CompositorWidgets own a
// CompositorVsyncDispatcher, and directly attach the compositor's observer
// to it.
//
// When the compositor is out-of-process, the CompositorWidgetDelegate owns
// the vsync dispatcher instead. The widget receives vsync observer/unobserve
// commands via IPDL, and uses this to attach a CompositorWidgetVsyncObserver.
// This observer forwards vsync notifications (on the vsync thread) to a
// dedicated vsync I/O thread, which then forwards the notification to the
// compositor thread in the compositor process.
class CompositorVsyncDispatcher final {
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(CompositorVsyncDispatcher)
public:
CompositorVsyncDispatcher();
explicit CompositorVsyncDispatcher(RefPtr aVsyncSource);
// Called on the vsync thread when a hardware vsync occurs
void NotifyVsync(const VsyncEvent& aVsync);
void MoveToSource(const RefPtr& aVsyncSource);
// Compositor vsync observers must be added/removed on the compositor thread
void SetCompositorVsyncObserver(VsyncObserver* aVsyncObserver);
void Shutdown();
private:
virtual ~CompositorVsyncDispatcher();
void ObserveVsync(bool aEnable);
RefPtr mVsyncSource;
Mutex mCompositorObserverLock;
RefPtr mCompositorVsyncObserver;
bool mDidShutdown;
};
// Dispatch vsync event to ipc actor parent and chrome RefreshTimer.
class RefreshTimerVsyncDispatcher final {
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(RefreshTimerVsyncDispatcher)
public:
explicit RefreshTimerVsyncDispatcher(gfx::VsyncSource::Display* aDisplay);
// Please check CompositorVsyncDispatcher::NotifyVsync().
void NotifyVsync(const VsyncEvent& aVsync);
void MoveToDisplay(gfx::VsyncSource::Display* aDisplay);
// Set chrome process's RefreshTimer to this dispatcher.
// This function can be called from any thread.
void SetParentRefreshTimer(VsyncObserver* aVsyncObserver);
// Add or remove the content process' RefreshTimer to this dispatcher. This
// will be a no-op for AddChildRefreshTimer() if the observer is already
// registered.
// These functions can be called from any thread.
void AddChildRefreshTimer(VsyncObserver* aVsyncObserver);
void RemoveChildRefreshTimer(VsyncObserver* aVsyncObserver);
private:
virtual ~RefreshTimerVsyncDispatcher();
void UpdateVsyncStatus();
bool NeedsVsync();
// We need to hold a weak ref to the display we belong to in order to notify
// it of our vsync requirement. The display holds a RefPtr to us, so we can't
// hold a RefPtr back without causing a cyclic dependency.
gfx::VsyncSource::Display* mDisplay;
Mutex mRefreshTimersLock;
RefPtr mParentRefreshTimer;
nsTArray> mChildRefreshTimers;
};
} // namespace mozilla