net/server_select.lua

changeset 3682
d12141cbbaa0
parent 3543
90b21508ac27
child 3685
63efe4eefa07
equal deleted inserted replaced
3681:3dbdcc79bd66 3682:d12141cbbaa0
42 local string = use "string" 42 local string = use "string"
43 local coroutine = use "coroutine" 43 local coroutine = use "coroutine"
44 44
45 --// lua lib methods //-- 45 --// lua lib methods //--
46 46
47 local os_time = os.time
48 local os_difftime = os.difftime 47 local os_difftime = os.difftime
48 local math_min = math.min
49 local math_huge = math.huge
49 local table_concat = table.concat 50 local table_concat = table.concat
50 local table_remove = table.remove 51 local table_remove = table.remove
51 local string_len = string.len 52 local string_len = string.len
52 local string_sub = string.sub 53 local string_sub = string.sub
53 local coroutine_wrap = coroutine.wrap 54 local coroutine_wrap = coroutine.wrap
55 56
56 --// extern libs //-- 57 --// extern libs //--
57 58
58 local luasec = use "ssl" 59 local luasec = use "ssl"
59 local luasocket = use "socket" or require "socket" 60 local luasocket = use "socket" or require "socket"
61 local luasocket_gettime = luasocket.gettime
60 62
61 --// extern lib methods //-- 63 --// extern lib methods //--
62 64
63 local ssl_wrap = ( luasec and luasec.wrap ) 65 local ssl_wrap = ( luasec and luasec.wrap )
64 local socket_bind = luasocket.bind 66 local socket_bind = luasocket.bind
794 end 796 end
795 797
796 loop = function(once) -- this is the main loop of the program 798 loop = function(once) -- this is the main loop of the program
797 if quitting then return "quitting"; end 799 if quitting then return "quitting"; end
798 if once then quitting = "once"; end 800 if once then quitting = "once"; end
801 local next_timer_time = math_huge;
799 repeat 802 repeat
800 local read, write, err = socket_select( _readlist, _sendlist, _selecttimeout ) 803 local read, write, err = socket_select( _readlist, _sendlist, math_min(_selecttimeout, next_timer_time) )
801 for i, socket in ipairs( write ) do -- send data waiting in writequeues 804 for i, socket in ipairs( write ) do -- send data waiting in writequeues
802 local handler = _socketlist[ socket ] 805 local handler = _socketlist[ socket ]
803 if handler then 806 if handler then
804 handler.sendbuffer( ) 807 handler.sendbuffer( )
805 else 808 else
819 for handler, err in pairs( _closelist ) do 822 for handler, err in pairs( _closelist ) do
820 handler.disconnect( )( handler, err ) 823 handler.disconnect( )( handler, err )
821 handler:close( true ) -- forced disconnect 824 handler:close( true ) -- forced disconnect
822 end 825 end
823 clean( _closelist ) 826 clean( _closelist )
824 _currenttime = os_time( ) 827 _currenttime = luasocket_gettime( )
825 if os_difftime( _currenttime - _timer ) >= 1 then 828 if _currenttime - _timer >= math_min(next_timer_time, 1) then
829 next_timer_time = math_huge;
826 for i = 1, _timerlistlen do 830 for i = 1, _timerlistlen do
827 _timerlist[ i ]( _currenttime ) -- fire timers 831 local t = _timerlist[ i ]( _currenttime ) -- fire timers
832 if t then next_timer_time = math_min(next_timer_time, t); end
828 end 833 end
829 _timer = _currenttime 834 _timer = _currenttime
835 else
836 next_timer_time = next_timer_time - (_currenttime - _timer);
830 end 837 end
831 socket_sleep( _sleeptime ) -- wait some time 838 socket_sleep( _sleeptime ) -- wait some time
832 --collectgarbage( ) 839 --collectgarbage( )
833 until quitting; 840 until quitting;
834 if once and quitting == "once" then quitting = nil; return; end 841 if once and quitting == "once" then quitting = nil; return; end
884 891
885 use "setmetatable" ( _socketlist, { __mode = "k" } ) 892 use "setmetatable" ( _socketlist, { __mode = "k" } )
886 use "setmetatable" ( _readtimes, { __mode = "k" } ) 893 use "setmetatable" ( _readtimes, { __mode = "k" } )
887 use "setmetatable" ( _writetimes, { __mode = "k" } ) 894 use "setmetatable" ( _writetimes, { __mode = "k" } )
888 895
889 _timer = os_time( ) 896 _timer = luasocket_gettime( )
890 _starttime = os_time( ) 897 _starttime = luasocket_gettime( )
891 898
892 addtimer( function( ) 899 addtimer( function( )
893 local difftime = os_difftime( _currenttime - _starttime ) 900 local difftime = os_difftime( _currenttime - _starttime )
894 if difftime > _checkinterval then 901 if difftime > _checkinterval then
895 _starttime = _currenttime 902 _starttime = _currenttime

mercurial