Mercurial > prosody-hg
comparison net/server_select.lua @ 6539:f923140ee7c5
net.server_select: Fix timers not being fired until another timer fixes (or 1 second passes)
| author | daurnimator <quae@daurnimator.com> |
|---|---|
| date | Thu, 15 Jan 2015 09:03:00 -0500 |
| parents | dbc72cd1332e |
| children | 31a8b3bfb31d |
comparison
equal
deleted
inserted
replaced
| 6538:f1eb66288f60 | 6539:f923140ee7c5 |
|---|---|
| 112 local _maxreadlen | 112 local _maxreadlen |
| 113 | 113 |
| 114 local _checkinterval | 114 local _checkinterval |
| 115 local _sendtimeout | 115 local _sendtimeout |
| 116 local _readtimeout | 116 local _readtimeout |
| 117 | |
| 118 local _timer | |
| 119 | 117 |
| 120 local _maxselectlen | 118 local _maxselectlen |
| 121 local _maxfd | 119 local _maxfd |
| 122 | 120 |
| 123 local _maxsslhandshake | 121 local _maxsslhandshake |
| 888 end | 886 end |
| 889 | 887 |
| 890 loop = function(once) -- this is the main loop of the program | 888 loop = function(once) -- this is the main loop of the program |
| 891 if quitting then return "quitting"; end | 889 if quitting then return "quitting"; end |
| 892 if once then quitting = "once"; end | 890 if once then quitting = "once"; end |
| 893 local next_timer_time = math_huge; | 891 _currenttime = luasocket_gettime( ) |
| 894 repeat | 892 repeat |
| 893 -- Fire timers | |
| 894 local next_timer_time = math_huge; | |
| 895 for i = 1, _timerlistlen do | |
| 896 local t = _timerlist[ i ]( _currenttime ) -- fire timers | |
| 897 if t then next_timer_time = math_min(next_timer_time, t); end | |
| 898 end | |
| 899 | |
| 895 local read, write, err = socket_select( _readlist, _sendlist, math_min(_selecttimeout, next_timer_time) ) | 900 local read, write, err = socket_select( _readlist, _sendlist, math_min(_selecttimeout, next_timer_time) ) |
| 896 for i, socket in ipairs( write ) do -- send data waiting in writequeues | 901 for i, socket in ipairs( write ) do -- send data waiting in writequeues |
| 897 local handler = _socketlist[ socket ] | 902 local handler = _socketlist[ socket ] |
| 898 if handler then | 903 if handler then |
| 899 handler.sendbuffer( ) | 904 handler.sendbuffer( ) |
| 936 else | 941 else |
| 937 _readtimes[ handler ] = _currenttime -- reset timer | 942 _readtimes[ handler ] = _currenttime -- reset timer |
| 938 end | 943 end |
| 939 end | 944 end |
| 940 end | 945 end |
| 941 end | |
| 942 | |
| 943 -- Fire timers | |
| 944 if _currenttime - _timer >= math_min(next_timer_time, 1) then | |
| 945 next_timer_time = math_huge; | |
| 946 for i = 1, _timerlistlen do | |
| 947 local t = _timerlist[ i ]( _currenttime ) -- fire timers | |
| 948 if t then next_timer_time = math_min(next_timer_time, t); end | |
| 949 end | |
| 950 _timer = _currenttime | |
| 951 else | |
| 952 next_timer_time = next_timer_time - (_currenttime - _timer); | |
| 953 end | 946 end |
| 954 | 947 |
| 955 -- wait some time (0 by default) | 948 -- wait some time (0 by default) |
| 956 socket_sleep( _sleeptime ) | 949 socket_sleep( _sleeptime ) |
| 957 until quitting; | 950 until quitting; |
| 1035 | 1028 |
| 1036 use "setmetatable" ( _socketlist, { __mode = "k" } ) | 1029 use "setmetatable" ( _socketlist, { __mode = "k" } ) |
| 1037 use "setmetatable" ( _readtimes, { __mode = "k" } ) | 1030 use "setmetatable" ( _readtimes, { __mode = "k" } ) |
| 1038 use "setmetatable" ( _writetimes, { __mode = "k" } ) | 1031 use "setmetatable" ( _writetimes, { __mode = "k" } ) |
| 1039 | 1032 |
| 1040 _timer = luasocket_gettime( ) | |
| 1041 _starttime = luasocket_gettime( ) | 1033 _starttime = luasocket_gettime( ) |
| 1042 | 1034 |
| 1043 local function setlogger(new_logger) | 1035 local function setlogger(new_logger) |
| 1044 local old_logger = log; | 1036 local old_logger = log; |
| 1045 if new_logger then | 1037 if new_logger then |
