Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/dom/cache/CacheWorkerHolder.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
3
/* This Source Code Form is subject to the terms of the Mozilla Public
4
 * License, v. 2.0. If a copy of the MPL was not distributed with this
5
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#include "mozilla/dom/cache/CacheWorkerHolder.h"
8
9
#include "mozilla/dom/cache/ActorChild.h"
10
#include "mozilla/dom/WorkerPrivate.h"
11
12
namespace mozilla {
13
namespace dom {
14
namespace cache {
15
16
// static
17
already_AddRefed<CacheWorkerHolder>
18
CacheWorkerHolder::Create(WorkerPrivate* aWorkerPrivate, Behavior aBehavior)
19
0
{
20
0
  MOZ_DIAGNOSTIC_ASSERT(aWorkerPrivate);
21
0
22
0
  RefPtr<CacheWorkerHolder> workerHolder = new CacheWorkerHolder(aBehavior);
23
0
  if (NS_WARN_IF(!workerHolder->HoldWorker(aWorkerPrivate, Canceling))) {
24
0
    return nullptr;
25
0
  }
26
0
27
0
  return workerHolder.forget();
28
0
}
29
30
// static
31
already_AddRefed<CacheWorkerHolder>
32
CacheWorkerHolder::PreferBehavior(CacheWorkerHolder* aCurrentHolder,
33
                                  Behavior aBehavior)
34
0
{
35
0
  if (!aCurrentHolder) {
36
0
    return nullptr;
37
0
  }
38
0
39
0
  RefPtr<CacheWorkerHolder> orig = aCurrentHolder;
40
0
  if (orig->GetBehavior() == aBehavior) {
41
0
    return orig.forget();
42
0
  }
43
0
44
0
  RefPtr<CacheWorkerHolder> replace = Create(orig->mWorkerPrivate, aBehavior);
45
0
  if (!replace) {
46
0
    return orig.forget();
47
0
  }
48
0
49
0
  return replace.forget();
50
0
}
51
52
void
53
CacheWorkerHolder::AddActor(ActorChild* aActor)
54
0
{
55
0
  NS_ASSERT_OWNINGTHREAD(CacheWorkerHolder);
56
0
  MOZ_DIAGNOSTIC_ASSERT(aActor);
57
0
  MOZ_ASSERT(!mActorList.Contains(aActor));
58
0
59
0
  mActorList.AppendElement(aActor);
60
0
61
0
  // Allow an actor to be added after we've entered the Notifying case.  We
62
0
  // can't stop the actor creation from racing with out destruction of the
63
0
  // other actors and we need to wait for this extra one to close as well.
64
0
  // Signal it should destroy itself right away.
65
0
  if (mNotified) {
66
0
    aActor->StartDestroy();
67
0
  }
68
0
}
69
70
void
71
CacheWorkerHolder::RemoveActor(ActorChild* aActor)
72
0
{
73
0
  NS_ASSERT_OWNINGTHREAD(CacheWorkerHolder);
74
0
  MOZ_DIAGNOSTIC_ASSERT(aActor);
75
0
76
#if defined(RELEASE_OR_BETA)
77
  mActorList.RemoveElement(aActor);
78
#else
79
0
  MOZ_DIAGNOSTIC_ASSERT(mActorList.RemoveElement(aActor));
80
0
#endif
81
0
82
0
  MOZ_ASSERT(!mActorList.Contains(aActor));
83
0
}
84
85
bool
86
CacheWorkerHolder::Notified() const
87
0
{
88
0
  return mNotified;
89
0
}
90
91
bool
92
CacheWorkerHolder::Notify(WorkerStatus aStatus)
93
0
{
94
0
  NS_ASSERT_OWNINGTHREAD(CacheWorkerHolder);
95
0
96
0
  // When the service worker thread is stopped we will get Canceling,
97
0
  // but nothing higher than that.  We must shut things down at Canceling.
98
0
  if (aStatus < Canceling || mNotified) {
99
0
    return true;
100
0
  }
101
0
102
0
  mNotified = true;
103
0
104
0
  // Start the asynchronous destruction of our actors.  These will call back
105
0
  // into RemoveActor() once the actor is destroyed.
106
0
  for (uint32_t i = 0; i < mActorList.Length(); ++i) {
107
0
    MOZ_DIAGNOSTIC_ASSERT(mActorList[i]);
108
0
    mActorList[i]->StartDestroy();
109
0
  }
110
0
111
0
  return true;
112
0
}
113
114
CacheWorkerHolder::CacheWorkerHolder(Behavior aBehavior)
115
  : WorkerHolder("CacheWorkerHolder", aBehavior)
116
  , mNotified(false)
117
0
{
118
0
}
119
120
CacheWorkerHolder::~CacheWorkerHolder()
121
0
{
122
0
  NS_ASSERT_OWNINGTHREAD(CacheWorkerHolder);
123
0
  MOZ_DIAGNOSTIC_ASSERT(mActorList.IsEmpty());
124
0
}
125
126
} // namespace cache
127
} // namespace dom
128
} // namespace mozilla