From cdfcf4b153b5960e5d974f8c59d274a2667e0571 Mon Sep 17 00:00:00 2001 From: win7-7 Date: Wed, 28 Jan 2026 19:38:28 +0200 Subject: [PATCH] Revert back Mozilla original code, it does not crash or hang. Revert back Mozilla original code, it does not crash or hang. --- xpcom/glue/nsThreadUtils.cpp | 36 ++++++++++++------------------------ 1 file changed, 12 insertions(+), 24 deletions(-) diff --git a/xpcom/glue/nsThreadUtils.cpp b/xpcom/glue/nsThreadUtils.cpp index 039bb8e150..f30247f8cb 100644 --- a/xpcom/glue/nsThreadUtils.cpp +++ b/xpcom/glue/nsThreadUtils.cpp @@ -286,7 +286,7 @@ public: { } - NS_IMETHOD Run() override + NS_IMETHOD Run() { if (!mRunnable) { return NS_OK; @@ -296,36 +296,25 @@ public: return runnable->Run(); } - static void TimedOut(nsITimer* aTimer, void* aClosure) + static void + TimedOut(nsITimer* aTimer, void* aClosure) { - // Take ownership of the strong ref we passed in SetTimer. - RefPtr self = - dont_AddRef(static_cast(aClosure)); - - // Avoid re-entrancy: the timer has fired, drop/cancel it before running. - self->CancelTimer(); - self->Run(); + RefPtr runnable = + static_cast(aClosure); + runnable->Run(); } - void SetTimer(uint32_t aDelay, nsIThread* aTarget) override + void SetTimer(uint32_t aDelay, nsIThread* aTarget) { MOZ_ASSERT(aTarget); - - // Safe to cancel here (we're not in the timer firing path). - CancelTimer(); + MOZ_ASSERT(!mTimer); mTimer = do_CreateInstance(NS_TIMER_CONTRACTID); - if (!mTimer) { - return; + if (mTimer) { + mTimer->SetTarget(aTarget); + mTimer->InitWithFuncCallback(TimedOut, this, aDelay, + nsITimer::TYPE_ONE_SHOT); } - - mTimer->SetTarget(aTarget); - - RefPtr self = this; - mTimer->InitWithFuncCallback(&IdleRunnableWrapper::TimedOut, - self.forget().take(), // owned closure - aDelay, - nsITimer::TYPE_ONE_SHOT); } private: @@ -338,7 +327,6 @@ private: { if (mTimer) { mTimer->Cancel(); - mTimer = nullptr; } }