- Revision
- 279993
- Author
- hironori.fu...@sony.com
- Date
- 2021-07-16 13:19:40 -0700 (Fri, 16 Jul 2021)
Log Message
[curl] Use curl_multi_poll and curl_multi_wakeup instead of select
https://bugs.webkit.org/show_bug.cgi?id=227966
Reviewed by Don Olmstead.
libcurl 7.68.0 added curl_multi_poll and curl_multi_wakeup.
* platform/network/curl/CurlContext.cpp:
(WebCore::CurlMultiHandle::poll): Added.
(WebCore::CurlMultiHandle::wakeUp): Added.
* platform/network/curl/CurlContext.h:
* platform/network/curl/CurlRequestScheduler.cpp:
(WebCore::CurlRequestScheduler::add):
(WebCore::CurlRequestScheduler::callOnWorkerThread):
(WebCore::CurlRequestScheduler::startOrWakeUpThread):
(WebCore::CurlRequestScheduler::wakeUpThreadIfPossible): Added.
(WebCore::CurlRequestScheduler::stopThread):
(WebCore::CurlRequestScheduler::workerThread):
(WebCore::CurlRequestScheduler::startThreadIfNeeded): Deleted.
* platform/network/curl/CurlRequestScheduler.h:
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (279992 => 279993)
--- trunk/Source/WebCore/ChangeLog 2021-07-16 18:24:35 UTC (rev 279992)
+++ trunk/Source/WebCore/ChangeLog 2021-07-16 20:19:40 UTC (rev 279993)
@@ -1,3 +1,26 @@
+2021-07-16 Fujii Hironori <hironori.fu...@sony.com>
+
+ [curl] Use curl_multi_poll and curl_multi_wakeup instead of select
+ https://bugs.webkit.org/show_bug.cgi?id=227966
+
+ Reviewed by Don Olmstead.
+
+ libcurl 7.68.0 added curl_multi_poll and curl_multi_wakeup.
+
+ * platform/network/curl/CurlContext.cpp:
+ (WebCore::CurlMultiHandle::poll): Added.
+ (WebCore::CurlMultiHandle::wakeUp): Added.
+ * platform/network/curl/CurlContext.h:
+ * platform/network/curl/CurlRequestScheduler.cpp:
+ (WebCore::CurlRequestScheduler::add):
+ (WebCore::CurlRequestScheduler::callOnWorkerThread):
+ (WebCore::CurlRequestScheduler::startOrWakeUpThread):
+ (WebCore::CurlRequestScheduler::wakeUpThreadIfPossible): Added.
+ (WebCore::CurlRequestScheduler::stopThread):
+ (WebCore::CurlRequestScheduler::workerThread):
+ (WebCore::CurlRequestScheduler::startThreadIfNeeded): Deleted.
+ * platform/network/curl/CurlRequestScheduler.h:
+
2021-07-16 Myles C. Maxfield <mmaxfi...@apple.com>
Make the lack of an ANGLE dylib unconditionally log
Modified: trunk/Source/WebCore/platform/network/curl/CurlContext.cpp (279992 => 279993)
--- trunk/Source/WebCore/platform/network/curl/CurlContext.cpp 2021-07-16 18:24:35 UTC (rev 279992)
+++ trunk/Source/WebCore/platform/network/curl/CurlContext.cpp 2021-07-16 20:19:40 UTC (rev 279993)
@@ -266,6 +266,17 @@
return curl_multi_fdset(m_multiHandle, &readFdSet, &writeFdSet, &excFdSet, &maxFd);
}
+CURLMcode CurlMultiHandle::poll(const Vector<curl_waitfd>& extraFds, int timeoutMS)
+{
+ int numFds = 0;
+ return curl_multi_poll(m_multiHandle, const_cast<curl_waitfd*>(extraFds.data()), extraFds.size(), timeoutMS, &numFds);
+}
+
+CURLMcode CurlMultiHandle::wakeUp()
+{
+ return curl_multi_wakeup(m_multiHandle);
+}
+
CURLMcode CurlMultiHandle::perform(int& runningHandles)
{
return curl_multi_perform(m_multiHandle, &runningHandles);
Modified: trunk/Source/WebCore/platform/network/curl/CurlContext.h (279992 => 279993)
--- trunk/Source/WebCore/platform/network/curl/CurlContext.h 2021-07-16 18:24:35 UTC (rev 279992)
+++ trunk/Source/WebCore/platform/network/curl/CurlContext.h 2021-07-16 20:19:40 UTC (rev 279993)
@@ -174,6 +174,8 @@
CURLMcode removeHandle(CURL*);
CURLMcode getFdSet(fd_set&, fd_set&, fd_set&, int&);
+ CURLMcode poll(const Vector<curl_waitfd>&, int);
+ CURLMcode wakeUp();
CURLMcode perform(int&);
CURLMsg* readInfo(int&);
Modified: trunk/Source/WebCore/platform/network/curl/CurlRequestScheduler.cpp (279992 => 279993)
--- trunk/Source/WebCore/platform/network/curl/CurlRequestScheduler.cpp 2021-07-16 18:24:35 UTC (rev 279992)
+++ trunk/Source/WebCore/platform/network/curl/CurlRequestScheduler.cpp 2021-07-16 20:19:40 UTC (rev 279993)
@@ -49,7 +49,7 @@
return false;
startTransfer(client);
- startThreadIfNeeded();
+ startOrWakeUpThread();
return true;
}
@@ -71,17 +71,19 @@
m_taskQueue.append(WTFMove(task));
}
- startThreadIfNeeded();
+ startOrWakeUpThread();
}
-void CurlRequestScheduler::startThreadIfNeeded()
+void CurlRequestScheduler::startOrWakeUpThread()
{
ASSERT(isMainThread());
{
Locker locker { m_mutex };
- if (m_runThread)
+ if (m_runThread) {
+ wakeUpThreadIfPossible();
return;
+ }
}
if (m_thread)
@@ -94,12 +96,18 @@
m_thread = Thread::create("curlThread", [this] {
workerThread();
-
- Locker locker { m_mutex };
- m_runThread = false;
}, ThreadType::Network);
}
+void CurlRequestScheduler::wakeUpThreadIfPossible()
+{
+ Locker locker { m_multiHandleMutex };
+ if (!m_curlMultiHandle)
+ return;
+
+ m_curlMultiHandle->wakeUp();
+}
+
void CurlRequestScheduler::stopThreadIfNoMoreJobRunning()
{
ASSERT(!isMainThread());
@@ -119,6 +127,7 @@
}
if (m_thread) {
+ wakeUpThreadIfPossible();
m_thread->waitForCompletion();
m_thread = nullptr;
}
@@ -143,10 +152,13 @@
{
ASSERT(!isMainThread());
- m_curlMultiHandle = makeUnique<CurlMultiHandle>();
- m_curlMultiHandle->setMaxConnects(m_maxConnects);
- m_curlMultiHandle->setMaxTotalConnections(m_maxTotalConnections);
- m_curlMultiHandle->setMaxHostConnections(m_maxHostConnections);
+ {
+ Locker locker { m_multiHandleMutex };
+ m_curlMultiHandle.emplace();
+ m_curlMultiHandle->setMaxConnects(m_maxConnects);
+ m_curlMultiHandle->setMaxTotalConnections(m_maxTotalConnections);
+ m_curlMultiHandle->setMaxHostConnections(m_maxHostConnections);
+ }
while (true) {
{
@@ -157,29 +169,9 @@
executeTasks();
- // Retry 'select' if it was interrupted by a process signal.
- int rc = 0;
- do {
- fd_set fdread;
- fd_set fdwrite;
- fd_set fdexcep;
- int maxfd = 0;
+ const int selectTimeoutMS = INT_MAX;
+ m_curlMultiHandle->poll({ }, selectTimeoutMS);
- const int selectTimeoutMS = 5;
-
- struct timeval timeout;
- timeout.tv_sec = 0;
- timeout.tv_usec = selectTimeoutMS * 1000; // select waits microseconds
-
- m_curlMultiHandle->getFdSet(fdread, fdwrite, fdexcep, maxfd);
-
- // When the 3 file descriptors are empty, winsock will return -1
- // and bail out, stopping the file download. So make sure we
- // have valid file descriptors before calling select.
- if (maxfd >= 0)
- rc = ::select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
- } while (rc == -1 && errno == EINTR);
-
int activeCount = 0;
while (m_curlMultiHandle->perform(activeCount) == CURLM_CALL_MULTI_PERFORM) { }
@@ -199,7 +191,10 @@
stopThreadIfNoMoreJobRunning();
}
- m_curlMultiHandle = nullptr;
+ {
+ Locker locker { m_multiHandleMutex };
+ m_curlMultiHandle.reset();
+ }
}
void CurlRequestScheduler::startTransfer(CurlRequestSchedulerClient* client)
Modified: trunk/Source/WebCore/platform/network/curl/CurlRequestScheduler.h (279992 => 279993)
--- trunk/Source/WebCore/platform/network/curl/CurlRequestScheduler.h 2021-07-16 18:24:35 UTC (rev 279992)
+++ trunk/Source/WebCore/platform/network/curl/CurlRequestScheduler.h 2021-07-16 20:19:40 UTC (rev 279993)
@@ -51,7 +51,8 @@
void callOnWorkerThread(WTF::Function<void()>&&);
private:
- void startThreadIfNeeded();
+ void startOrWakeUpThread();
+ void wakeUpThreadIfPossible();
void stopThreadIfNoMoreJobRunning();
void stopThread();
@@ -72,7 +73,8 @@
HashSet<CurlRequestSchedulerClient*> m_activeJobs;
HashMap<CURL*, CurlRequestSchedulerClient*> m_clientMaps;
- std::unique_ptr<CurlMultiHandle> m_curlMultiHandle;
+ Lock m_multiHandleMutex;
+ std::optional<CurlMultiHandle> m_curlMultiHandle;
long m_maxConnects;
long m_maxTotalConnections;