RuntimeService.h (5752B)
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 "MainThreadUtils.h" 11 #include "js/ContextOptions.h" 12 #include "mozilla/Mutex.h" 13 #include "mozilla/StaticPtr.h" 14 #include "mozilla/dom/BindingDeclarations.h" 15 #include "mozilla/dom/SafeRefPtr.h" 16 #include "mozilla/dom/WorkerCommon.h" 17 #include "mozilla/dom/workerinternals/JSSettings.h" 18 #include "nsClassHashtable.h" 19 #include "nsHashKeys.h" 20 #include "nsIObserver.h" 21 #include "nsTArray.h" 22 23 class nsPIDOMWindowInner; 24 25 namespace mozilla::dom { 26 struct WorkerLoadInfo; 27 class WorkerThread; 28 29 namespace workerinternals { 30 31 class RuntimeService final : public nsIObserver { 32 struct WorkerDomainInfo { 33 nsCString mDomain; 34 nsTArray<WorkerPrivate*> mActiveWorkers; 35 nsTArray<WorkerPrivate*> mActiveServiceWorkers; 36 nsTArray<WorkerPrivate*> mQueuedWorkers; 37 uint32_t mChildWorkerCount; 38 39 WorkerDomainInfo() : mActiveWorkers(1), mChildWorkerCount(0) {} 40 41 uint32_t ActiveWorkerCount() const { 42 return mActiveWorkers.Length() + mChildWorkerCount; 43 } 44 45 uint32_t ActiveServiceWorkerCount() const { 46 return mActiveServiceWorkers.Length(); 47 } 48 49 bool HasNoWorkers() const { 50 return ActiveWorkerCount() == 0 && ActiveServiceWorkerCount() == 0; 51 } 52 }; 53 54 mozilla::Mutex mMutex; 55 56 // Protected by mMutex. 57 nsClassHashtable<nsCStringHashKey, WorkerDomainInfo> mDomainMap 58 MOZ_GUARDED_BY(mMutex); 59 60 // *Not* protected by mMutex. 61 nsClassHashtable<nsPtrHashKey<const nsPIDOMWindowInner>, 62 nsTArray<WorkerPrivate*> > 63 mWindowMap; 64 65 static StaticAutoPtr<workerinternals::JSSettings> sDefaultJSSettings; 66 67 public: 68 struct NavigatorProperties { 69 nsString mAppVersion; 70 nsString mAppVersionOverridden; 71 nsString mPlatform; 72 nsString mPlatformOverridden; 73 CopyableTArray<nsString> mLanguages; 74 }; 75 76 private: 77 NavigatorProperties mNavigatorProperties; 78 79 // True when the observer service holds a reference to this object. 80 bool mObserved; 81 bool mShuttingDown; 82 bool mNavigatorPropertiesLoaded; 83 84 public: 85 NS_DECL_ISUPPORTS 86 NS_DECL_NSIOBSERVER 87 88 static RuntimeService* GetOrCreateService(); 89 90 static RuntimeService* GetService(); 91 92 bool RegisterWorker(WorkerPrivate& aWorkerPrivate); 93 94 void UnregisterWorker(WorkerPrivate& aWorkerPrivate); 95 96 void CancelWorkersForWindow(const nsPIDOMWindowInner& aWindow); 97 98 void UpdateWorkersBackgroundState(const nsPIDOMWindowInner& aWindow, 99 bool aIsBackground); 100 101 void UpdateWorkersPeerConnections(const nsPIDOMWindowInner& aWindow, 102 bool aHasPeerConnections); 103 104 void FreezeWorkersForWindow(const nsPIDOMWindowInner& aWindow); 105 106 void ThawWorkersForWindow(const nsPIDOMWindowInner& aWindow); 107 108 void SuspendWorkersForWindow(const nsPIDOMWindowInner& aWindow); 109 110 void ResumeWorkersForWindow(const nsPIDOMWindowInner& aWindow); 111 112 void PropagateStorageAccessPermissionGranted( 113 const nsPIDOMWindowInner& aWindow); 114 115 const NavigatorProperties& GetNavigatorProperties() const { 116 return mNavigatorProperties; 117 } 118 119 static void GetDefaultJSSettings(workerinternals::JSSettings& aSettings) { 120 AssertIsOnMainThread(); 121 aSettings = *sDefaultJSSettings; 122 } 123 124 static void SetDefaultContextOptions( 125 const JS::ContextOptions& aContextOptions) { 126 AssertIsOnMainThread(); 127 sDefaultJSSettings->contextOptions = aContextOptions; 128 } 129 130 void UpdateAppVersionOverridePreference(const nsAString& aValue); 131 132 void UpdatePlatformOverridePreference(const nsAString& aValue); 133 134 void UpdateAllWorkerContextOptions(); 135 136 void UpdateAllWorkerLanguages(const nsTArray<nsString>& aLanguages); 137 138 static void SetDefaultJSGCSettings(JSGCParamKey aKey, 139 Maybe<uint32_t> aValue) { 140 AssertIsOnMainThread(); 141 sDefaultJSSettings->ApplyGCSetting(aKey, aValue); 142 } 143 144 void UpdateAllWorkerMemoryParameter(JSGCParamKey aKey, 145 Maybe<uint32_t> aValue); 146 147 #ifdef JS_GC_ZEAL 148 static void SetDefaultGCZeal(uint8_t aGCZeal, uint32_t aFrequency) { 149 AssertIsOnMainThread(); 150 sDefaultJSSettings->gcZeal = aGCZeal; 151 sDefaultJSSettings->gcZealFrequency = aFrequency; 152 } 153 154 void UpdateAllWorkerGCZeal(); 155 #endif 156 157 void SetLowMemoryStateAllWorkers(bool aState); 158 159 void GarbageCollectAllWorkers(bool aShrinking); 160 161 void CycleCollectAllWorkers(); 162 163 void SendOfflineStatusChangeEventToAllWorkers(bool aIsOffline); 164 165 void MemoryPressureAllWorkers(); 166 167 uint32_t ClampedHardwareConcurrency(bool aRFPHardcoded, 168 bool aRFPTiered) const; 169 170 void CrashIfHanging(); 171 172 bool IsShuttingDown() const { return mShuttingDown; } 173 174 void DumpRunningWorkers(); 175 176 void UpdateWorkersPlaybackState(const nsPIDOMWindowInner& aWindow, 177 bool aIsPlayingAudio); 178 179 private: 180 RuntimeService(); 181 ~RuntimeService(); 182 183 nsresult Init(); 184 185 void Shutdown(); 186 187 void Cleanup(); 188 189 void AddAllTopLevelWorkersToArray(nsTArray<WorkerPrivate*>& aWorkers) 190 MOZ_REQUIRES(mMutex); 191 192 nsTArray<WorkerPrivate*> GetWorkersForWindow( 193 const nsPIDOMWindowInner& aWindow) const; 194 195 bool ScheduleWorker(WorkerPrivate& aWorkerPrivate); 196 197 template <typename Func> 198 void BroadcastAllWorkers(const Func& aFunc); 199 }; 200 201 } // namespace workerinternals 202 } // namespace mozilla::dom 203 204 #endif /* mozilla_dom_workers_runtimeservice_h__ */