bug 700693 - OCSP stapling PSM changes r=bsmith
[gecko.git] / dom / workers / RuntimeService.h
blob5bf62395d5af47e240a8b6c23ba6b6aca5c721a7
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/. */
7 #ifndef mozilla_dom_workers_runtimeservice_h__
8 #define mozilla_dom_workers_runtimeservice_h__
10 #include "Workers.h"
12 #include "nsIObserver.h"
14 #include "jsapi.h"
15 #include "mozilla/Attributes.h"
16 #include "mozilla/Mutex.h"
17 #include "mozilla/TimeStamp.h"
18 #include "nsAutoPtr.h"
19 #include "nsClassHashtable.h"
20 #include "nsCOMPtr.h"
21 #include "nsHashKeys.h"
22 #include "nsStringGlue.h"
23 #include "nsTArray.h"
25 class nsIThread;
26 class nsITimer;
27 class nsPIDOMWindow;
29 BEGIN_WORKERS_NAMESPACE
31 class WorkerPrivate;
33 class RuntimeService MOZ_FINAL : public nsIObserver
35 struct WorkerDomainInfo
37 nsCString mDomain;
38 nsTArray<WorkerPrivate*> mActiveWorkers;
39 nsTArray<WorkerPrivate*> mQueuedWorkers;
40 uint32_t mChildWorkerCount;
42 WorkerDomainInfo() : mActiveWorkers(1), mChildWorkerCount(0) { }
44 uint32_t
45 ActiveWorkerCount() const
47 return mActiveWorkers.Length() + mChildWorkerCount;
51 struct IdleThreadInfo
53 nsCOMPtr<nsIThread> mThread;
54 mozilla::TimeStamp mExpirationTime;
57 mozilla::Mutex mMutex;
59 // Protected by mMutex.
60 nsClassHashtable<nsCStringHashKey, WorkerDomainInfo> mDomainMap;
62 // Protected by mMutex.
63 nsTArray<IdleThreadInfo> mIdleThreadArray;
65 // *Not* protected by mMutex.
66 nsClassHashtable<nsPtrHashKey<nsPIDOMWindow>, nsTArray<WorkerPrivate*> > mWindowMap;
68 // Only used on the main thread.
69 nsCOMPtr<nsITimer> mIdleThreadTimer;
71 nsCString mDetectorName;
72 nsCString mSystemCharset;
74 static JSSettings sDefaultJSSettings;
76 public:
77 struct NavigatorStrings
79 nsString mAppName;
80 nsString mAppVersion;
81 nsString mPlatform;
82 nsString mUserAgent;
85 private:
86 NavigatorStrings mNavigatorStrings;
88 // True when the observer service holds a reference to this object.
89 bool mObserved;
90 bool mShuttingDown;
91 bool mNavigatorStringsLoaded;
93 public:
94 NS_DECL_ISUPPORTS
95 NS_DECL_NSIOBSERVER
97 static RuntimeService*
98 GetOrCreateService();
100 static RuntimeService*
101 GetService();
103 bool
104 RegisterWorker(JSContext* aCx, WorkerPrivate* aWorkerPrivate);
106 void
107 UnregisterWorker(JSContext* aCx, WorkerPrivate* aWorkerPrivate);
109 void
110 CancelWorkersForWindow(JSContext* aCx, nsPIDOMWindow* aWindow);
112 void
113 SuspendWorkersForWindow(JSContext* aCx, nsPIDOMWindow* aWindow);
115 void
116 ResumeWorkersForWindow(nsIScriptContext* aCx, nsPIDOMWindow* aWindow);
118 const nsACString&
119 GetDetectorName() const
121 return mDetectorName;
124 const nsACString&
125 GetSystemCharset() const
127 return mSystemCharset;
130 const NavigatorStrings&
131 GetNavigatorStrings() const
133 return mNavigatorStrings;
136 void
137 NoteIdleThread(nsIThread* aThread);
139 static void
140 GetDefaultJSSettings(JSSettings& aSettings)
142 AssertIsOnMainThread();
143 aSettings = sDefaultJSSettings;
146 static void
147 SetDefaultJSContextOptions(uint32_t aContentOptions, uint32_t aChromeOptions)
149 AssertIsOnMainThread();
150 sDefaultJSSettings.content.options = aContentOptions;
151 sDefaultJSSettings.chrome.options = aChromeOptions;
154 void
155 UpdateAllWorkerJSContextOptions();
157 static void
158 SetDefaultJSGCSettings(JSGCParamKey aKey, uint32_t aValue)
160 AssertIsOnMainThread();
161 sDefaultJSSettings.ApplyGCSetting(aKey, aValue);
164 void
165 UpdateAllWorkerMemoryParameter(JSGCParamKey aKey, uint32_t aValue);
167 static uint32_t
168 GetContentCloseHandlerTimeoutSeconds()
170 return sDefaultJSSettings.content.maxScriptRuntime;
173 static uint32_t
174 GetChromeCloseHandlerTimeoutSeconds()
176 return sDefaultJSSettings.chrome.maxScriptRuntime;
179 #ifdef JS_GC_ZEAL
180 static void
181 SetDefaultGCZeal(uint8_t aGCZeal, uint32_t aFrequency)
183 AssertIsOnMainThread();
184 sDefaultJSSettings.gcZeal = aGCZeal;
185 sDefaultJSSettings.gcZealFrequency = aFrequency;
188 void
189 UpdateAllWorkerGCZeal();
190 #endif
192 static void
193 SetDefaultJITHardening(bool aJITHardening)
195 AssertIsOnMainThread();
196 sDefaultJSSettings.jitHardening = aJITHardening;
199 void
200 UpdateAllWorkerJITHardening(bool aJITHardening);
202 void
203 GarbageCollectAllWorkers(bool aShrinking);
205 private:
206 RuntimeService();
207 ~RuntimeService();
209 nsresult
210 Init();
212 void
213 Cleanup();
215 static PLDHashOperator
216 AddAllTopLevelWorkersToArray(const nsACString& aKey,
217 WorkerDomainInfo* aData,
218 void* aUserArg);
220 void
221 GetWorkersForWindow(nsPIDOMWindow* aWindow,
222 nsTArray<WorkerPrivate*>& aWorkers);
224 bool
225 ScheduleWorker(JSContext* aCx, WorkerPrivate* aWorkerPrivate);
227 static void
228 ShutdownIdleThreads(nsITimer* aTimer, void* aClosure);
231 END_WORKERS_NAMESPACE
233 #endif /* mozilla_dom_workers_runtimeservice_h__ */