From 7a5eafd40d3611f5600e895971a1764ac39bb49f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Thu, 29 May 2014 13:29:22 +0200
Subject: [PATCH] SSL.sslfile: Write multiple packets in the same write().

Use the support for writev(2) to write the packets in the write_buffer.

This should improve data throughput measurably.

NB: This reduces the number of required rounds in the backend
during handshaking to the old level.
---
 lib/modules/SSL.pmod/sslfile.pike | 17 +++++++++++------
 lib/modules/SSL.pmod/testsuite.in |  2 +-
 2 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/lib/modules/SSL.pmod/sslfile.pike b/lib/modules/SSL.pmod/sslfile.pike
index 2e82a1ed9f..ced3fd2a75 100644
--- a/lib/modules/SSL.pmod/sslfile.pike
+++ b/lib/modules/SSL.pmod/sslfile.pike
@@ -2066,14 +2066,13 @@ protected int ssl_write_callback (int called_from_real_backend)
   write_to_stream:
     do {
       if (sizeof (write_buffer)) {
-	string output = write_buffer[0];
 	int written;
 #ifdef SIMULATE_CLOSE_PACKET_WRITE_FAILURE
 	if (conn->state & CONNECTION_local_closing)
 	  written = -1;
 	else
 #endif
-	  written = stream->write (output);
+	  written = stream->write (write_buffer);
 
 	if (written < 0
 #if 0
@@ -2148,10 +2147,16 @@ protected int ssl_write_callback (int called_from_real_backend)
 	  break write_to_stream;
 	}
 
-	if (written == sizeof (output))
-	  write_buffer = write_buffer[1..];
-	else
-	  write_buffer[0] = output[written..];
+	for (int bytes = written; bytes > 0;) {
+	  if (bytes >= sizeof(write_buffer[0])) {
+	    bytes -= sizeof(write_buffer[0]);
+	    write_buffer = write_buffer[1..];
+	  } else {
+	    write_buffer[0] = write_buffer[0][bytes..];
+	    bytes = 0;
+	    break;
+	  }
+	}
 
 	SSL3_DEBUG_MSG ("ssl_write_callback: Wrote %d bytes (%d strings left)\n",
 			written, sizeof (write_buffer));
diff --git a/lib/modules/SSL.pmod/testsuite.in b/lib/modules/SSL.pmod/testsuite.in
index b7370b97ba..95e8d34249 100644
--- a/lib/modules/SSL.pmod/testsuite.in
+++ b/lib/modules/SSL.pmod/testsuite.in
@@ -447,7 +447,7 @@ test_do([[
 
     int state;
 
-    int trigged = 20;
+    int trigged = 10;
 
     string fail;
 
-- 
GitLab