summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--modules/libpref/init/all.js5
-rw-r--r--netwerk/base/nsSocketTransportService2.cpp50
-rw-r--r--netwerk/base/nsSocketTransportService2.h8
3 files changed, 33 insertions, 30 deletions
diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js
index 1e60c97c5..314beac37 100644
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -1663,11 +1663,6 @@ pref("network.websocket.timeout.open", 20);
// close message
pref("network.websocket.timeout.close", 20);
-// Setting this to true will clamp the websocket timeout value to a minimum
-// regardless if there are pending events on the thread.
-// This is a workaround for runaway polling, see issue #1695
-pref("network.websocket.timeout.clamped", false);
-
// the number of seconds of idle read activity to sustain before sending a
// ping probe. 0 to disable.
pref("network.websocket.timeout.ping.request", 0);
diff --git a/netwerk/base/nsSocketTransportService2.cpp b/netwerk/base/nsSocketTransportService2.cpp
index 956332953..2a0a0868b 100644
--- a/netwerk/base/nsSocketTransportService2.cpp
+++ b/netwerk/base/nsSocketTransportService2.cpp
@@ -42,7 +42,6 @@ Atomic<PRThread*, Relaxed> gSocketThread;
#define KEEPALIVE_PROBE_COUNT_PREF "network.tcp.keepalive.probe_count"
#define SOCKET_LIMIT_TARGET 1000U
#define SOCKET_LIMIT_MIN 50U
-#define SOCKET_CLAMP_PREF "network.websocket.timeout.clamped"
#define BLIP_INTERVAL_PREF "network.activity.blipIntervalMilliseconds"
#define MAX_TIME_BETWEEN_TWO_POLLS "network.sts.max_time_for_events_between_two_polls"
#define MAX_TIME_FOR_PR_CLOSE_DURING_SHUTDOWN "network.sts.max_time_for_pr_close_during_shutdown"
@@ -121,8 +120,8 @@ nsSocketTransportService::nsSocketTransportService()
, mKeepaliveEnabledPref(false)
, mServingPendingQueue(false)
, mMaxTimePerPollIter(100)
- , mClampSocketTimeout(false)
, mMaxTimeForPrClosePref(PR_SecondsToInterval(5))
+ , mSleepPhase(false)
, mProbedMaxCount(false)
#if defined(XP_WIN)
, mPolling(false)
@@ -487,11 +486,7 @@ nsSocketTransportService::Poll(PRIntervalTime ts)
mPollList[0].out_flags = 0;
pollList = mPollList;
pollCount = mActiveCount + 1;
- pollTimeout = IsSocketTimeoutClamped() ?
- PR_MillisecondsToInterval(100) :
- pendingEvents ?
- PR_INTERVAL_NO_WAIT :
- PollTimeout(ts);
+ pollTimeout = pendingEvents ? PR_INTERVAL_NO_WAIT : PollTimeout(ts);
}
else {
// no pollable event, so busy wait...
@@ -500,11 +495,8 @@ nsSocketTransportService::Poll(PRIntervalTime ts)
pollList = &mPollList[1];
else
pollList = nullptr;
- pollTimeout = IsSocketTimeoutClamped() ?
- PR_MillisecondsToInterval(25) :
- pendingEvents ?
- PR_INTERVAL_NO_WAIT :
- PR_MillisecondsToInterval(25);
+ pollTimeout =
+ pendingEvents ? PR_INTERVAL_NO_WAIT : PR_MillisecondsToInterval(25);
}
SOCKET_LOG((" timeout = %i milliseconds\n",
@@ -563,7 +555,6 @@ nsSocketTransportService::Init()
tmpPrefService->AddObserver(KEEPALIVE_RETRY_INTERVAL_PREF, this, false);
tmpPrefService->AddObserver(KEEPALIVE_PROBE_COUNT_PREF, this, false);
tmpPrefService->AddObserver(MAX_TIME_BETWEEN_TWO_POLLS, this, false);
- tmpPrefService->AddObserver(SOCKET_CLAMP_PREF, this, false);
tmpPrefService->AddObserver(MAX_TIME_FOR_PR_CLOSE_DURING_SHUTDOWN, this, false);
}
UpdatePrefs();
@@ -572,6 +563,8 @@ nsSocketTransportService::Init()
if (obsSvc) {
obsSvc->AddObserver(this, "profile-initial-state", false);
obsSvc->AddObserver(this, "last-pb-context-exited", false);
+ obsSvc->AddObserver(this, NS_WIDGET_SLEEP_OBSERVER_TOPIC, true);
+ obsSvc->AddObserver(this, NS_WIDGET_WAKE_OBSERVER_TOPIC, true);
obsSvc->AddObserver(this, "xpcom-shutdown-threads", false);
}
@@ -638,9 +631,16 @@ nsSocketTransportService::ShutdownThread()
if (obsSvc) {
obsSvc->RemoveObserver(this, "profile-initial-state");
obsSvc->RemoveObserver(this, "last-pb-context-exited");
+ obsSvc->RemoveObserver(this, NS_WIDGET_SLEEP_OBSERVER_TOPIC);
+ obsSvc->RemoveObserver(this, NS_WIDGET_WAKE_OBSERVER_TOPIC);
obsSvc->RemoveObserver(this, "xpcom-shutdown-threads");
}
+ if (mAfterWakeUpTimer) {
+ mAfterWakeUpTimer->Cancel();
+ mAfterWakeUpTimer = nullptr;
+ }
+
NetworkActivityMonitor::Shutdown();
mInitialized = false;
@@ -1160,13 +1160,6 @@ nsSocketTransportService::UpdatePrefs()
if (NS_SUCCEEDED(rv) && maxTimePref >= 0) {
mMaxTimePerPollIter = maxTimePref;
}
-
- bool socketTimeoutClamped = false;
- rv = tmpPrefService->GetBoolPref(SOCKET_CLAMP_PREF,
- &socketTimeoutClamped);
- if (NS_SUCCEEDED(rv)) {
- mClampSocketTimeout = socketTimeoutClamped;
- }
int32_t maxTimeForPrClosePref;
rv = tmpPrefService->GetIntPref(MAX_TIME_FOR_PR_CLOSE_DURING_SHUTDOWN,
@@ -1245,6 +1238,10 @@ nsSocketTransportService::Observe(nsISupports *subject,
if (!strcmp(topic, NS_TIMER_CALLBACK_TOPIC)) {
nsCOMPtr<nsITimer> timer = do_QueryInterface(subject);
+ if (timer == mAfterWakeUpTimer) {
+ mAfterWakeUpTimer = nullptr;
+ mSleepPhase = false;
+ }
#if defined(XP_WIN)
if (timer == mPollRepairTimer) {
@@ -1252,6 +1249,19 @@ nsSocketTransportService::Observe(nsISupports *subject,
}
#endif
+ } else if (!strcmp(topic, NS_WIDGET_SLEEP_OBSERVER_TOPIC)) {
+ mSleepPhase = true;
+ if (mAfterWakeUpTimer) {
+ mAfterWakeUpTimer->Cancel();
+ mAfterWakeUpTimer = nullptr;
+ }
+ } else if (!strcmp(topic, NS_WIDGET_WAKE_OBSERVER_TOPIC)) {
+ if (mSleepPhase && !mAfterWakeUpTimer) {
+ mAfterWakeUpTimer = do_CreateInstance("@mozilla.org/timer;1");
+ if (mAfterWakeUpTimer) {
+ mAfterWakeUpTimer->Init(this, 2000, nsITimer::TYPE_ONE_SHOT);
+ }
+ }
} else if (!strcmp(topic, "xpcom-shutdown-threads")) {
ShutdownThread();
}
diff --git a/netwerk/base/nsSocketTransportService2.h b/netwerk/base/nsSocketTransportService2.h
index 9360dd905..484dbe098 100644
--- a/netwerk/base/nsSocketTransportService2.h
+++ b/netwerk/base/nsSocketTransportService2.h
@@ -116,9 +116,6 @@ public:
// Returns true if keepalives are enabled in prefs.
bool IsKeepaliveEnabled() { return mKeepaliveEnabledPref; }
-
- // Returns true if socket timeout clamping is enabled in prefs.
- bool IsSocketTimeoutClamped() { return mClampSocketTimeout; }
PRIntervalTime MaxTimeForPrClosePref() {return mMaxTimeForPrClosePref; }
protected:
@@ -256,13 +253,14 @@ private:
int32_t mKeepaliveProbeCount;
// True if TCP keepalive is enabled globally.
bool mKeepaliveEnabledPref;
- // True if socket polling should be clamped.
- bool mClampSocketTimeout;
Atomic<bool> mServingPendingQueue;
Atomic<int32_t, Relaxed> mMaxTimePerPollIter;
Atomic<PRIntervalTime, Relaxed> mMaxTimeForPrClosePref;
+ Atomic<bool, Relaxed> mSleepPhase;
+ nsCOMPtr<nsITimer> mAfterWakeUpTimer;
+
void OnKeepaliveEnabledPrefChange();
void NotifyKeepaliveEnabledPrefChange(SocketContext *sock);