1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/workers/RuntimeService.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,297 @@ 1.4 +/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */ 1.5 +/* vim: set ts=2 et sw=2 tw=80: */ 1.6 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.9 + 1.10 +#ifndef mozilla_dom_workers_runtimeservice_h__ 1.11 +#define mozilla_dom_workers_runtimeservice_h__ 1.12 + 1.13 +#include "Workers.h" 1.14 + 1.15 +#include "nsIObserver.h" 1.16 + 1.17 +#include "mozilla/TimeStamp.h" 1.18 +#include "mozilla/dom/BindingDeclarations.h" 1.19 +#include "nsClassHashtable.h" 1.20 +#include "nsHashKeys.h" 1.21 +#include "nsTArray.h" 1.22 + 1.23 +class nsIRunnable; 1.24 +class nsIThread; 1.25 +class nsITimer; 1.26 +class nsPIDOMWindow; 1.27 + 1.28 +BEGIN_WORKERS_NAMESPACE 1.29 + 1.30 +class SharedWorker; 1.31 +class WorkerPrivate; 1.32 + 1.33 +class RuntimeService MOZ_FINAL : public nsIObserver 1.34 +{ 1.35 +public: 1.36 + class WorkerThread; 1.37 + 1.38 +private: 1.39 + struct SharedWorkerInfo 1.40 + { 1.41 + WorkerPrivate* mWorkerPrivate; 1.42 + nsCString mScriptSpec; 1.43 + nsCString mName; 1.44 + 1.45 + SharedWorkerInfo(WorkerPrivate* aWorkerPrivate, 1.46 + const nsACString& aScriptSpec, 1.47 + const nsACString& aName) 1.48 + : mWorkerPrivate(aWorkerPrivate), mScriptSpec(aScriptSpec), mName(aName) 1.49 + { } 1.50 + }; 1.51 + 1.52 + struct WorkerDomainInfo 1.53 + { 1.54 + nsCString mDomain; 1.55 + nsTArray<WorkerPrivate*> mActiveWorkers; 1.56 + nsTArray<WorkerPrivate*> mQueuedWorkers; 1.57 + nsClassHashtable<nsCStringHashKey, SharedWorkerInfo> mSharedWorkerInfos; 1.58 + uint32_t mChildWorkerCount; 1.59 + 1.60 + WorkerDomainInfo() 1.61 + : mActiveWorkers(1), mChildWorkerCount(0) 1.62 + { } 1.63 + 1.64 + uint32_t 1.65 + ActiveWorkerCount() const 1.66 + { 1.67 + return mActiveWorkers.Length() + mChildWorkerCount; 1.68 + } 1.69 + }; 1.70 + 1.71 + struct IdleThreadInfo 1.72 + { 1.73 + nsRefPtr<WorkerThread> mThread; 1.74 + mozilla::TimeStamp mExpirationTime; 1.75 + }; 1.76 + 1.77 + struct MatchSharedWorkerInfo 1.78 + { 1.79 + WorkerPrivate* mWorkerPrivate; 1.80 + SharedWorkerInfo* mSharedWorkerInfo; 1.81 + 1.82 + MatchSharedWorkerInfo(WorkerPrivate* aWorkerPrivate) 1.83 + : mWorkerPrivate(aWorkerPrivate), mSharedWorkerInfo(nullptr) 1.84 + { } 1.85 + }; 1.86 + 1.87 + mozilla::Mutex mMutex; 1.88 + 1.89 + // Protected by mMutex. 1.90 + nsClassHashtable<nsCStringHashKey, WorkerDomainInfo> mDomainMap; 1.91 + 1.92 + // Protected by mMutex. 1.93 + nsTArray<IdleThreadInfo> mIdleThreadArray; 1.94 + 1.95 + // *Not* protected by mMutex. 1.96 + nsClassHashtable<nsPtrHashKey<nsPIDOMWindow>, 1.97 + nsTArray<WorkerPrivate*> > mWindowMap; 1.98 + 1.99 + // Only used on the main thread. 1.100 + nsCOMPtr<nsITimer> mIdleThreadTimer; 1.101 + 1.102 + static JSSettings sDefaultJSSettings; 1.103 + static bool sDefaultPreferences[WORKERPREF_COUNT]; 1.104 + 1.105 +public: 1.106 + struct NavigatorProperties 1.107 + { 1.108 + nsString mAppName; 1.109 + nsString mAppNameOverridden; 1.110 + nsString mAppVersion; 1.111 + nsString mAppVersionOverridden; 1.112 + nsString mPlatform; 1.113 + nsString mPlatformOverridden; 1.114 + nsString mUserAgent; 1.115 + }; 1.116 + 1.117 +private: 1.118 + NavigatorProperties mNavigatorProperties; 1.119 + 1.120 + // True when the observer service holds a reference to this object. 1.121 + bool mObserved; 1.122 + bool mShuttingDown; 1.123 + bool mNavigatorPropertiesLoaded; 1.124 + 1.125 +public: 1.126 + NS_DECL_ISUPPORTS 1.127 + NS_DECL_NSIOBSERVER 1.128 + 1.129 + static RuntimeService* 1.130 + GetOrCreateService(); 1.131 + 1.132 + static RuntimeService* 1.133 + GetService(); 1.134 + 1.135 + bool 1.136 + RegisterWorker(JSContext* aCx, WorkerPrivate* aWorkerPrivate); 1.137 + 1.138 + void 1.139 + UnregisterWorker(JSContext* aCx, WorkerPrivate* aWorkerPrivate); 1.140 + 1.141 + void 1.142 + CancelWorkersForWindow(nsPIDOMWindow* aWindow); 1.143 + 1.144 + void 1.145 + SuspendWorkersForWindow(nsPIDOMWindow* aWindow); 1.146 + 1.147 + void 1.148 + ResumeWorkersForWindow(nsPIDOMWindow* aWindow); 1.149 + 1.150 + nsresult 1.151 + CreateSharedWorker(const GlobalObject& aGlobal, 1.152 + const nsAString& aScriptURL, 1.153 + const nsACString& aName, 1.154 + SharedWorker** aSharedWorker); 1.155 + 1.156 + void 1.157 + ForgetSharedWorker(WorkerPrivate* aWorkerPrivate); 1.158 + 1.159 + const NavigatorProperties& 1.160 + GetNavigatorProperties() const 1.161 + { 1.162 + return mNavigatorProperties; 1.163 + } 1.164 + 1.165 + void 1.166 + NoteIdleThread(WorkerThread* aThread); 1.167 + 1.168 + static void 1.169 + GetDefaultJSSettings(JSSettings& aSettings) 1.170 + { 1.171 + AssertIsOnMainThread(); 1.172 + aSettings = sDefaultJSSettings; 1.173 + } 1.174 + 1.175 + static void 1.176 + GetDefaultPreferences(bool aPreferences[WORKERPREF_COUNT]) 1.177 + { 1.178 + AssertIsOnMainThread(); 1.179 + memcpy(aPreferences, sDefaultPreferences, WORKERPREF_COUNT * sizeof(bool)); 1.180 + } 1.181 + 1.182 + static void 1.183 + SetDefaultRuntimeAndContextOptions( 1.184 + const JS::RuntimeOptions& aRuntimeOptions, 1.185 + const JS::ContextOptions& aContentCxOptions, 1.186 + const JS::ContextOptions& aChromeCxOptions) 1.187 + { 1.188 + AssertIsOnMainThread(); 1.189 + sDefaultJSSettings.runtimeOptions = aRuntimeOptions; 1.190 + sDefaultJSSettings.content.contextOptions = aContentCxOptions; 1.191 + sDefaultJSSettings.chrome.contextOptions = aChromeCxOptions; 1.192 + } 1.193 + 1.194 + void 1.195 + UpdateAppNameOverridePreference(const nsAString& aValue); 1.196 + 1.197 + void 1.198 + UpdateAppVersionOverridePreference(const nsAString& aValue); 1.199 + 1.200 + void 1.201 + UpdatePlatformOverridePreference(const nsAString& aValue); 1.202 + 1.203 + void 1.204 + UpdateAllWorkerRuntimeAndContextOptions(); 1.205 + 1.206 + void 1.207 + UpdateAllWorkerPreference(WorkerPreference aPref, bool aValue); 1.208 + 1.209 + static void 1.210 + SetDefaultJSGCSettings(JSGCParamKey aKey, uint32_t aValue) 1.211 + { 1.212 + AssertIsOnMainThread(); 1.213 + sDefaultJSSettings.ApplyGCSetting(aKey, aValue); 1.214 + } 1.215 + 1.216 + void 1.217 + UpdateAllWorkerMemoryParameter(JSGCParamKey aKey, uint32_t aValue); 1.218 + 1.219 + static uint32_t 1.220 + GetContentCloseHandlerTimeoutSeconds() 1.221 + { 1.222 + return sDefaultJSSettings.content.maxScriptRuntime; 1.223 + } 1.224 + 1.225 + static uint32_t 1.226 + GetChromeCloseHandlerTimeoutSeconds() 1.227 + { 1.228 + return sDefaultJSSettings.chrome.maxScriptRuntime; 1.229 + } 1.230 + 1.231 +#ifdef JS_GC_ZEAL 1.232 + static void 1.233 + SetDefaultGCZeal(uint8_t aGCZeal, uint32_t aFrequency) 1.234 + { 1.235 + AssertIsOnMainThread(); 1.236 + sDefaultJSSettings.gcZeal = aGCZeal; 1.237 + sDefaultJSSettings.gcZealFrequency = aFrequency; 1.238 + } 1.239 + 1.240 + void 1.241 + UpdateAllWorkerGCZeal(); 1.242 +#endif 1.243 + 1.244 + void 1.245 + GarbageCollectAllWorkers(bool aShrinking); 1.246 + 1.247 + void 1.248 + CycleCollectAllWorkers(); 1.249 + 1.250 + void 1.251 + SendOfflineStatusChangeEventToAllWorkers(bool aIsOffline); 1.252 + 1.253 +private: 1.254 + RuntimeService(); 1.255 + ~RuntimeService(); 1.256 + 1.257 + nsresult 1.258 + Init(); 1.259 + 1.260 + void 1.261 + Shutdown(); 1.262 + 1.263 + void 1.264 + Cleanup(); 1.265 + 1.266 + static PLDHashOperator 1.267 + AddAllTopLevelWorkersToArray(const nsACString& aKey, 1.268 + WorkerDomainInfo* aData, 1.269 + void* aUserArg); 1.270 + 1.271 + static PLDHashOperator 1.272 + RemoveSharedWorkerFromWindowMap(nsPIDOMWindow* aKey, 1.273 + nsAutoPtr<nsTArray<WorkerPrivate*> >& aData, 1.274 + void* aUserArg); 1.275 + 1.276 + static PLDHashOperator 1.277 + FindSharedWorkerInfo(const nsACString& aKey, 1.278 + SharedWorkerInfo* aData, 1.279 + void* aUserArg); 1.280 + 1.281 + void 1.282 + GetWorkersForWindow(nsPIDOMWindow* aWindow, 1.283 + nsTArray<WorkerPrivate*>& aWorkers); 1.284 + 1.285 + bool 1.286 + ScheduleWorker(JSContext* aCx, WorkerPrivate* aWorkerPrivate); 1.287 + 1.288 + static void 1.289 + ShutdownIdleThreads(nsITimer* aTimer, void* aClosure); 1.290 + 1.291 + static void 1.292 + WorkerPrefChanged(const char* aPrefName, void* aClosure); 1.293 + 1.294 + static void 1.295 + JSVersionChanged(const char* aPrefName, void* aClosure); 1.296 +}; 1.297 + 1.298 +END_WORKERS_NAMESPACE 1.299 + 1.300 +#endif /* mozilla_dom_workers_runtimeservice_h__ */