forked from mirrors/gecko-dev
Pending->Canceling->Killing (WorkerNeverRan) Need to clear WorkerPrivate::mPreStartRunnables Could we call WorkerRunnable::WorkerRun() to release resource? There could be no WorkerGlobalScope... Pending->Running->Closing->Canceling->Killing(WorkerRan) Pending->Running->Canceling->Killing(WorkerRan) When entering “Closing” 1. Keeping receives normal WorkerRunnables 2. Making ParentStatus as Closing 3. Cancel all timeout 4. Don’t clear the main event queue anymore. But we still wait for all SyncLoops be completed. 5. Call WorkerGlobalScope::NoteTerminating() and nsIGlobalObject::DisconnectEventTargetObjects(). 6. Switching to “Canceling” by asking parent thread to call WorkerPrivate::Cancel() When entering “Canceling” 1. Call WorkerGlobalScope::NoteTerminating() 2. Notify StrongWorkerRefs, worker is in “Canceling”, send and complete the corresponding shutdown work right now. 3. Executing all runnables until no normal WorkerRunnables in queue and no WorkerRefs, SyncLoops and children workers 4. Stop receiving normal WorkerRunnables and DisconnectEventTargetObjects of WorkerScope. 4. Entering “Killing” When entering “Killing” 1. We would not notify WorkerRefs anymore. Logically all WorkerRefs should be released in “Canceling” 2. Executing all remaining ControlRunnables 3. Release corresponding resources of Worker on worker thread. Depends on D173850 Differential Revision: https://phabricator.services.mozilla.com/D177511
61 lines
2.1 KiB
C++
61 lines
2.1 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "PerformanceWorker.h"
|
|
#include "mozilla/dom/WorkerScope.h"
|
|
#include "mozilla/StaticPrefs_dom.h"
|
|
|
|
namespace mozilla::dom {
|
|
|
|
PerformanceWorker::PerformanceWorker(WorkerGlobalScope* aGlobalScope)
|
|
: Performance(aGlobalScope) {
|
|
MOZ_ASSERT(aGlobalScope);
|
|
WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate();
|
|
MOZ_DIAGNOSTIC_ASSERT(workerPrivate);
|
|
workerPrivate->AssertIsOnWorkerThread();
|
|
}
|
|
|
|
PerformanceWorker::~PerformanceWorker() {
|
|
WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate();
|
|
if (workerPrivate) {
|
|
workerPrivate->AssertIsOnWorkerThread();
|
|
}
|
|
}
|
|
|
|
void PerformanceWorker::InsertUserEntry(PerformanceEntry* aEntry) {
|
|
if (StaticPrefs::dom_performance_enable_user_timing_logging()) {
|
|
nsAutoCString uri;
|
|
WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate();
|
|
MOZ_DIAGNOSTIC_ASSERT(workerPrivate);
|
|
nsCOMPtr<nsIURI> scriptURI = workerPrivate->GetResolvedScriptURI();
|
|
if (!scriptURI || NS_FAILED(scriptURI->GetHost(uri))) {
|
|
// If we have no URI, just put in "none".
|
|
uri.AssignLiteral("none");
|
|
}
|
|
Performance::LogEntry(aEntry, uri);
|
|
}
|
|
Performance::InsertUserEntry(aEntry);
|
|
}
|
|
|
|
TimeStamp PerformanceWorker::CreationTimeStamp() const {
|
|
WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate();
|
|
MOZ_DIAGNOSTIC_ASSERT(workerPrivate);
|
|
return workerPrivate->CreationTimeStamp();
|
|
}
|
|
|
|
DOMHighResTimeStamp PerformanceWorker::CreationTime() const {
|
|
WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate();
|
|
MOZ_DIAGNOSTIC_ASSERT(workerPrivate);
|
|
return workerPrivate->CreationTime();
|
|
}
|
|
|
|
uint64_t PerformanceWorker::GetRandomTimelineSeed() {
|
|
WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate();
|
|
MOZ_DIAGNOSTIC_ASSERT(workerPrivate);
|
|
return workerPrivate->GetRandomTimelineSeed();
|
|
}
|
|
|
|
} // namespace mozilla::dom
|