Software / code / prosody
Comparison
net/server_select.lua @ 6054:7a5ddbaf758d
Merge 0.9->0.10
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Wed, 02 Apr 2014 17:41:38 +0100 |
| parent | 6047:4db0403bfc0d |
| parent | 5950:bd1d1c29a7e7 |
| child | 6055:596539a30e9b |
| child | 6315:7a3e2f2d43fc |
comparison
equal
deleted
inserted
replaced
| 6053:2f93a04564b2 | 6054:7a5ddbaf758d |
|---|---|
| 1 -- | 1 -- |
| 2 -- server.lua by blastbeat of the luadch project | 2 -- server.lua by blastbeat of the luadch project |
| 3 -- Re-used here under the MIT/X Consortium License | 3 -- Re-used here under the MIT/X Consortium License |
| 4 -- | 4 -- |
| 5 -- Modifications (C) 2008-2010 Matthew Wild, Waqas Hussain | 5 -- Modifications (C) 2008-2010 Matthew Wild, Waqas Hussain |
| 6 -- | 6 -- |
| 7 | 7 |
| 8 -- // wrapping luadch stuff // -- | 8 -- // wrapping luadch stuff // -- |
| 9 | 9 |
| 143 _tcpbacklog = 128 -- some kind of hint to the OS | 143 _tcpbacklog = 128 -- some kind of hint to the OS |
| 144 | 144 |
| 145 _maxsendlen = 51000 * 1024 -- max len of send buffer | 145 _maxsendlen = 51000 * 1024 -- max len of send buffer |
| 146 _maxreadlen = 25000 * 1024 -- max len of read buffer | 146 _maxreadlen = 25000 * 1024 -- max len of read buffer |
| 147 | 147 |
| 148 _checkinterval = 1200000 -- interval in secs to check idle clients | 148 _checkinterval = 30 -- interval in secs to check idle clients |
| 149 _sendtimeout = 60000 -- allowed send idle time in secs | 149 _sendtimeout = 60000 -- allowed send idle time in secs |
| 150 _readtimeout = 6 * 60 * 60 -- allowed read idle time in secs | 150 _readtimeout = 6 * 60 * 60 -- allowed read idle time in secs |
| 151 | 151 |
| 152 local is_windows = package.config:sub(1,1) == "\\" -- check the directory separator, to detemine whether this is Windows | 152 local is_windows = package.config:sub(1,1) == "\\" -- check the directory separator, to detemine whether this is Windows |
| 153 _maxfd = (is_windows and math.huge) or luasocket._SETSIZE or 1024 -- max fd number, limit to 1024 by default to prevent glibc buffer overflow, but not on Windows | 153 _maxfd = (is_windows and math.huge) or luasocket._SETSIZE or 1024 -- max fd number, limit to 1024 by default to prevent glibc buffer overflow, but not on Windows |
| 282 | 282 |
| 283 local dispatch = listeners.onincoming | 283 local dispatch = listeners.onincoming |
| 284 local status = listeners.onstatus | 284 local status = listeners.onstatus |
| 285 local disconnect = listeners.ondisconnect | 285 local disconnect = listeners.ondisconnect |
| 286 local drain = listeners.ondrain | 286 local drain = listeners.ondrain |
| 287 local onreadtimeout = listeners.onreadtimeout; | |
| 287 | 288 |
| 288 local bufferqueue = { } -- buffer array | 289 local bufferqueue = { } -- buffer array |
| 289 local bufferqueuelen = 0 -- end of buffer array | 290 local bufferqueuelen = 0 -- end of buffer array |
| 290 | 291 |
| 291 local toclose | 292 local toclose |
| 310 return dispatch | 311 return dispatch |
| 311 end | 312 end |
| 312 handler.disconnect = function( ) | 313 handler.disconnect = function( ) |
| 313 return disconnect | 314 return disconnect |
| 314 end | 315 end |
| 316 handler.onreadtimeout = onreadtimeout; | |
| 317 | |
| 315 handler.setlistener = function( self, listeners ) | 318 handler.setlistener = function( self, listeners ) |
| 316 dispatch = listeners.onincoming | 319 dispatch = listeners.onincoming |
| 317 disconnect = listeners.ondisconnect | 320 disconnect = listeners.ondisconnect |
| 318 status = listeners.onstatus | 321 status = listeners.onstatus |
| 319 drain = listeners.ondrain | 322 drain = listeners.ondrain |
| 323 handler.onreadtimeout = listeners.onreadtimeout | |
| 320 end | 324 end |
| 321 handler.getstats = function( ) | 325 handler.getstats = function( ) |
| 322 return readtraffic, sendtraffic | 326 return readtraffic, sendtraffic |
| 323 end | 327 end |
| 324 handler.ssl = function( ) | 328 handler.ssl = function( ) |
| 606 send = socket.send | 610 send = socket.send |
| 607 receive = socket.receive | 611 receive = socket.receive |
| 608 shutdown = id | 612 shutdown = id |
| 609 _socketlist[ socket ] = handler | 613 _socketlist[ socket ] = handler |
| 610 _readlistlen = addsocket(_readlist, socket, _readlistlen) | 614 _readlistlen = addsocket(_readlist, socket, _readlistlen) |
| 611 | 615 |
| 612 -- remove traces of the old socket | 616 -- remove traces of the old socket |
| 613 _readlistlen = removesocket( _readlist, oldsocket, _readlistlen ) | 617 _readlistlen = removesocket( _readlist, oldsocket, _readlistlen ) |
| 614 _sendlistlen = removesocket( _sendlist, oldsocket, _sendlistlen ) | 618 _sendlistlen = removesocket( _sendlist, oldsocket, _sendlistlen ) |
| 615 _socketlist[ oldsocket ] = nil | 619 _socketlist[ oldsocket ] = nil |
| 616 | 620 |
| 694 if sender_locked and receiver.bufferlen() < buffersize then | 698 if sender_locked and receiver.bufferlen() < buffersize then |
| 695 sender:lock_read(false); -- Unlock now | 699 sender:lock_read(false); -- Unlock now |
| 696 sender_locked = nil; | 700 sender_locked = nil; |
| 697 end | 701 end |
| 698 end | 702 end |
| 699 | 703 |
| 700 local _readbuffer = sender.readbuffer; | 704 local _readbuffer = sender.readbuffer; |
| 701 function sender.readbuffer() | 705 function sender.readbuffer() |
| 702 _readbuffer(); | 706 _readbuffer(); |
| 703 if not sender_locked and receiver.bufferlen() >= buffersize then | 707 if not sender_locked and receiver.bufferlen() >= buffersize then |
| 704 sender_locked = true; | 708 sender_locked = true; |
| 862 local difftime = os_difftime( _currenttime - _starttime ) | 866 local difftime = os_difftime( _currenttime - _starttime ) |
| 863 if difftime > _checkinterval then | 867 if difftime > _checkinterval then |
| 864 _starttime = _currenttime | 868 _starttime = _currenttime |
| 865 for handler, timestamp in pairs( _writetimes ) do | 869 for handler, timestamp in pairs( _writetimes ) do |
| 866 if os_difftime( _currenttime - timestamp ) > _sendtimeout then | 870 if os_difftime( _currenttime - timestamp ) > _sendtimeout then |
| 867 --_writetimes[ handler ] = nil | |
| 868 handler.disconnect( )( handler, "send timeout" ) | 871 handler.disconnect( )( handler, "send timeout" ) |
| 869 handler:force_close() -- forced disconnect | 872 handler:force_close() -- forced disconnect |
| 870 end | 873 end |
| 871 end | 874 end |
| 872 for handler, timestamp in pairs( _readtimes ) do | 875 for handler, timestamp in pairs( _readtimes ) do |
| 873 if os_difftime( _currenttime - timestamp ) > _readtimeout then | 876 if os_difftime( _currenttime - timestamp ) > _readtimeout then |
| 874 --_readtimes[ handler ] = nil | 877 if not(handler.onreadtimeout) or handler:onreadtimeout() ~= true then |
| 875 handler.disconnect( )( handler, "read timeout" ) | 878 handler.disconnect( )( handler, "read timeout" ) |
| 876 handler:close( ) -- forced disconnect? | 879 handler:close( ) -- forced disconnect? |
| 880 end | |
| 877 end | 881 end |
| 878 end | 882 end |
| 879 end | 883 end |
| 880 | 884 |
| 881 -- Fire timers | 885 -- Fire timers |
| 932 return nil, err | 936 return nil, err |
| 933 end | 937 end |
| 934 client:settimeout( 0 ) | 938 client:settimeout( 0 ) |
| 935 _, err = client:connect( address, port ) | 939 _, err = client:connect( address, port ) |
| 936 if err then -- try again | 940 if err then -- try again |
| 937 local handler = wrapclient( client, address, port, listeners ) | 941 return wrapclient( client, address, port, listeners, pattern, sslctx ) |
| 938 else | 942 else |
| 939 wrapconnection( nil, listeners, client, address, port, "clientport", pattern, sslctx ) | 943 return wrapconnection( nil, listeners, client, address, port, "clientport", pattern, sslctx ) |
| 940 end | 944 end |
| 941 end | 945 end |
| 942 | 946 |
| 943 --// EXPERIMENTAL //-- | 947 --// EXPERIMENTAL //-- |
| 944 | 948 |
| 964 return { | 968 return { |
| 965 _addtimer = addtimer, | 969 _addtimer = addtimer, |
| 966 | 970 |
| 967 addclient = addclient, | 971 addclient = addclient, |
| 968 wrapclient = wrapclient, | 972 wrapclient = wrapclient, |
| 969 | 973 |
| 970 loop = loop, | 974 loop = loop, |
| 971 link = link, | 975 link = link, |
| 972 step = step, | 976 step = step, |
| 973 stats = stats, | 977 stats = stats, |
| 974 closeall = closeall, | 978 closeall = closeall, |