mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-08-15 08:53:07 +09:00
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:
parent
41216b88f6
commit
0b450a3def
4 changed files with 45 additions and 9 deletions
12
dom/cache/CacheOpChild.cpp
vendored
12
dom/cache/CacheOpChild.cpp
vendored
|
|
@ -74,7 +74,11 @@ CacheOpChild::CacheOpChild(CacheWorkerHolder* aWorkerHolder,
|
|||
MOZ_DIAGNOSTIC_ASSERT(mPromise);
|
||||
|
||||
MOZ_ASSERT_IF(!NS_IsMainThread(), aWorkerHolder);
|
||||
SetWorkerHolder(aWorkerHolder);
|
||||
RefPtr<CacheWorkerHolder> workerHolder =
|
||||
CacheWorkerHolder::PreferBehavior(aWorkerHolder,
|
||||
CacheWorkerHolder::PreventIdleShutdownStart);
|
||||
|
||||
SetWorkerHolder(workerHolder);
|
||||
}
|
||||
|
||||
CacheOpChild::~CacheOpChild()
|
||||
|
|
@ -165,7 +169,11 @@ CacheOpChild::Recv__delete__(const ErrorResult& aRv,
|
|||
break;
|
||||
}
|
||||
|
||||
actor->SetWorkerHolder(GetWorkerHolder());
|
||||
RefPtr<CacheWorkerHolder> workerHolder =
|
||||
CacheWorkerHolder::PreferBehavior(GetWorkerHolder(),
|
||||
CacheWorkerHolder::AllowIdleShutdownStart);
|
||||
|
||||
actor->SetWorkerHolder(workerHolder);
|
||||
RefPtr<Cache> cache = new Cache(mGlobal, actor);
|
||||
mPromise->MaybeResolve(cache);
|
||||
break;
|
||||
|
|
|
|||
3
dom/cache/CacheStorage.cpp
vendored
3
dom/cache/CacheStorage.cpp
vendored
|
|
@ -204,7 +204,8 @@ CacheStorage::CreateOnWorker(Namespace aNamespace, nsIGlobalObject* aGlobal,
|
|||
}
|
||||
|
||||
RefPtr<CacheWorkerHolder> workerHolder =
|
||||
CacheWorkerHolder::Create(aWorkerPrivate);
|
||||
CacheWorkerHolder::Create(aWorkerPrivate,
|
||||
CacheWorkerHolder::AllowIdleShutdownStart);
|
||||
if (!workerHolder) {
|
||||
NS_WARNING("Worker thread is shutting down.");
|
||||
aRv.Throw(NS_ERROR_FAILURE);
|
||||
|
|
|
|||
31
dom/cache/CacheWorkerHolder.cpp
vendored
31
dom/cache/CacheWorkerHolder.cpp
vendored
|
|
@ -18,11 +18,11 @@ using mozilla::dom::workers::WorkerPrivate;
|
|||
|
||||
// static
|
||||
already_AddRefed<CacheWorkerHolder>
|
||||
CacheWorkerHolder::Create(WorkerPrivate* aWorkerPrivate)
|
||||
CacheWorkerHolder::Create(WorkerPrivate* aWorkerPrivate, Behavior aBehavior)
|
||||
{
|
||||
MOZ_DIAGNOSTIC_ASSERT(aWorkerPrivate);
|
||||
|
||||
RefPtr<CacheWorkerHolder> workerHolder = new CacheWorkerHolder();
|
||||
RefPtr<CacheWorkerHolder> workerHolder = new CacheWorkerHolder(aBehavior);
|
||||
if (NS_WARN_IF(!workerHolder->HoldWorker(aWorkerPrivate, Terminating))) {
|
||||
return nullptr;
|
||||
}
|
||||
|
|
@ -30,6 +30,28 @@ CacheWorkerHolder::Create(WorkerPrivate* aWorkerPrivate)
|
|||
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
|
||||
CacheWorkerHolder::AddActor(ActorChild* aActor)
|
||||
{
|
||||
|
|
@ -88,8 +110,9 @@ CacheWorkerHolder::Notify(Status aStatus)
|
|||
return true;
|
||||
}
|
||||
|
||||
CacheWorkerHolder::CacheWorkerHolder()
|
||||
: mNotified(false)
|
||||
CacheWorkerHolder::CacheWorkerHolder(Behavior aBehavior)
|
||||
: WorkerHolder(aBehavior)
|
||||
, mNotified(false)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
8
dom/cache/CacheWorkerHolder.h
vendored
8
dom/cache/CacheWorkerHolder.h
vendored
|
|
@ -25,7 +25,11 @@ class CacheWorkerHolder final : public workers::WorkerHolder
|
|||
{
|
||||
public:
|
||||
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 RemoveActor(ActorChild* aActor);
|
||||
|
|
@ -36,7 +40,7 @@ public:
|
|||
virtual bool Notify(workers::Status aStatus) override;
|
||||
|
||||
private:
|
||||
CacheWorkerHolder();
|
||||
explicit CacheWorkerHolder(Behavior aBehavior);
|
||||
~CacheWorkerHolder();
|
||||
|
||||
nsTArray<ActorChild*> mActorList;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue