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__
12 #include "nsIObserver.h"
15 #include "mozilla/Attributes.h"
16 #include "mozilla/Mutex.h"
17 #include "mozilla/TimeStamp.h"
18 #include "nsAutoPtr.h"
19 #include "nsClassHashtable.h"
21 #include "nsHashKeys.h"
22 #include "nsStringGlue.h"
29 BEGIN_WORKERS_NAMESPACE
33 class RuntimeService MOZ_FINAL
: public nsIObserver
35 struct WorkerDomainInfo
38 nsTArray
<WorkerPrivate
*> mActiveWorkers
;
39 nsTArray
<WorkerPrivate
*> mQueuedWorkers
;
40 uint32_t mChildWorkerCount
;
42 WorkerDomainInfo() : mActiveWorkers(1), mChildWorkerCount(0) { }
45 ActiveWorkerCount() const
47 return mActiveWorkers
.Length() + mChildWorkerCount
;
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
;
77 struct NavigatorStrings
86 NavigatorStrings mNavigatorStrings
;
88 // True when the observer service holds a reference to this object.
91 bool mNavigatorStringsLoaded
;
97 static RuntimeService
*
100 static RuntimeService
*
104 RegisterWorker(JSContext
* aCx
, WorkerPrivate
* aWorkerPrivate
);
107 UnregisterWorker(JSContext
* aCx
, WorkerPrivate
* aWorkerPrivate
);
110 CancelWorkersForWindow(JSContext
* aCx
, nsPIDOMWindow
* aWindow
);
113 SuspendWorkersForWindow(JSContext
* aCx
, nsPIDOMWindow
* aWindow
);
116 ResumeWorkersForWindow(nsIScriptContext
* aCx
, nsPIDOMWindow
* aWindow
);
119 GetDetectorName() const
121 return mDetectorName
;
125 GetSystemCharset() const
127 return mSystemCharset
;
130 const NavigatorStrings
&
131 GetNavigatorStrings() const
133 return mNavigatorStrings
;
137 NoteIdleThread(nsIThread
* aThread
);
140 GetDefaultJSSettings(JSSettings
& aSettings
)
142 AssertIsOnMainThread();
143 aSettings
= sDefaultJSSettings
;
147 SetDefaultJSContextOptions(uint32_t aContentOptions
, uint32_t aChromeOptions
)
149 AssertIsOnMainThread();
150 sDefaultJSSettings
.content
.options
= aContentOptions
;
151 sDefaultJSSettings
.chrome
.options
= aChromeOptions
;
155 UpdateAllWorkerJSContextOptions();
158 SetDefaultJSGCSettings(JSGCParamKey aKey
, uint32_t aValue
)
160 AssertIsOnMainThread();
161 sDefaultJSSettings
.ApplyGCSetting(aKey
, aValue
);
165 UpdateAllWorkerMemoryParameter(JSGCParamKey aKey
, uint32_t aValue
);
168 GetContentCloseHandlerTimeoutSeconds()
170 return sDefaultJSSettings
.content
.maxScriptRuntime
;
174 GetChromeCloseHandlerTimeoutSeconds()
176 return sDefaultJSSettings
.chrome
.maxScriptRuntime
;
181 SetDefaultGCZeal(uint8_t aGCZeal
, uint32_t aFrequency
)
183 AssertIsOnMainThread();
184 sDefaultJSSettings
.gcZeal
= aGCZeal
;
185 sDefaultJSSettings
.gcZealFrequency
= aFrequency
;
189 UpdateAllWorkerGCZeal();
193 SetDefaultJITHardening(bool aJITHardening
)
195 AssertIsOnMainThread();
196 sDefaultJSSettings
.jitHardening
= aJITHardening
;
200 UpdateAllWorkerJITHardening(bool aJITHardening
);
203 GarbageCollectAllWorkers(bool aShrinking
);
215 static PLDHashOperator
216 AddAllTopLevelWorkersToArray(const nsACString
& aKey
,
217 WorkerDomainInfo
* aData
,
221 GetWorkersForWindow(nsPIDOMWindow
* aWindow
,
222 nsTArray
<WorkerPrivate
*>& aWorkers
);
225 ScheduleWorker(JSContext
* aCx
, WorkerPrivate
* aWorkerPrivate
);
228 ShutdownIdleThreads(nsITimer
* aTimer
, void* aClosure
);
231 END_WORKERS_NAMESPACE
233 #endif /* mozilla_dom_workers_runtimeservice_h__ */