Mercurial > prosody-hg
comparison net/server_event.lua @ 5286:0cbe57fbe2cd
net.server_event: Optimize socket write buffers (don't do buf=buf..newdata).
| author | Waqas Hussain <waqas20@gmail.com> |
|---|---|
| date | Sun, 06 Jan 2013 04:55:53 +0500 |
| parents | 8585f3cc4976 |
| children | b5cae12411af |
comparison
equal
deleted
inserted
replaced
| 5284:5d2282a29387 | 5286:0cbe57fbe2cd |
|---|---|
| 37 local select = use "select" | 37 local select = use "select" |
| 38 local require = use "require" | 38 local require = use "require" |
| 39 local tostring = use "tostring" | 39 local tostring = use "tostring" |
| 40 local coroutine = use "coroutine" | 40 local coroutine = use "coroutine" |
| 41 local setmetatable = use "setmetatable" | 41 local setmetatable = use "setmetatable" |
| 42 | |
| 43 local t_insert = table.insert | |
| 44 local t_concat = table.concat | |
| 42 | 45 |
| 43 local ssl = use "ssl" | 46 local ssl = use "ssl" |
| 44 local socket = use "socket" or require "socket" | 47 local socket = use "socket" or require "socket" |
| 45 | 48 |
| 46 local log = require ("util.logger").init("socket") | 49 local log = require ("util.logger").init("socket") |
| 307 if total > cfg.MAX_SEND_LENGTH then -- check buffer length | 310 if total > cfg.MAX_SEND_LENGTH then -- check buffer length |
| 308 local err = "send buffer exceeded" | 311 local err = "send buffer exceeded" |
| 309 debug( "error:", err ) -- to much, check your app | 312 debug( "error:", err ) -- to much, check your app |
| 310 return nil, err | 313 return nil, err |
| 311 end | 314 end |
| 312 self.writebuffer = self.writebuffer .. data -- new buffer | 315 t_insert(self.writebuffer, data) -- new buffer |
| 313 self.writebufferlen = total | 316 self.writebufferlen = total |
| 314 if not self.eventwrite then -- register new write event | 317 if not self.eventwrite then -- register new write event |
| 315 --vdebug( "register new write event" ) | 318 --vdebug( "register new write event" ) |
| 316 self.eventwrite = addevent( base, self.conn, EV_WRITE, self.writecallback, cfg.WRITE_TIMEOUT ) | 319 self.eventwrite = addevent( base, self.conn, EV_WRITE, self.writecallback, cfg.WRITE_TIMEOUT ) |
| 317 end | 320 end |
| 464 --vdebug("creating client interfacce...") | 467 --vdebug("creating client interfacce...") |
| 465 local interface = { | 468 local interface = { |
| 466 type = "client"; | 469 type = "client"; |
| 467 conn = client; | 470 conn = client; |
| 468 currenttime = socket_gettime( ); -- safe the origin | 471 currenttime = socket_gettime( ); -- safe the origin |
| 469 writebuffer = ""; -- writebuffer | 472 writebuffer = {}; -- writebuffer |
| 470 writebufferlen = 0; -- length of writebuffer | 473 writebufferlen = 0; -- length of writebuffer |
| 471 send = client.send; -- caching table lookups | 474 send = client.send; -- caching table lookups |
| 472 receive = client.receive; | 475 receive = client.receive; |
| 473 onconnect = listener.onconnect; -- will be called when client disconnects | 476 onconnect = listener.onconnect; -- will be called when client disconnects |
| 474 ondisconnect = listener.ondisconnect; -- will be called when client disconnects | 477 ondisconnect = listener.ondisconnect; -- will be called when client disconnects |
| 518 if interface.eventwritetimeout then -- luasec only | 521 if interface.eventwritetimeout then -- luasec only |
| 519 interface.eventwritetimeout:close( ) -- first we have to close timeout event which where regged after a wantread error | 522 interface.eventwritetimeout:close( ) -- first we have to close timeout event which where regged after a wantread error |
| 520 interface.eventwritetimeout = false | 523 interface.eventwritetimeout = false |
| 521 end | 524 end |
| 522 end | 525 end |
| 523 local succ, err, byte = interface.conn:send( interface.writebuffer, 1, interface.writebufferlen ) | 526 interface.writebuffer = { t_concat(interface.writebuffer) } |
| 527 local succ, err, byte = interface.conn:send( interface.writebuffer[1], 1, interface.writebufferlen ) | |
| 524 --vdebug( "write data:", interface.writebuffer, "error:", err, "part:", byte ) | 528 --vdebug( "write data:", interface.writebuffer, "error:", err, "part:", byte ) |
| 525 if succ then -- writing succesful | 529 if succ then -- writing succesful |
| 526 interface.writebuffer = "" | 530 interface.writebuffer[1] = nil |
| 527 interface.writebufferlen = 0 | 531 interface.writebufferlen = 0 |
| 528 interface:ondrain(); | 532 interface:ondrain(); |
| 529 if interface.fatalerror then | 533 if interface.fatalerror then |
| 530 debug "closing client after writing" | 534 debug "closing client after writing" |
| 531 interface:_close() -- close interface if needed | 535 interface:_close() -- close interface if needed |
| 537 end | 541 end |
| 538 interface.eventwrite = nil | 542 interface.eventwrite = nil |
| 539 return -1 | 543 return -1 |
| 540 elseif byte and (err == "timeout" or err == "wantwrite") then -- want write again | 544 elseif byte and (err == "timeout" or err == "wantwrite") then -- want write again |
| 541 --vdebug( "writebuffer is not empty:", err ) | 545 --vdebug( "writebuffer is not empty:", err ) |
| 542 interface.writebuffer = string_sub( interface.writebuffer, byte + 1, interface.writebufferlen ) -- new buffer | 546 interface.writebuffer[1] = string_sub( interface.writebuffer[1], byte + 1, interface.writebufferlen ) -- new buffer |
| 543 interface.writebufferlen = interface.writebufferlen - byte | 547 interface.writebufferlen = interface.writebufferlen - byte |
| 544 if "wantread" == err then -- happens only with luasec | 548 if "wantread" == err then -- happens only with luasec |
| 545 local callback = function( ) | 549 local callback = function( ) |
| 546 interface:_close() | 550 interface:_close() |
| 547 interface.eventwritetimeout = nil | 551 interface.eventwritetimeout = nil |
