summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMoonchild <moonchild@palemoon.org>2022-02-09 23:34:40 +0000
committerMoonchild <moonchild@palemoon.org>2022-04-03 01:12:47 +0200
commit77816bbdab47a350fdbf90c4894dda6b07699275 (patch)
tree1e007afc4fc2846ae1c3cf36d23c85f24c480467
parent4cabda52ec322fe595a5aaa99ceda67491220432 (diff)
downloaduxp-77816bbdab47a350fdbf90c4894dda6b07699275.tar.gz
[DOM] worker cleanup.
-rw-r--r--dom/workers/WorkerPrivate.cpp54
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);