Bug 1432429 Worker fuzzy clock update 6/14 draft
authorAndrea Marchesini <amarchesini@mozilla.com>
Fri, 15 Jun 2018 19:10:16 -0700
changeset 826367 6dba227d2f926b575f16258bfa82d76100414566
parent 826366 ca91839da98fc7f35b51ae5eb332e01269098c8b
child 826368 f1ae2971ce0a0d7a180fb8560cc4d6a103a94b62
push id118310
push userbmo:tom@mozilla.com
push dateFri, 03 Aug 2018 18:22:17 +0000
bugs1432429
milestone62.0a1
Bug 1432429 Worker fuzzy clock update 6/14 MozReview-Commit-ID: Aa0ztJ02fIX
dom/workers/RuntimeService.cpp
dom/workers/RuntimeService.h
dom/workers/WorkerPrivate.cpp
dom/workers/WorkerPrivate.h
--- a/dom/workers/RuntimeService.cpp
+++ b/dom/workers/RuntimeService.cpp
@@ -13,16 +13,17 @@
 #include "nsIDOMChromeWindow.h"
 #include "nsIEffectiveTLDService.h"
 #include "nsIObserverService.h"
 #include "nsIPrincipal.h"
 #include "nsIScriptContext.h"
 #include "nsIScriptError.h"
 #include "nsIScriptSecurityManager.h"
 #include "nsIStreamTransportService.h"
+#include "nsISupportsPrimitives.h"
 #include "nsISupportsPriority.h"
 #include "nsITimer.h"
 #include "nsIURI.h"
 #include "nsIXULRuntime.h"
 #include "nsPIDOMWindow.h"
 
 #include <algorithm>
 #include "mozilla/ipc/BackgroundChild.h"
@@ -124,16 +125,17 @@ static_assert(MAX_WORKERS_PER_DOMAIN >= 
 #define PREF_WORKERS_MAX_HARDWARE_CONCURRENCY "dom.maxHardwareConcurrency"
 
 #define PREF_MAX_SCRIPT_RUN_TIME_CONTENT "dom.max_script_run_time"
 #define PREF_MAX_SCRIPT_RUN_TIME_CHROME "dom.max_chrome_script_run_time"
 
 #define GC_REQUEST_OBSERVER_TOPIC "child-gc-request"
 #define CC_REQUEST_OBSERVER_TOPIC "child-cc-request"
 #define MEMORY_PRESSURE_OBSERVER_TOPIC "memory-pressure"
+#define FUZZYFOX_UPDATECLOCK_OBSERVER_TOPIC "fuzzyfox-update-clocks"
 
 #define BROADCAST_ALL_WORKERS(_func, ...)                                      \
   PR_BEGIN_MACRO                                                               \
     AssertIsOnMainThread();                                                    \
                                                                                \
     AutoTArray<WorkerPrivate*, 100> workers;                                   \
     {                                                                          \
       MutexAutoLock lock(mMutex);                                              \
@@ -1736,16 +1738,22 @@ RuntimeService::Init()
                                  false))) {
     NS_WARNING("Failed to register for memory pressure notifications!");
   }
 
   if (NS_FAILED(obs->AddObserver(this, NS_IOSERVICE_OFFLINE_STATUS_TOPIC, false))) {
     NS_WARNING("Failed to register for offline notification event!");
   }
 
+#ifdef MOZ_FUZZYFOX
+  if (NS_FAILED(obs->AddObserver(this, FUZZYFOX_UPDATECLOCK_OBSERVER_TOPIC, false))) {
+    NS_WARNING("Failed to register for fuzzyfox update clock!");
+  }
+#endif
+
   MOZ_ASSERT(!gRuntimeServiceDuringInit, "This should be false!");
   gRuntimeServiceDuringInit = true;
 
   if (NS_FAILED(Preferences::RegisterPrefixCallback(
                                  LoadJSGCMemoryOptions,
                                  PREF_JS_OPTIONS_PREFIX PREF_MEM_OPTIONS_PREFIX)) ||
       NS_FAILED(Preferences::RegisterPrefixCallbackAndCall(
                             LoadJSGCMemoryOptions,
@@ -2095,16 +2103,23 @@ RuntimeService::Cleanup()
                                         MEMORY_PRESSURE_OBSERVER_TOPIC))) {
         NS_WARNING("Failed to unregister for memory pressure notifications!");
       }
 
       if (NS_FAILED(obs->RemoveObserver(this,
                                         NS_IOSERVICE_OFFLINE_STATUS_TOPIC))) {
         NS_WARNING("Failed to unregister for offline notification event!");
       }
+
+#ifdef MOZ_FUZZYFOX
+      if (NS_FAILED(obs->RemoveObserver(this, FUZZYFOX_UPDATECLOCK_OBSERVER_TOPIC))) {
+        NS_WARNING("Failed to unregister for fuzzyfox update clock!");
+      }
+#endif
+
       obs->RemoveObserver(this, NS_XPCOM_SHUTDOWN_THREADS_OBSERVER_ID);
       obs->RemoveObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID);
       mObserved = false;
     }
   }
 
   nsLayoutStatics::Release();
 }
@@ -2528,16 +2543,35 @@ RuntimeService::CycleCollectAllWorkers()
 }
 
 void
 RuntimeService::SendOfflineStatusChangeEventToAllWorkers(bool aIsOffline)
 {
   BROADCAST_ALL_WORKERS(OfflineStatusChangeEvent, aIsOffline);
 }
 
+#ifdef MOZ_FUZZYFOX
+void
+RuntimeService::SendFuzzyFoxClockToAllWorkers(nsISupports* aData)
+{
+  nsCOMPtr<nsISupportsPRInt64> wrapper = do_QueryInterface(aData);
+  if (NS_WARN_IF(!wrapper)) {
+    return;
+  }
+
+  int64_t newTime = 0;
+  nsresult rv = wrapper->GetData(&newTime);
+  if (NS_WARN_IF(NS_FAILED(rv))) {
+    return;
+  }
+
+  BROADCAST_ALL_WORKERS(UpdateFuzzyFoxClock, newTime);
+}
+#endif
+
 void
 RuntimeService::MemoryPressureAllWorkers()
 {
   BROADCAST_ALL_WORKERS(MemoryPressure, /* dummy = */ false);
 }
 
 uint32_t
 RuntimeService::ClampedHardwareConcurrency() const
@@ -2600,16 +2634,23 @@ RuntimeService::Observe(nsISupports* aSu
     MemoryPressureAllWorkers();
     return NS_OK;
   }
   if (!strcmp(aTopic, NS_IOSERVICE_OFFLINE_STATUS_TOPIC)) {
     SendOfflineStatusChangeEventToAllWorkers(NS_IsOffline());
     return NS_OK;
   }
 
+#ifdef MOZ_FUZZYFOX
+  if (!strcmp(aTopic, FUZZYFOX_UPDATECLOCK_OBSERVER_TOPIC)) {
+    SendFuzzyFoxClockToAllWorkers(aSubject);
+    return NS_OK;
+  }
+#endif
+
   NS_NOTREACHED("Unknown observer topic!");
   return NS_OK;
 }
 
 bool
 LogViolationDetailsRunnable::MainThreadRun()
 {
   AssertIsOnMainThread();
--- a/dom/workers/RuntimeService.h
+++ b/dom/workers/RuntimeService.h
@@ -226,16 +226,21 @@ public:
   GarbageCollectAllWorkers(bool aShrinking);
 
   void
   CycleCollectAllWorkers();
 
   void
   SendOfflineStatusChangeEventToAllWorkers(bool aIsOffline);
 
+#ifdef MOZ_FUZZYFOX
+  void
+  SendFuzzyFoxClockToAllWorkers(nsISupports* aData);
+#endif
+
   void
   MemoryPressureAllWorkers();
 
   uint32_t ClampedHardwareConcurrency() const;
 
   void CrashIfHanging();
 
 private:
--- a/dom/workers/WorkerPrivate.cpp
+++ b/dom/workers/WorkerPrivate.cpp
@@ -755,16 +755,37 @@ private:
   virtual bool
   WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override
   {
     aWorkerPrivate->UpdateContextOptionsInternal(aCx, mContextOptions);
     return true;
   }
 };
 
+#ifdef MOZ_FUZZYFOX
+class UpdateFuzzyFoxClockRunnable final : public WorkerRunnable
+{
+  int64_t mNewTime;
+
+public:
+  UpdateFuzzyFoxClockRunnable(WorkerPrivate* aWorkerPrivate,
+                             int64_t aNewTime)
+    : WorkerRunnable(aWorkerPrivate)
+    , mNewTime(aNewTime)
+  {}
+
+  virtual bool
+  WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override
+  {
+    JS_UpdateLockedClock(aCx, mNewTime);
+    return true;
+  }
+};
+#endif
+
 class UpdateLanguagesRunnable final : public WorkerRunnable
 {
   nsTArray<nsString> mLanguages;
 
 public:
   UpdateLanguagesRunnable(WorkerPrivate* aWorkerPrivate,
                           const nsTArray<nsString>& aLanguages)
     : WorkerRunnable(aWorkerPrivate),
@@ -2187,16 +2208,30 @@ WorkerPrivate::OfflineStatusChangeEventI
   RefPtr<Event> event = NS_NewDOMEvent(globalScope, nullptr, nullptr);
 
   event->InitEvent(eventType, false, false);
   event->SetTrusted(true);
 
   globalScope->DispatchEvent(*event);
 }
 
+#ifdef MOZ_FUZZYFOX
+void
+WorkerPrivate::UpdateFuzzyFoxClock(int64_t aNewTime)
+{
+  AssertIsOnParentThread();
+
+  RefPtr<UpdateFuzzyFoxClockRunnable> runnable =
+    new UpdateFuzzyFoxClockRunnable(this, aNewTime);
+  if (!runnable->Dispatch()) {
+    NS_WARNING("Failed to dispatch fuzzy fox clock update event!");
+  }
+}
+#endif
+
 void
 WorkerPrivate::MemoryPressure(bool aDummy)
 {
   AssertIsOnParentThread();
 
   RefPtr<MemoryPressureRunnable> runnable = new MemoryPressureRunnable(this);
   Unused << NS_WARN_IF(!runnable->Dispatch());
 }
--- a/dom/workers/WorkerPrivate.h
+++ b/dom/workers/WorkerPrivate.h
@@ -1153,16 +1153,21 @@ public:
 #ifdef JS_GC_ZEAL
   void
   UpdateGCZeal(uint8_t aGCZeal, uint32_t aFrequency);
 #endif
 
   void
   OfflineStatusChangeEvent(bool aIsOffline);
 
+#ifdef MOZ_FUZZYFOX
+  void
+  UpdateFuzzyFoxClock(int64_t aNewTime);
+#endif
+
   nsresult
   Dispatch(already_AddRefed<WorkerRunnable> aRunnable,
            nsIEventTarget* aSyncLoopTarget = nullptr);
 
   nsresult
   DispatchControlRunnable(already_AddRefed<WorkerControlRunnable> aWorkerControlRunnable);
 
   nsresult