Changeset 229471 in webkit
- Timestamp:
- Mar 9, 2018 10:51:27 AM (6 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r229466 r229471 1 2018-03-09 Basuke Suzuki <Basuke.Suzuki@sony.com> 2 3 [Curl] Implement connection limit. 4 https://bugs.webkit.org/show_bug.cgi?id=183016 5 6 Implement both connection limit per host and total 7 connection limit on curl network layer. 8 9 Reviewed by Youenn Fablet. 10 11 No new tests because there's no behavior change. 12 13 * platform/network/curl/CurlContext.cpp: 14 (WebCore::EnvironmentVariableReader::sscanTemplate<signed>): 15 (WebCore::CurlContext::CurlContext): 16 (WebCore::CurlMultiHandle::setMaxConnects): 17 (WebCore::CurlMultiHandle::setMaxTotalConnections): 18 (WebCore::CurlMultiHandle::setMaxHostConnections): 19 * platform/network/curl/CurlContext.h: 20 (WebCore::CurlContext::scheduler): 21 * platform/network/curl/CurlRequest.cpp: 22 (WebCore::CurlRequest::startWithJobManager): 23 (WebCore::CurlRequest::cancel): 24 (WebCore::CurlRequest::invokeDidReceiveResponseForFile): 25 (WebCore::CurlRequest::completeDidReceiveResponse): 26 (WebCore::CurlRequest::pausedStatusChanged): 27 * platform/network/curl/CurlRequestScheduler.cpp: 28 (WebCore::CurlRequestScheduler::CurlRequestScheduler): 29 (WebCore::CurlRequestScheduler::workerThread): 30 (WebCore::CurlRequestScheduler::singleton): Deleted. 31 * platform/network/curl/CurlRequestScheduler.h: 32 1 33 2018-03-09 Jer Noble <jer.noble@apple.com> 2 34 -
trunk/Source/WebCore/platform/network/curl/CurlContext.cpp
r229138 r229471 29 29 30 30 #if USE(CURL) 31 #include "CurlRequestScheduler.h" 31 32 #include "HTTPHeaderMap.h" 32 33 #include <NetworkLoadMetrics.h> 34 #include <mutex> 33 35 #include <wtf/MainThread.h> 34 36 #include <wtf/NeverDestroyed.h> … … 67 69 68 70 // define specialized member function for specific type. 71 template<> constexpr const char* sscanTemplate<signed>() { return "%d"; } 69 72 template<> constexpr const char* sscanTemplate<unsigned>() { return "%u"; } 70 73 }; … … 89 92 if (auto value = envVar.readAs<unsigned>("WEBKIT_CURL_CONNECT_TIMEOUT")) 90 93 m_connectTimeout = Seconds(*value); 94 95 long maxConnects { CurlDefaultMaxConnects }; 96 long maxTotalConnections { CurlDefaultMaxTotalConnections }; 97 long maxHostConnections { CurlDefaultMaxHostConnections }; 98 99 if (auto value = envVar.readAs<signed>("WEBKIT_CURL_MAXCONNECTS")) 100 maxConnects = *value; 101 102 if (auto value = envVar.readAs<signed>("WEBKIT_CURL_MAX_TOTAL_CONNECTIONS")) 103 maxTotalConnections = *value; 104 105 if (auto value = envVar.readAs<signed>("WEBKIT_CURL_MAX_HOST_CONNECTIONS")) 106 maxHostConnections = *value; 107 108 m_scheduler = std::make_unique<CurlRequestScheduler>(maxConnects, maxTotalConnections, maxHostConnections); 91 109 92 110 #ifndef NDEBUG … … 214 232 } 215 233 234 void CurlMultiHandle::setMaxConnects(long maxConnects) 235 { 236 if (maxConnects < 0) 237 return; 238 239 curl_multi_setopt(m_multiHandle, CURLMOPT_MAXCONNECTS, maxConnects); 240 } 241 242 void CurlMultiHandle::setMaxTotalConnections(long maxTotalConnections) 243 { 244 curl_multi_setopt(m_multiHandle, CURLMOPT_MAX_TOTAL_CONNECTIONS, maxTotalConnections); 245 } 246 247 void CurlMultiHandle::setMaxHostConnections(long maxHostConnections) 248 { 249 curl_multi_setopt(m_multiHandle, CURLMOPT_MAX_HOST_CONNECTIONS, maxHostConnections); 250 } 251 216 252 CURLMcode CurlMultiHandle::addHandle(CURL* handle) 217 253 { -
trunk/Source/WebCore/platform/network/curl/CurlContext.h
r229138 r229471 54 54 }; 55 55 56 // Values taken from http://www.browserscope.org/ following 57 // the rule "Do What Every Other Modern Browser Is Doing". 58 const long CurlDefaultMaxConnects { -1 }; // -1 : Does not set CURLMOPT_MAXCONNECTS 59 const long CurlDefaultMaxTotalConnections { 17 }; 60 const long CurlDefaultMaxHostConnections { 6 }; 61 56 62 // CurlGlobal -------------------------------------------- 57 63 // to make the initialization of libcurl happen before other initialization of CurlContext … … 91 97 // CurlContext -------------------------------------------- 92 98 99 class CurlRequestScheduler; 100 93 101 class CurlContext : public CurlGlobal { 94 102 WTF_MAKE_NONCOPYABLE(CurlContext); … … 111 119 const CurlShareHandle& shareHandle() { return m_shareHandle; } 112 120 121 CurlRequestScheduler& scheduler() { return *m_scheduler; } 122 113 123 // Proxy 114 124 const ProxyInfo& proxyInfo() const { return m_proxy; } … … 138 148 CurlShareHandle m_shareHandle; 139 149 CurlSSLHandle m_sslHandle; 150 std::unique_ptr<CurlRequestScheduler> m_scheduler; 140 151 141 152 Seconds m_dnsCacheTimeout { Seconds::fromMinutes(5) }; … … 156 167 CurlMultiHandle(); 157 168 ~CurlMultiHandle(); 169 170 void setMaxConnects(long); 171 void setMaxTotalConnections(long); 172 void setMaxHostConnections(long); 158 173 159 174 CURLMcode addHandle(CURL*); -
trunk/Source/WebCore/platform/network/curl/CurlRequest.cpp
r229138 r229471 97 97 ASSERT(isMainThread()); 98 98 99 Curl RequestScheduler::singleton().add(this);99 CurlContext::singleton().scheduler().add(this); 100 100 } 101 101 … … 110 110 111 111 if (!m_isSyncRequest) { 112 auto& scheduler = Curl RequestScheduler::singleton();112 auto& scheduler = CurlContext::singleton().scheduler(); 113 113 114 114 if (needToInvokeDidCancelTransfer()) { … … 518 518 if (!m_isSyncRequest) { 519 519 // DidReceiveResponse must not be called immediately 520 Curl RequestScheduler::singleton().callOnWorkerThread([protectedThis = makeRef(*this)]() {520 CurlContext::singleton().scheduler().callOnWorkerThread([protectedThis = makeRef(*this)]() { 521 521 protectedThis->invokeDidReceiveResponse(protectedThis->m_response, Action::StartTransfer); 522 522 }); … … 561 561 } else if (m_actionAfterInvoke == Action::FinishTransfer) { 562 562 if (!m_isSyncRequest) { 563 Curl RequestScheduler::singleton().callOnWorkerThread([protectedThis = makeRef(*this), finishedResultCode = m_finishedResultCode]() {563 CurlContext::singleton().scheduler().callOnWorkerThread([protectedThis = makeRef(*this), finishedResultCode = m_finishedResultCode]() { 564 564 protectedThis->didCompleteTransfer(finishedResultCode); 565 565 }); … … 603 603 604 604 if (!m_isSyncRequest && isMainThread()) { 605 Curl RequestScheduler::singleton().callOnWorkerThread([protectedThis = makeRef(*this), paused = isPaused()]() {605 CurlContext::singleton().scheduler().callOnWorkerThread([protectedThis = makeRef(*this), paused = isPaused()]() { 606 606 if (protectedThis->isCompletedOrCancelled()) 607 607 return; -
trunk/Source/WebCore/platform/network/curl/CurlRequestScheduler.cpp
r224322 r229471 32 32 33 33 #include "CurlRequestSchedulerClient.h" 34 #include <wtf/NeverDestroyed.h>35 34 36 35 namespace WebCore { 37 36 38 CurlRequestScheduler& CurlRequestScheduler::singleton() 39 { 40 static NeverDestroyed<CurlRequestScheduler> sharedInstance; 41 return sharedInstance; 37 CurlRequestScheduler::CurlRequestScheduler(long maxConnects, long maxTotalConnections, long maxHostConnections) 38 : m_maxConnects(maxConnects) 39 , m_maxTotalConnections(maxTotalConnections) 40 , m_maxHostConnections(maxHostConnections) 41 { 42 42 } 43 43 … … 136 136 137 137 m_curlMultiHandle = std::make_unique<CurlMultiHandle>(); 138 m_curlMultiHandle->setMaxConnects(m_maxConnects); 139 m_curlMultiHandle->setMaxTotalConnections(m_maxTotalConnections); 140 m_curlMultiHandle->setMaxHostConnections(m_maxHostConnections); 138 141 139 142 while (m_runThread) { -
trunk/Source/WebCore/platform/network/curl/CurlRequestScheduler.h
r224322 r229471 42 42 friend NeverDestroyed<CurlRequestScheduler>; 43 43 public: 44 static CurlRequestScheduler& singleton(); 45 44 CurlRequestScheduler(long maxConnects, long maxTotalConnections, long maxHostConnections); 46 45 ~CurlRequestScheduler() { stopThread(); } 47 46 … … 52 51 53 52 private: 54 CurlRequestScheduler() = default;55 56 53 void startThreadIfNeeded(); 57 54 void stopThreadIfNoMoreJobRunning(); … … 75 72 76 73 std::unique_ptr<CurlMultiHandle> m_curlMultiHandle; 74 75 long m_maxConnects; 76 long m_maxTotalConnections; 77 long m_maxHostConnections; 77 78 }; 78 79
Note: See TracChangeset
for help on using the changeset viewer.