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