Issue #1442 - Part 12b - Allow idle worker shutdown while Cache/CacheStorage DOM objects exist, but block it during Cache operation. https://bugzilla.mozilla.org/show_bug.cgi?id=1362444 Pre-requisite for Part 13.

This commit is contained in:
Brian Smith 2023-09-28 17:35:26 -05:00 • committed by roytam1
commit 0b450a3def
4 changed files with 45 additions and 9 deletions

View file

@ -74,7 +74,11 @@ CacheOpChild::CacheOpChild(CacheWorkerHolder* aWorkerHolder,
MOZ_DIAGNOSTIC_ASSERT(mPromise); MOZ_DIAGNOSTIC_ASSERT(mPromise);
MOZ_ASSERT_IF(!NS_IsMainThread(), aWorkerHolder); MOZ_ASSERT_IF(!NS_IsMainThread(), aWorkerHolder);
SetWorkerHolder(aWorkerHolder); RefPtr<CacheWorkerHolder> workerHolder =
CacheWorkerHolder::PreferBehavior(aWorkerHolder,
CacheWorkerHolder::PreventIdleShutdownStart);
SetWorkerHolder(workerHolder);
} }
CacheOpChild::~CacheOpChild() CacheOpChild::~CacheOpChild()
@ -165,7 +169,11 @@ CacheOpChild::Recv__delete__(const ErrorResult& aRv,
break; break;
} }
actor->SetWorkerHolder(GetWorkerHolder()); RefPtr<CacheWorkerHolder> workerHolder =
CacheWorkerHolder::PreferBehavior(GetWorkerHolder(),
CacheWorkerHolder::AllowIdleShutdownStart);
actor->SetWorkerHolder(workerHolder);
RefPtr<Cache> cache = new Cache(mGlobal, actor); RefPtr<Cache> cache = new Cache(mGlobal, actor);
mPromise->MaybeResolve(cache); mPromise->MaybeResolve(cache);
break; break;

View file

@ -204,7 +204,8 @@ CacheStorage::CreateOnWorker(Namespace aNamespace, nsIGlobalObject* aGlobal,
} }
RefPtr<CacheWorkerHolder> workerHolder = RefPtr<CacheWorkerHolder> workerHolder =
CacheWorkerHolder::Create(aWorkerPrivate); CacheWorkerHolder::Create(aWorkerPrivate,
CacheWorkerHolder::AllowIdleShutdownStart);
if (!workerHolder) { if (!workerHolder) {
NS_WARNING("Worker thread is shutting down."); NS_WARNING("Worker thread is shutting down.");
aRv.Throw(NS_ERROR_FAILURE); aRv.Throw(NS_ERROR_FAILURE);

View file

@ -18,11 +18,11 @@ using mozilla::dom::workers::WorkerPrivate;
// static // static
already_AddRefed<CacheWorkerHolder> already_AddRefed<CacheWorkerHolder>
CacheWorkerHolder::Create(WorkerPrivate* aWorkerPrivate) CacheWorkerHolder::Create(WorkerPrivate* aWorkerPrivate, Behavior aBehavior)
{ {
MOZ_DIAGNOSTIC_ASSERT(aWorkerPrivate); MOZ_DIAGNOSTIC_ASSERT(aWorkerPrivate);
RefPtr<CacheWorkerHolder> workerHolder = new CacheWorkerHolder(); RefPtr<CacheWorkerHolder> workerHolder = new CacheWorkerHolder(aBehavior);
if (NS_WARN_IF(!workerHolder->HoldWorker(aWorkerPrivate, Terminating))) { if (NS_WARN_IF(!workerHolder->HoldWorker(aWorkerPrivate, Terminating))) {
return nullptr; return nullptr;
} }
@ -30,6 +30,28 @@ CacheWorkerHolder::Create(WorkerPrivate* aWorkerPrivate)
return workerHolder.forget(); return workerHolder.forget();
} }
// static
already_AddRefed<CacheWorkerHolder>
CacheWorkerHolder::PreferBehavior(CacheWorkerHolder* aCurrentHolder,
Behavior aBehavior)
{
if (!aCurrentHolder) {
return nullptr;
}
RefPtr<CacheWorkerHolder> orig = aCurrentHolder;
if (orig->GetBehavior() == aBehavior) {
return orig.forget();
}
RefPtr<CacheWorkerHolder> replace = Create(orig->mWorkerPrivate, aBehavior);
if (!replace) {
return orig.forget();
}
return replace.forget();
}
void void
CacheWorkerHolder::AddActor(ActorChild* aActor) CacheWorkerHolder::AddActor(ActorChild* aActor)
{ {
@ -88,8 +110,9 @@ CacheWorkerHolder::Notify(Status aStatus)
return true; return true;
} }
CacheWorkerHolder::CacheWorkerHolder() CacheWorkerHolder::CacheWorkerHolder(Behavior aBehavior)
: mNotified(false) : WorkerHolder(aBehavior)
, mNotified(false)
{ {
} }

View file

@ -25,7 +25,11 @@ class CacheWorkerHolder final : public workers::WorkerHolder
{ {
public: public:
static already_AddRefed<CacheWorkerHolder> static already_AddRefed<CacheWorkerHolder>
Create(workers::WorkerPrivate* aWorkerPrivate); Create(workers::WorkerPrivate* aWorkerPrivate,
Behavior aBehavior);
static already_AddRefed<CacheWorkerHolder>
PreferBehavior(CacheWorkerHolder* aCurrentHolder, Behavior aBehavior);
void AddActor(ActorChild* aActor); void AddActor(ActorChild* aActor);
void RemoveActor(ActorChild* aActor); void RemoveActor(ActorChild* aActor);
@ -36,7 +40,7 @@ public:
virtual bool Notify(workers::Status aStatus) override; virtual bool Notify(workers::Status aStatus) override;
private: private:
CacheWorkerHolder(); explicit CacheWorkerHolder(Behavior aBehavior);
~CacheWorkerHolder(); ~CacheWorkerHolder();
nsTArray<ActorChild*> mActorList; nsTArray<ActorChild*> mActorList;