aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWaqas Hussain <waqas20@gmail.com>2010-12-02 22:40:42 +0500
committerWaqas Hussain <waqas20@gmail.com>2010-12-02 22:40:42 +0500
commit4495fa21ccd41ee1fc21dc41aeb48f9b00be58e7 (patch)
tree393f368ba0671f45863cbc2cfed5665e2fec7c85
parentf3682db37b969e04e0f5430cbac2e7c6b9c0379d (diff)
downloadprosody-4495fa21ccd41ee1fc21dc41aeb48f9b00be58e7.tar.gz
prosody-4495fa21ccd41ee1fc21dc41aeb48f9b00be58e7.zip
net.server_select: Make changes required for sub-second timer precision.
-rw-r--r--net/server_select.lua21
1 files changed, 14 insertions, 7 deletions
diff --git a/net/server_select.lua b/net/server_select.lua
index 186ce227..a7081f81 100644
--- a/net/server_select.lua
+++ b/net/server_select.lua
@@ -44,8 +44,9 @@ local coroutine = use "coroutine"
--// lua lib methods //--
-local os_time = os.time
local os_difftime = os.difftime
+local math_min = math.min
+local math_huge = math.huge
local table_concat = table.concat
local table_remove = table.remove
local string_len = string.len
@@ -57,6 +58,7 @@ local coroutine_yield = coroutine.yield
local luasec = use "ssl"
local luasocket = use "socket" or require "socket"
+local luasocket_gettime = luasocket.gettime
--// extern lib methods //--
@@ -796,8 +798,9 @@ end
loop = function(once) -- this is the main loop of the program
if quitting then return "quitting"; end
if once then quitting = "once"; end
+ local next_timer_time = math_huge;
repeat
- local read, write, err = socket_select( _readlist, _sendlist, _selecttimeout )
+ local read, write, err = socket_select( _readlist, _sendlist, math_min(_selecttimeout, next_timer_time) )
for i, socket in ipairs( write ) do -- send data waiting in writequeues
local handler = _socketlist[ socket ]
if handler then
@@ -821,12 +824,16 @@ loop = function(once) -- this is the main loop of the program
handler:close( true ) -- forced disconnect
end
clean( _closelist )
- _currenttime = os_time( )
- if os_difftime( _currenttime - _timer ) >= 1 then
+ _currenttime = luasocket_gettime( )
+ if _currenttime - _timer >= math_min(next_timer_time, 1) then
+ next_timer_time = math_huge;
for i = 1, _timerlistlen do
- _timerlist[ i ]( _currenttime ) -- fire timers
+ local t = _timerlist[ i ]( _currenttime ) -- fire timers
+ if t then next_timer_time = math_min(next_timer_time, t); end
end
_timer = _currenttime
+ else
+ next_timer_time = next_timer_time - (_currenttime - _timer);
end
socket_sleep( _sleeptime ) -- wait some time
--collectgarbage( )
@@ -886,8 +893,8 @@ use "setmetatable" ( _socketlist, { __mode = "k" } )
use "setmetatable" ( _readtimes, { __mode = "k" } )
use "setmetatable" ( _writetimes, { __mode = "k" } )
-_timer = os_time( )
-_starttime = os_time( )
+_timer = luasocket_gettime( )
+_starttime = luasocket_gettime( )
addtimer( function( )
local difftime = os_difftime( _currenttime - _starttime )