# Global Metrics

path: .metrics.halstead.volume
old: 10110.524624064596
new: 5723.632360468999
path: .metrics.halstead.purity_ratio
old: 1.246142017060739
new: 1.4247571855639705
path: .metrics.halstead.n2
old: 191.0
new: 137.0
path: .metrics.halstead.estimated_program_length
old: 1613.753912093657
new: 1107.036333183205
path: .metrics.halstead.length
old: 1295.0
new: 777.0
path: .metrics.halstead.level
old: 0.018700739217702066
new: 0.030109890109890108
path: .metrics.halstead.n1
old: 33.0
new: 28.0
path: .metrics.halstead.time
old: 30036.02188710988
new: 10560.635539389272
path: .metrics.halstead.effort
old: 540648.3939679778
new: 190091.4397090069
path: .metrics.halstead.difficulty
old: 53.473821989528794
new: 33.21167883211679
path: .metrics.halstead.N2
old: 619.0
new: 325.0
path: .metrics.halstead.bugs
old: 2.212187955499246
new: 1.1020140171091266
path: .metrics.halstead.N1
old: 676.0
new: 452.0
path: .metrics.halstead.vocabulary
old: 224.0
new: 165.0
path: .metrics.cyclomatic.sum
old: 46.0
new: 40.0
path: .metrics.cyclomatic.average
old: 2.090909090909091
new: 1.6
path: .metrics.nexits.sum
old: 16.0
new: 7.0
path: .metrics.nexits.average
old: 0.9411764705882352
new: 0.4375
path: .metrics.mi.mi_sei
old: -27.208696669149298
new: -10.88946763748392
path: .metrics.mi.mi_visual_studio
old: 7.12629413648554
new: 14.72553586440203
path: .metrics.mi.mi_original
old: 12.185962973390277
new: 25.180666328127472
path: .metrics.nom.functions
old: 17.0
new: 16.0
path: .metrics.nom.total
old: 17.0
new: 16.0
path: .metrics.nargs.sum
old: 55.0
new: 5.0
path: .metrics.nargs.average
old: 3.235294117647059
new: 0.3125
path: .metrics.cognitive.average
old: 1.8823529411764703
new: 0.6875
path: .metrics.cognitive.sum
old: 32.0
new: 11.0
path: .metrics.loc.ploc
old: 373.0
new: 194.0
path: .metrics.loc.sloc
old: 488.0
new: 286.0
path: .metrics.loc.cloc
old: 62.0
new: 31.0
path: .metrics.loc.lloc
old: 87.0
new: 48.0
path: .metrics.loc.blank
old: 53.0
new: 61.0

# Spaces Data

## Minimal test - lines (44, 226)

path: .spaces[3].metrics.nom.total
old: 1.0
new: 12.0
path: .spaces[3].metrics.nom.functions
old: 1.0
new: 12.0
path: .spaces[3].metrics.nargs.average
old: 3.0
new: 0.16666666666666666
path: .spaces[3].metrics.nargs.sum
old: 3.0
new: 2.0
path: .spaces[3].metrics.cyclomatic.average
old: 3.0
new: 1.8571428571428572
path: .spaces[3].metrics.cyclomatic.sum
old: 3.0
new: 26.0
path: .spaces[3].metrics.mi.mi_original
old: 86.97710700312962
new: 37.226564323703755
path: .spaces[3].metrics.mi.mi_sei
old: 50.08604853048445
new: 2.764327780374341
path: .spaces[3].metrics.mi.mi_visual_studio
old: 50.86380526498808
new: 21.769920657136694
path: .spaces[3].metrics.halstead.difficulty
old: 16.0
new: 30.796116504854368
path: .spaces[3].metrics.halstead.n1
old: 12.0
new: 26.0
path: .spaces[3].metrics.halstead.estimated_program_length
old: 153.0586500259616
new: 810.9209869715398
path: .spaces[3].metrics.halstead.N1
old: 70.0
new: 357.0
path: .spaces[3].metrics.halstead.n2
old: 24.0
new: 103.0
path: .spaces[3].metrics.halstead.time
old: 615.7955112829064
new: 7209.281189523052
path: .spaces[3].metrics.halstead.vocabulary
old: 36.0
new: 129.0
path: .spaces[3].metrics.halstead.purity_ratio
old: 1.142228731537027
new: 1.34928616800589
path: .spaces[3].metrics.halstead.volume
old: 692.7699501932698
new: 4213.747580509375
path: .spaces[3].metrics.halstead.N2
old: 64.0
new: 244.0
path: .spaces[3].metrics.halstead.effort
old: 11084.319203092316
new: 129767.06141141494
path: .spaces[3].metrics.halstead.bugs
old: 0.16571103427117215
new: 0.8543878400223639
path: .spaces[3].metrics.halstead.level
old: 0.0625
new: 0.032471626733921816
path: .spaces[3].metrics.halstead.length
old: 134.0
new: 601.0
path: .spaces[3].metrics.nexits.sum
old: 0.0
new: 6.0
path: .spaces[3].metrics.nexits.average
old: 0.0
new: 0.5
path: .spaces[3].metrics.loc.sloc
old: 21.0
new: 183.0
path: .spaces[3].metrics.loc.ploc
old: 21.0
new: 132.0
path: .spaces[3].metrics.loc.cloc
old: 0.0
new: 16.0
path: .spaces[3].metrics.loc.blank
old: 0.0
new: 35.0
path: .spaces[3].metrics.loc.lloc
old: 14.0
new: 39.0
path: .spaces[3].metrics.cognitive.average
old: 3.0
new: 0.6666666666666666
path: .spaces[3].metrics.cognitive.sum
old: 3.0
new: 8.0

### Code

    class nsTimerImpl {
      ~nsTimerImpl() { MOZ_ASSERT(!mHolder); }

     public:
      typedef mozilla::TimeStamp TimeStamp;

      nsTimerImpl(nsITimer* aTimer, nsIEventTarget* aTarget);
      NS_INLINE_DECL_THREADSAFE_REFCOUNTING(nsTimerImpl)
      NS_DECL_NON_VIRTUAL_NSITIMER

      static nsresult Startup();
      static void Shutdown();

      void SetDelayInternal(uint32_t aDelay, TimeStamp aBase = TimeStamp::Now());
      void CancelImpl(bool aClearITimer);

      void Fire(int32_t aGeneration);

    #ifdef MOZ_TASK_TRACER
      void GetTLSTraceInfo();
      mozilla::tasktracer::TracedTaskCommon GetTracedTask();
    #endif

      int32_t GetGeneration() { return mGeneration; }

      struct Callback {
        Callback() : mType(Type::Unknown), mName(Nothing), mClosure(nullptr) {
          mCallback.c = nullptr;
        }

        Callback(const Callback& other) : Callback() { *this = other; }

        enum class Type : uint8_t {
          Unknown = 0,
          Interface = 1,
          Function = 2,
          Observer = 3,
        };

        Callback& operator=(const Callback& other) {
          if (this != &other) {
            clear();
            mType = other.mType;
            switch (mType) {
              case Type::Unknown:
                break;
              case Type::Interface:
                mCallback.i = other.mCallback.i;
                NS_ADDREF(mCallback.i);
                break;
              case Type::Function:
                mCallback.c = other.mCallback.c;
                break;
              case Type::Observer:
                mCallback.o = other.mCallback.o;
                NS_ADDREF(mCallback.o);
                break;
            }
            mName = other.mName;
            mClosure = other.mClosure;
          }
          return *this;
        }

        ~Callback() { clear(); }

        void clear() {
          if (mType == Type::Interface) {
            NS_RELEASE(mCallback.i);
          } else if (mType == Type::Observer) {
            NS_RELEASE(mCallback.o);
          }
          mType = Type::Unknown;
        }

        void swap(Callback& other) {
          std::swap(mType, other.mType);
          std::swap(mCallback, other.mCallback);
          std::swap(mName, other.mName);
          std::swap(mClosure, other.mClosure);
        }

        Type mType;

        union CallbackUnion {
          nsTimerCallbackFunc c;
          // These refcounted references are managed manually, as they are in a
          // union
          nsITimerCallback* MOZ_OWNING_REF i;
          nsIObserver* MOZ_OWNING_REF o;
        } mCallback;

        // |Name| is a tagged union type representing one of (a) nothing, (b) a
        // string, or (c) a function. mozilla::Variant doesn't naturally handle the
        // "nothing" case, so we define a dummy type and value (which is unused and
        // so the exact value doesn't matter) for it.
        typedef const int NameNothing;
        typedef const char* NameString;
        typedef nsTimerNameCallbackFunc NameFunc;
        typedef mozilla::Variant Name;
        static const NameNothing Nothing;
        Name mName;

        void* mClosure;
      };

      nsresult InitCommon(uint32_t aDelayMS, uint32_t aType,
                          Callback&& newCallback);

      nsresult InitCommon(const mozilla::TimeDuration& aDelay, uint32_t aType,
                          Callback&& newCallback);

      Callback& GetCallback() {
        mMutex.AssertCurrentThreadOwns();
        return mCallback;
      }

      bool IsRepeating() const {
        static_assert(nsITimer::TYPE_ONE_SHOT < nsITimer::TYPE_REPEATING_SLACK,
                      "invalid ordering of timer types!");
        static_assert(
            nsITimer::TYPE_REPEATING_SLACK < nsITimer::TYPE_REPEATING_PRECISE,
            "invalid ordering of timer types!");
        static_assert(nsITimer::TYPE_REPEATING_PRECISE <
                          nsITimer::TYPE_REPEATING_PRECISE_CAN_SKIP,
                      "invalid ordering of timer types!");
        return mType >= nsITimer::TYPE_REPEATING_SLACK &&
               mType < nsITimer::TYPE_ONE_SHOT_LOW_PRIORITY;
      }

      bool IsLowPriority() const {
        return mType == nsITimer::TYPE_ONE_SHOT_LOW_PRIORITY ||
               mType == nsITimer::TYPE_REPEATING_SLACK_LOW_PRIORITY;
      }

      bool IsSlack() const {
        return mType == nsITimer::TYPE_REPEATING_SLACK ||
               mType == nsITimer::TYPE_REPEATING_SLACK_LOW_PRIORITY;
      }

      void GetName(nsACString& aName);

      void SetHolder(nsTimerImplHolder* aHolder);

      nsCOMPtr mEventTarget;

      void LogFiring(const Callback& aCallback, uint8_t aType, uint32_t aDelay);

      nsresult InitWithFuncCallbackCommon(nsTimerCallbackFunc aFunc, void* aClosure,
                                          uint32_t aDelay, uint32_t aType,
                                          const Callback::Name& aName);

      // This weak reference must be cleared by the nsTimerImplHolder by calling
      // SetHolder(nullptr) before the holder is destroyed.
      nsTimerImplHolder* mHolder;

      // These members are set by the initiating thread, when the timer's type is
      // changed and during the period where it fires on that thread.
      uint8_t mType;

      // The generation number of this timer, re-generated each time the timer is
      // initialized so one-shot timers can be canceled and re-initialized by the
      // arming thread without any bad race conditions.
      // Updated only after this timer has been removed from the timer thread.
      int32_t mGeneration;

      mozilla::TimeDuration mDelay;
      // Updated only after this timer has been removed from the timer thread.
      mozilla::TimeStamp mTimeout;

    #ifdef MOZ_TASK_TRACER
      mozilla::tasktracer::TracedTaskCommon mTracedTask;
    #endif

      static double sDeltaSum;
      static double sDeltaSumSquared;
      static double sDeltaNum;
      RefPtr mITimer;
      mozilla::Mutex mMutex;
      Callback mCallback;
      // Counter because in rare cases we can Fire reentrantly
      unsigned int mFiring;
    };

## Minimal test - lines (37, 39)

path: .spaces[2].metrics.cognitive.average
old: 0.0
new: null
path: .spaces[2].metrics.nom.total
old: 1.0
new: 0.0
path: .spaces[2].metrics.nom.functions
old: 1.0
new: 0.0
path: .spaces[2].metrics.halstead.n2
old: 9.0
new: 2.0
path: .spaces[2].metrics.halstead.n1
old: 9.0
new: 2.0
path: .spaces[2].metrics.halstead.estimated_program_length
old: 57.05865002596162
new: 4.0
path: .spaces[2].metrics.halstead.purity_ratio
old: 2.282346001038465
new: 1.0
path: .spaces[2].metrics.halstead.vocabulary
old: 18.0
new: 4.0
path: .spaces[2].metrics.halstead.volume
old: 104.2481250360578
new: 8.0
path: .spaces[2].metrics.halstead.time
old: 31.85359376101766
new: 0.4444444444444444
path: .spaces[2].metrics.halstead.bugs
old: 0.02300555456638979
new: 0.0013333333333333333
path: .spaces[2].metrics.halstead.N1
old: 14.0
new: 2.0
path: .spaces[2].metrics.halstead.N2
old: 11.0
new: 2.0
path: .spaces[2].metrics.halstead.effort
old: 573.3646876983179
new: 8.0
path: .spaces[2].metrics.halstead.level
old: 0.18181818181818185
new: 1.0
path: .spaces[2].metrics.halstead.length
old: 25.0
new: 4.0
path: .spaces[2].metrics.halstead.difficulty
old: 5.5
new: 1.0
path: .spaces[2].metrics.mi.mi_original
old: 117.5802724471975
new: 141.92938490684145
path: .spaces[2].metrics.mi.mi_sei
old: 133.02597635258363
new: 129.26360748831726
path: .spaces[2].metrics.mi.mi_visual_studio
old: 68.76039324397514
new: 82.99964029639851
path: .spaces[2].metrics.nexits.average
old: 1.0
new: null
path: .spaces[2].metrics.nexits.sum
old: 1.0
new: 0.0
path: .spaces[2].metrics.nargs.sum
old: 1.0
new: 0.0
path: .spaces[2].metrics.nargs.average
old: 1.0
new: null
path: .spaces[2].metrics.cyclomatic.sum
old: 1.0
new: 2.0
path: .spaces[2].metrics.loc.lloc
old: 1.0
new: 0.0
path: .spaces[2].metrics.loc.sloc
old: 6.0
new: 3.0
path: .spaces[2].metrics.loc.ploc
old: 4.0
new: 3.0
path: .spaces[2].metrics.loc.cloc
old: 2.0
new: 0.0

### Code

    namespace mozilla {
    class LogModule;
    }

## Minimal test - lines (35, 35)

path: .spaces[1].metrics.halstead.N2
old: 6.0
new: 1.0
path: .spaces[1].metrics.halstead.n2
old: 6.0
new: 1.0
path: .spaces[1].metrics.halstead.vocabulary
old: 9.0
new: 1.0
path: .spaces[1].metrics.halstead.length
old: 14.0
new: 1.0
path: .spaces[1].metrics.halstead.difficulty
old: 1.5
new: 0.0
path: .spaces[1].metrics.halstead.effort
old: 66.56842503028855
new: 0.0
path: .spaces[1].metrics.halstead.estimated_program_length
old: 20.264662506490403
new: null
path: .spaces[1].metrics.halstead.volume
old: 44.37895002019237
new: 0.0
path: .spaces[1].metrics.halstead.bugs
old: 0.005475085848401926
new: 0.0
path: .spaces[1].metrics.halstead.n1
old: 3.0
new: 0.0
path: .spaces[1].metrics.halstead.level
old: 0.6666666666666666
new: null
path: .spaces[1].metrics.halstead.N1
old: 8.0
new: 0.0
path: .spaces[1].metrics.halstead.time
old: 3.6982458350160305
new: 0.0
path: .spaces[1].metrics.halstead.purity_ratio
old: 1.447475893320743
new: null
path: .spaces[1].metrics.mi.mi_sei
old: 129.99658447562217
new: null
path: .spaces[1].metrics.mi.mi_visual_studio
old: 71.35737851167426
new: null
path: .spaces[1].metrics.mi.mi_original
old: 122.02111725496296
new: null
path: .spaces[1].metrics.loc.sloc
old: 6.0
new: 1.0
path: .spaces[1].metrics.loc.cloc
old: 1.0
new: 0.0
path: .spaces[1].metrics.loc.ploc
old: 6.0
new: 1.0

### Code

    class nsTimerImplHolder;

## Minimal test - lines (34, 34)

path: .spaces[0].metrics.loc.blank
old: 3.0
new: 0.0
path: .spaces[0].metrics.loc.cloc
old: 2.0
new: 0.0
path: .spaces[0].metrics.loc.ploc
old: 7.0
new: 1.0
path: .spaces[0].metrics.loc.sloc
old: 12.0
new: 1.0
path: .spaces[0].metrics.mi.mi_original
old: 109.32806050611424
new: null
path: .spaces[0].metrics.mi.mi_sei
old: 111.68437445033597
new: null
path: .spaces[0].metrics.mi.mi_visual_studio
old: 63.93453830766914
new: null
path: .spaces[0].metrics.halstead.n2
old: 7.0
new: 1.0
path: .spaces[0].metrics.halstead.N1
old: 10.0
new: 0.0
path: .spaces[0].metrics.halstead.estimated_program_length
old: 27.651484454403228
new: null
path: .spaces[0].metrics.halstead.level
old: 0.5
new: null
path: .spaces[0].metrics.halstead.n1
old: 4.0
new: 0.0
path: .spaces[0].metrics.halstead.difficulty
old: 2.0
new: 0.0
path: .spaces[0].metrics.halstead.length
old: 17.0
new: 1.0
path: .spaces[0].metrics.halstead.effort
old: 117.6206750336681
new: 0.0
path: .spaces[0].metrics.halstead.volume
old: 58.81033751683405
new: 0.0
path: .spaces[0].metrics.halstead.time
old: 6.534481946314894
new: 0.0
path: .spaces[0].metrics.halstead.purity_ratio
old: 1.6265579090825428
new: null
path: .spaces[0].metrics.halstead.bugs
old: 0.008002048702810353
new: 0.0
path: .spaces[0].metrics.halstead.N2
old: 7.0
new: 1.0
path: .spaces[0].metrics.halstead.vocabulary
old: 11.0
new: 1.0

### Code

    class nsIObserver;

## Minimal test - lines (228, 255)

path: .spaces[4].metrics.halstead.volume
old: 104.2481250360578
new: 361.20986172877406
path: .spaces[4].metrics.halstead.N2
old: 12.0
new: 32.0
path: .spaces[4].metrics.halstead.n1
old: 9.0
new: 12.0
path: .spaces[4].metrics.halstead.difficulty
old: 6.0
new: 8.727272727272727
path: .spaces[4].metrics.halstead.length
old: 25.0
new: 71.0
path: .spaces[4].metrics.halstead.vocabulary
old: 18.0
new: 34.0
path: .spaces[4].metrics.halstead.N1
old: 13.0
new: 39.0
path: .spaces[4].metrics.halstead.purity_ratio
old: 2.282346001038465
new: 1.9877048678686535
path: .spaces[4].metrics.halstead.level
old: 0.16666666666666666
new: 0.11458333333333334
path: .spaces[4].metrics.halstead.estimated_program_length
old: 57.05865002596162
new: 141.1270456186744
path: .spaces[4].metrics.halstead.bugs
old: 0.024379516068267628
new: 0.07166451671469155
path: .spaces[4].metrics.halstead.effort
old: 625.4887502163468
new: 3152.3769750874826
path: .spaces[4].metrics.halstead.time
old: 34.74937501201927
new: 175.13205417152682
path: .spaces[4].metrics.halstead.n2
old: 9.0
new: 22.0
path: .spaces[4].metrics.mi.mi_visual_studio
old: 70.48765009781262
new: 50.25327455621647
path: .spaces[4].metrics.mi.mi_sei
old: 98.29460120784424
new: 76.11052135095986
path: .spaces[4].metrics.mi.mi_original
old: 120.53388166725958
new: 85.93309949113016
path: .spaces[4].metrics.cyclomatic.sum
old: 1.0
new: 2.0
path: .spaces[4].metrics.nexits.average
old: 1.0
new: 0.0
path: .spaces[4].metrics.nexits.sum
old: 1.0
new: 0.0
path: .spaces[4].metrics.loc.blank
old: 0.0
new: 7.0
path: .spaces[4].metrics.loc.ploc
old: 5.0
new: 17.0
path: .spaces[4].metrics.loc.cloc
old: 0.0
new: 4.0
path: .spaces[4].metrics.loc.lloc
old: 1.0
new: 0.0
path: .spaces[4].metrics.loc.sloc
old: 5.0
new: 28.0
path: .spaces[4].metrics.nargs.average
old: 2.0
new: 1.0
path: .spaces[4].metrics.nargs.sum
old: 2.0
new: 1.0

### Code

    class nsTimer final : public nsITimer {
      explicit nsTimer(nsIEventTarget* aTarget)
          : mImpl(new nsTimerImpl(this, aTarget)) {}

      virtual ~nsTimer();

     public:
      friend class TimerThread;
      friend class nsTimerEvent;

      NS_DECL_THREADSAFE_ISUPPORTS
      NS_FORWARD_SAFE_NSITIMER(mImpl);

      virtual size_t SizeOfIncludingThis(
          mozilla::MallocSizeOf aMallocSizeOf) const override;

      // Create a timer targeting the given target.  nullptr indicates that the
      // current thread should be used as the timer's target.
      static RefPtr WithEventTarget(nsIEventTarget* aTarget);

      static nsresult XPCOMConstructor(nsISupports* aOuter, REFNSIID aIID,
                                       void** aResult);

     private:
      // nsTimerImpl holds a strong ref to us. When our refcount goes to 1, we will
      // null this to break the cycle.
      RefPtr mImpl;
    };

## Minimal test - lines (259, 284)

path: .spaces[5].metrics.cognitive.sum
old: 0.0
new: 3.0
path: .spaces[5].metrics.cognitive.average
old: 0.0
new: 1.0
path: .spaces[5].metrics.nargs.average
old: 1.0
new: 0.6666666666666666
path: .spaces[5].metrics.nargs.sum
old: 1.0
new: 2.0
path: .spaces[5].metrics.nexits.average
old: 1.0
new: 0.3333333333333333
path: .spaces[5].metrics.loc.lloc
old: 1.0
new: 9.0
path: .spaces[5].metrics.loc.ploc
old: 5.0
new: 23.0
path: .spaces[5].metrics.loc.sloc
old: 5.0
new: 26.0
path: .spaces[5].metrics.loc.blank
old: 0.0
new: 3.0
path: .spaces[5].metrics.mi.mi_visual_studio
old: 71.76322352505298
new: 50.39360432282213
path: .spaces[5].metrics.mi.mi_original
old: 122.7151122278406
new: 86.17306339202582
path: .spaces[5].metrics.mi.mi_sei
old: 101.44145172062991
new: 49.33333823770444
path: .spaces[5].metrics.nom.functions
old: 1.0
new: 3.0
path: .spaces[5].metrics.nom.total
old: 1.0
new: 3.0
path: .spaces[5].metrics.cyclomatic.sum
old: 1.0
new: 7.0
path: .spaces[5].metrics.cyclomatic.average
old: 1.0
new: 1.75
path: .spaces[5].metrics.halstead.N2
old: 9.0
new: 30.0
path: .spaces[5].metrics.halstead.n2
old: 7.0
new: 10.0
path: .spaces[5].metrics.halstead.n1
old: 7.0
new: 15.0
path: .spaces[5].metrics.halstead.vocabulary
old: 14.0
new: 25.0
path: .spaces[5].metrics.halstead.purity_ratio
old: 2.1834982727114696
new: 1.2243018651066857
path: .spaces[5].metrics.halstead.bugs
old: 0.01521543361852368
new: 0.131510503656422
path: .spaces[5].metrics.halstead.level
old: 0.2222222222222222
new: 0.044444444444444446
path: .spaces[5].metrics.halstead.difficulty
old: 4.5
new: 22.5
path: .spaces[5].metrics.halstead.time
old: 17.133097149259218
new: 435.3615177913804
path: .spaces[5].metrics.halstead.volume
old: 68.53238859703687
new: 348.2892142331043
path: .spaces[5].metrics.halstead.effort
old: 308.3957486866659
new: 7836.507320244847
path: .spaces[5].metrics.halstead.N1
old: 9.0
new: 45.0
path: .spaces[5].metrics.halstead.length
old: 18.0
new: 75.0
path: .spaces[5].metrics.halstead.estimated_program_length
old: 39.302968908806456
new: 91.8226398830014

### Code

    class nsTimerImplHolder {
     public:
      explicit nsTimerImplHolder(nsTimerImpl* aTimerImpl) : mTimerImpl(aTimerImpl) {
        if (mTimerImpl) {
          mTimerImpl->SetHolder(this);
        }
      }

      ~nsTimerImplHolder() {
        if (mTimerImpl) {
          mTimerImpl->SetHolder(nullptr);
        }
      }

      void Forget(nsTimerImpl* aTimerImpl) {
        if (MOZ_UNLIKELY(!mTimerImpl)) {
          return;
        }
        MOZ_ASSERT(aTimerImpl == mTimerImpl);
        mTimerImpl->SetHolder(nullptr);
        mTimerImpl = nullptr;
      }

     protected:
      RefPtr mTimerImpl;
    };