]> granicus.if.org Git - curl/commitdiff
windows: implement send buffer tuning
authorDaniel Jelinski <daniel.jelinski@thomsonreuters.com>
Thu, 19 Jul 2018 12:07:59 +0000 (14:07 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 8 Aug 2018 11:38:50 +0000 (13:38 +0200)
Significantly enhances upload performance on modern Windows versions.

Bug: https://curl.haxx.se/mail/lib-2018-07/0080.html
Closes #2762
Fixes #2224

lib/transfer.c

index 43f567c4f7bc67f54d471b3aac4e6457746a8f1e..1d33e861a882afc6f4f5c0fd2df2c25e581ba4ad 100644 (file)
@@ -869,6 +869,22 @@ static CURLcode done_sending(struct connectdata *conn,
   return CURLE_OK;
 }
 
+#if defined(WIN32) && defined(SIO_IDEAL_SEND_BACKLOG_QUERY)
+static void win_update_buffer_size(curl_socket_t sockfd)
+{
+  int result;
+  ULONG ideal;
+  DWORD ideallen;
+  result = WSAIoctl(sockfd, SIO_IDEAL_SEND_BACKLOG_QUERY, 0, 0,
+                    &ideal, sizeof(ideal), &ideallen, 0, 0);
+  if(result == 0) {
+    setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF,
+               (const char *)&ideal, sizeof(ideal));
+  }
+}
+#else
+#define win_update_buffer_size(x)
+#endif
 
 /*
  * Send data to upload to the server, when the socket is writable.
@@ -1020,10 +1036,11 @@ static CURLcode readwrite_upload(struct Curl_easy *data,
                         k->upload_fromhere, /* buffer pointer */
                         k->upload_present,  /* buffer size */
                         &bytes_written);    /* actually sent */
-
     if(result)
       return result;
 
+    win_update_buffer_size(conn->writesockfd);
+
     if(data->set.verbose)
       /* show the data before we change the pointer upload_fromhere */
       Curl_debug(data, CURLINFO_DATA_OUT, k->upload_fromhere,