mirror of
https://github.com/roytam1/UXP.git
synced 2026-05-29 17:31:07 +00: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:
Vendored
+10
-2
@@ -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;
|
||||
|
||||
Vendored
+2
-1
@@ -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);
|
||||
|
||||
Vendored
+27
-4
@@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
Vendored
+6
-2
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user