Line data Source code
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 : #ifndef mozilla_dom_workers_runtimeservice_h__
8 : #define mozilla_dom_workers_runtimeservice_h__
9 :
10 : #include "Workers.h"
11 :
12 : #include "nsIObserver.h"
13 :
14 : #include "mozilla/dom/BindingDeclarations.h"
15 : #include "nsClassHashtable.h"
16 : #include "nsHashKeys.h"
17 : #include "nsTArray.h"
18 :
19 : class nsITimer;
20 : class nsPIDOMWindowInner;
21 :
22 : BEGIN_WORKERS_NAMESPACE
23 :
24 : class SharedWorker;
25 : class WorkerThread;
26 :
27 : class RuntimeService final : public nsIObserver
28 : {
29 0 : struct SharedWorkerInfo
30 : {
31 : WorkerPrivate* mWorkerPrivate;
32 : nsCString mScriptSpec;
33 : nsString mName;
34 :
35 0 : SharedWorkerInfo(WorkerPrivate* aWorkerPrivate,
36 : const nsACString& aScriptSpec,
37 : const nsAString& aName)
38 0 : : mWorkerPrivate(aWorkerPrivate), mScriptSpec(aScriptSpec), mName(aName)
39 0 : { }
40 : };
41 :
42 0 : struct WorkerDomainInfo
43 : {
44 : nsCString mDomain;
45 : nsTArray<WorkerPrivate*> mActiveWorkers;
46 : nsTArray<WorkerPrivate*> mActiveServiceWorkers;
47 : nsTArray<WorkerPrivate*> mQueuedWorkers;
48 : nsClassHashtable<nsCStringHashKey, SharedWorkerInfo> mSharedWorkerInfos;
49 : uint32_t mChildWorkerCount;
50 :
51 1 : WorkerDomainInfo()
52 1 : : mActiveWorkers(1), mChildWorkerCount(0)
53 1 : { }
54 :
55 : uint32_t
56 1 : ActiveWorkerCount() const
57 : {
58 1 : return mActiveWorkers.Length() +
59 1 : mChildWorkerCount;
60 : }
61 :
62 : uint32_t
63 0 : ActiveServiceWorkerCount() const
64 : {
65 0 : return mActiveServiceWorkers.Length();
66 : }
67 :
68 : bool
69 0 : HasNoWorkers() const
70 : {
71 0 : return ActiveWorkerCount() == 0 &&
72 0 : ActiveServiceWorkerCount() == 0;
73 : }
74 : };
75 :
76 : struct IdleThreadInfo;
77 :
78 : mozilla::Mutex mMutex;
79 :
80 : // Protected by mMutex.
81 : nsClassHashtable<nsCStringHashKey, WorkerDomainInfo> mDomainMap;
82 :
83 : // Protected by mMutex.
84 : nsTArray<IdleThreadInfo> mIdleThreadArray;
85 :
86 : // *Not* protected by mMutex.
87 : nsClassHashtable<nsPtrHashKey<nsPIDOMWindowInner>,
88 : nsTArray<WorkerPrivate*> > mWindowMap;
89 :
90 : // Only used on the main thread.
91 : nsCOMPtr<nsITimer> mIdleThreadTimer;
92 :
93 : static JSSettings sDefaultJSSettings;
94 : static bool sDefaultPreferences[WORKERPREF_COUNT];
95 :
96 : public:
97 1 : struct NavigatorProperties
98 : {
99 : nsString mAppName;
100 : nsString mAppNameOverridden;
101 : nsString mAppVersion;
102 : nsString mAppVersionOverridden;
103 : nsString mPlatform;
104 : nsString mPlatformOverridden;
105 : nsTArray<nsString> mLanguages;
106 : };
107 :
108 : private:
109 : NavigatorProperties mNavigatorProperties;
110 :
111 : // True when the observer service holds a reference to this object.
112 : bool mObserved;
113 : bool mShuttingDown;
114 : bool mNavigatorPropertiesLoaded;
115 :
116 : public:
117 : NS_DECL_ISUPPORTS
118 : NS_DECL_NSIOBSERVER
119 :
120 : static RuntimeService*
121 : GetOrCreateService();
122 :
123 : static RuntimeService*
124 : GetService();
125 :
126 : bool
127 : RegisterWorker(WorkerPrivate* aWorkerPrivate);
128 :
129 : void
130 : UnregisterWorker(WorkerPrivate* aWorkerPrivate);
131 :
132 : void
133 : RemoveSharedWorker(WorkerDomainInfo* aDomainInfo,
134 : WorkerPrivate* aWorkerPrivate);
135 :
136 : void
137 : CancelWorkersForWindow(nsPIDOMWindowInner* aWindow);
138 :
139 : void
140 : FreezeWorkersForWindow(nsPIDOMWindowInner* aWindow);
141 :
142 : void
143 : ThawWorkersForWindow(nsPIDOMWindowInner* aWindow);
144 :
145 : void
146 : SuspendWorkersForWindow(nsPIDOMWindowInner* aWindow);
147 :
148 : void
149 : ResumeWorkersForWindow(nsPIDOMWindowInner* aWindow);
150 :
151 : nsresult
152 : CreateSharedWorker(const GlobalObject& aGlobal,
153 : const nsAString& aScriptURL,
154 : const nsAString& aName,
155 : SharedWorker** aSharedWorker);
156 :
157 : void
158 : ForgetSharedWorker(WorkerPrivate* aWorkerPrivate);
159 :
160 : const NavigatorProperties&
161 0 : GetNavigatorProperties() const
162 : {
163 0 : return mNavigatorProperties;
164 : }
165 :
166 : void
167 : NoteIdleThread(WorkerThread* aThread);
168 :
169 : static void
170 1 : GetDefaultJSSettings(JSSettings& aSettings)
171 : {
172 1 : AssertIsOnMainThread();
173 1 : aSettings = sDefaultJSSettings;
174 1 : }
175 :
176 : static void
177 1 : GetDefaultPreferences(bool aPreferences[WORKERPREF_COUNT])
178 : {
179 1 : AssertIsOnMainThread();
180 1 : memcpy(aPreferences, sDefaultPreferences, WORKERPREF_COUNT * sizeof(bool));
181 1 : }
182 :
183 : static void
184 1 : SetDefaultContextOptions(const JS::ContextOptions& aContextOptions)
185 : {
186 1 : AssertIsOnMainThread();
187 1 : sDefaultJSSettings.contextOptions = aContextOptions;
188 1 : }
189 :
190 : void
191 : UpdateAppNameOverridePreference(const nsAString& aValue);
192 :
193 : void
194 : UpdateAppVersionOverridePreference(const nsAString& aValue);
195 :
196 : void
197 : UpdatePlatformOverridePreference(const nsAString& aValue);
198 :
199 : void
200 : UpdateAllWorkerContextOptions();
201 :
202 : void
203 : UpdateAllWorkerLanguages(const nsTArray<nsString>& aLanguages);
204 :
205 : void
206 : UpdateAllWorkerPreference(WorkerPreference aPref, bool aValue);
207 :
208 : static void
209 15 : SetDefaultJSGCSettings(JSGCParamKey aKey, uint32_t aValue)
210 : {
211 15 : AssertIsOnMainThread();
212 15 : sDefaultJSSettings.ApplyGCSetting(aKey, aValue);
213 15 : }
214 :
215 : void
216 : UpdateAllWorkerMemoryParameter(JSGCParamKey aKey, uint32_t aValue);
217 :
218 : #ifdef JS_GC_ZEAL
219 : static void
220 1 : SetDefaultGCZeal(uint8_t aGCZeal, uint32_t aFrequency)
221 : {
222 1 : AssertIsOnMainThread();
223 1 : sDefaultJSSettings.gcZeal = aGCZeal;
224 1 : sDefaultJSSettings.gcZealFrequency = aFrequency;
225 1 : }
226 :
227 : void
228 : UpdateAllWorkerGCZeal();
229 : #endif
230 :
231 : void
232 : GarbageCollectAllWorkers(bool aShrinking);
233 :
234 : void
235 : CycleCollectAllWorkers();
236 :
237 : void
238 : SendOfflineStatusChangeEventToAllWorkers(bool aIsOffline);
239 :
240 : void
241 : MemoryPressureAllWorkers();
242 :
243 : uint32_t ClampedHardwareConcurrency() const;
244 :
245 : private:
246 : RuntimeService();
247 : ~RuntimeService();
248 :
249 : nsresult
250 : Init();
251 :
252 : void
253 : Shutdown();
254 :
255 : void
256 : Cleanup();
257 :
258 : void
259 : AddAllTopLevelWorkersToArray(nsTArray<WorkerPrivate*>& aWorkers);
260 :
261 : void
262 : GetWorkersForWindow(nsPIDOMWindowInner* aWindow,
263 : nsTArray<WorkerPrivate*>& aWorkers);
264 :
265 : bool
266 : ScheduleWorker(WorkerPrivate* aWorkerPrivate);
267 :
268 : static void
269 : ShutdownIdleThreads(nsITimer* aTimer, void* aClosure);
270 :
271 : static void
272 : WorkerPrefChanged(const char* aPrefName, void* aClosure);
273 :
274 : nsresult
275 : CreateSharedWorkerFromLoadInfo(JSContext* aCx,
276 : WorkerLoadInfo* aLoadInfo,
277 : const nsAString& aScriptURL,
278 : const nsAString& aName,
279 : SharedWorker** aSharedWorker);
280 : };
281 :
282 : END_WORKERS_NAMESPACE
283 :
284 : #endif /* mozilla_dom_workers_runtimeservice_h__ */
|