net.server_event: Optimize socket write buffers (don't do buf=buf..newdata).

remotes/origin/0.11
Waqas Hussain 13 years ago
parent 45da10ec05
commit a4bef98559
  1. 14
      net/server_event.lua

@ -40,6 +40,9 @@ local tostring = use "tostring"
local coroutine = use "coroutine"
local setmetatable = use "setmetatable"
local t_insert = table.insert
local t_concat = table.concat
local ssl = use "ssl"
local socket = use "socket" or require "socket"
@ -309,7 +312,7 @@ do
debug( "error:", err ) -- to much, check your app
return nil, err
end
self.writebuffer = self.writebuffer .. data -- new buffer
t_insert(self.writebuffer, data) -- new buffer
self.writebufferlen = total
if not self.eventwrite then -- register new write event
--vdebug( "register new write event" )
@ -466,7 +469,7 @@ do
type = "client";
conn = client;
currenttime = socket_gettime( ); -- safe the origin
writebuffer = ""; -- writebuffer
writebuffer = {}; -- writebuffer
writebufferlen = 0; -- length of writebuffer
send = client.send; -- caching table lookups
receive = client.receive;
@ -520,10 +523,11 @@ do
interface.eventwritetimeout = false
end
end
local succ, err, byte = interface.conn:send( interface.writebuffer, 1, interface.writebufferlen )
interface.writebuffer = { t_concat(interface.writebuffer) }
local succ, err, byte = interface.conn:send( interface.writebuffer[1], 1, interface.writebufferlen )
--vdebug( "write data:", interface.writebuffer, "error:", err, "part:", byte )
if succ then -- writing succesful
interface.writebuffer = ""
interface.writebuffer[1] = nil
interface.writebufferlen = 0
interface:ondrain();
if interface.fatalerror then
@ -539,7 +543,7 @@ do
return -1
elseif byte and (err == "timeout" or err == "wantwrite") then -- want write again
--vdebug( "writebuffer is not empty:", err )
interface.writebuffer = string_sub( interface.writebuffer, byte + 1, interface.writebufferlen ) -- new buffer
interface.writebuffer[1] = string_sub( interface.writebuffer[1], byte + 1, interface.writebufferlen ) -- new buffer
interface.writebufferlen = interface.writebufferlen - byte
if "wantread" == err then -- happens only with luasec
local callback = function( )

Loading…
Cancel
Save