dom/workers/RuntimeService.h

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

mercurial