diff options
author | Moonchild <moonchild@palemoon.org> | 2022-02-09 23:34:40 +0000 |
---|---|---|
committer | Moonchild <moonchild@palemoon.org> | 2022-04-03 01:12:47 +0200 |
commit | 77816bbdab47a350fdbf90c4894dda6b07699275 (patch) | |
tree | 1e007afc4fc2846ae1c3cf36d23c85f24c480467 | |
parent | 4cabda52ec322fe595a5aaa99ceda67491220432 (diff) | |
download | uxp-77816bbdab47a350fdbf90c4894dda6b07699275.tar.gz |
[DOM] worker cleanup.
-rw-r--r-- | dom/workers/WorkerPrivate.cpp | 54 |
1 files changed, 36 insertions, 18 deletions
diff --git a/dom/workers/WorkerPrivate.cpp b/dom/workers/WorkerPrivate.cpp index 1d9459cd07..cf270703e0 100644 --- a/dom/workers/WorkerPrivate.cpp +++ b/dom/workers/WorkerPrivate.cpp @@ -4646,9 +4646,14 @@ WorkerPrivate::DoRunLoop(JSContext* aCx) AssertIsOnWorkerThread(); MOZ_ASSERT(mThread); + RefPtr<WorkerThread> thread; { MutexAutoLock lock(mMutex); mJSContext = aCx; + // mThread is set before we enter, and is never changed during DoRunLoop. + // copy to local so we don't trigger mutex analysis + MOZ_ASSERT(mThread); + thread = mThread; MOZ_ASSERT(mStatus == Pending); mStatus = Running; @@ -4678,7 +4683,7 @@ WorkerPrivate::DoRunLoop(JSContext* aCx) while (mControlQueue.IsEmpty() && !(debuggerRunnablesPending = !mDebuggerQueue.IsEmpty()) && - !(normalRunnablesPending = NS_HasPendingEvents(mThread))) { + !(normalRunnablesPending = NS_HasPendingEvents(thread))) { WaitForWorkerEvents(); } @@ -4688,7 +4693,7 @@ WorkerPrivate::DoRunLoop(JSContext* aCx) // irrelevant // The state of the world may have changed, recheck it. - normalRunnablesPending = NS_HasPendingEvents(mThread); + normalRunnablesPending = NS_HasPendingEvents(thread); // The debugger queue doesn't get cleared, so we can ignore that. } @@ -4781,9 +4786,9 @@ WorkerPrivate::DoRunLoop(JSContext* aCx) } } else if (normalRunnablesPending) { // Process a single runnable from the main queue. - NS_ProcessNextEvent(mThread, false); + NS_ProcessNextEvent(thread, false); - normalRunnablesPending = NS_HasPendingEvents(mThread); + normalRunnablesPending = NS_HasPendingEvents(thread); if (normalRunnablesPending && GlobalScope()) { // Now *might* be a good time to GC. Let the JS engine make the decision. JSAutoCompartment ac(aCx, GlobalScope()->GetGlobalJSObject()); @@ -5185,10 +5190,14 @@ WorkerPrivate::ClearMainEventQueue(WorkerRanOrNot aRanOrNot) mCancelAllPendingRunnables = true; if (WorkerNeverRan == aRanOrNot) { - for (uint32_t count = mPreStartRunnables.Length(), index = 0; - index < count; + nsTArray<RefPtr<WorkerRunnable>> prestart; + { + MutexAutoLock lock(mMutex); + mPreStartRunnables.SwapElements(prestart); + } + for (uint32_t count = prestart.Length(), index = 0; index < count; index++) { - RefPtr<WorkerRunnable> runnable = mPreStartRunnables[index].forget(); + RefPtr<WorkerRunnable> runnable = prestart[index].forget(); static_cast<nsIRunnable*>(runnable.get())->Run(); } } else { @@ -5434,20 +5443,20 @@ WorkerPrivate::CreateNewSyncLoop(Status aFailStatus) { AssertIsOnWorkerThread(); + nsCOMPtr<nsIEventTarget> realEventTarget; { MutexAutoLock lock(mMutex); if (mStatus >= aFailStatus) { return nullptr; } + + nsCOMPtr<nsIThreadInternal> thread = do_QueryInterface(NS_GetCurrentThread()); + MOZ_ASSERT(thread); + + MOZ_ALWAYS_SUCCEEDS(thread->PushEventQueue(getter_AddRefs(realEventTarget))); } - nsCOMPtr<nsIThreadInternal> thread = do_QueryInterface(NS_GetCurrentThread()); - MOZ_ASSERT(thread); - - nsCOMPtr<nsIEventTarget> realEventTarget; - MOZ_ALWAYS_SUCCEEDS(thread->PushEventQueue(getter_AddRefs(realEventTarget))); - RefPtr<EventTarget> workerEventTarget = new EventTarget(this, realEventTarget); @@ -5469,9 +5478,18 @@ WorkerPrivate::RunCurrentSyncLoop() { AssertIsOnWorkerThread(); + RefPtr<WorkerThread> thread; JSContext* cx = GetJSContext(); MOZ_ASSERT(cx); + // mThread is set before we enter, and is never changed during + // RunCurrentSyncLoop. + { + MutexAutoLock lock(mMutex); + // Copy to local + thread = mThread; + } + // This should not change between now and the time we finish running this sync // loop. uint32_t currentLoopIndex = mSyncLoopStack.Length() - 1; @@ -5490,7 +5508,7 @@ WorkerPrivate::RunCurrentSyncLoop() bool normalRunnablesPending = false; // Don't block with the periodic GC timer running. - if (!NS_HasPendingEvents(mThread)) { + if (!NS_HasPendingEvents(thread)) { SetGCTimerMode(IdleTimer); } @@ -5501,7 +5519,7 @@ WorkerPrivate::RunCurrentSyncLoop() for (;;) { while (mControlQueue.IsEmpty() && !normalRunnablesPending && - !(normalRunnablesPending = NS_HasPendingEvents(mThread))) { + !(normalRunnablesPending = NS_HasPendingEvents(thread))) { WaitForWorkerEvents(); } @@ -5510,7 +5528,7 @@ WorkerPrivate::RunCurrentSyncLoop() // XXXkhuey how should we handle Abort here? See Bug 1003730. // The state of the world may have changed. Recheck it. - normalRunnablesPending = NS_HasPendingEvents(mThread); + normalRunnablesPending = NS_HasPendingEvents(thread); // NB: If we processed a NotifyRunnable, we might have run // non-control runnables, one of which may have shut down the @@ -5533,7 +5551,7 @@ WorkerPrivate::RunCurrentSyncLoop() // Make sure the periodic timer is running before we continue. SetGCTimerMode(PeriodicTimer); - MOZ_ALWAYS_TRUE(NS_ProcessNextEvent(mThread, false)); + MOZ_ALWAYS_TRUE(NS_ProcessNextEvent(thread, false)); // Now *might* be a good time to GC. Let the JS engine make the decision. if (JS::CurrentGlobalOrNull(cx)) { @@ -5542,7 +5560,7 @@ WorkerPrivate::RunCurrentSyncLoop() } } - // Make sure that the stack didn't change underneath us. + // Make sure that the stack didn't change under us. MOZ_ASSERT(mSyncLoopStack[currentLoopIndex] == loopInfo); return DestroySyncLoop(currentLoopIndex); |