Title: [279993] trunk/Source/WebCore
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;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to