Software / code / prosody
Comparison
net/server_select.lua @ 6481:dbc72cd1332e
Move timer code out of util.timer and into relevant net.server backends
| author | daurnimator <quae@daurnimator.com> |
|---|---|
| date | Mon, 20 Oct 2014 16:13:24 -0400 |
| parent | 6465:ab68bb837fe0 |
| child | 6539:f923140ee7c5 |
comparison
equal
deleted
inserted
replaced
| 6480:37b12475f648 | 6481:dbc72cd1332e |
|---|---|
| 40 | 40 |
| 41 local os_difftime = os.difftime | 41 local os_difftime = os.difftime |
| 42 local math_min = math.min | 42 local math_min = math.min |
| 43 local math_huge = math.huge | 43 local math_huge = math.huge |
| 44 local table_concat = table.concat | 44 local table_concat = table.concat |
| 45 local table_insert = table.insert | |
| 45 local string_sub = string.sub | 46 local string_sub = string.sub |
| 46 local coroutine_wrap = coroutine.wrap | 47 local coroutine_wrap = coroutine.wrap |
| 47 local coroutine_yield = coroutine.yield | 48 local coroutine_yield = coroutine.yield |
| 48 | 49 |
| 49 --// extern libs //-- | 50 --// extern libs //-- |
| 830 _timerlistlen = _timerlistlen + 1 | 831 _timerlistlen = _timerlistlen + 1 |
| 831 _timerlist[ _timerlistlen ] = listener | 832 _timerlist[ _timerlistlen ] = listener |
| 832 return true | 833 return true |
| 833 end | 834 end |
| 834 | 835 |
| 836 local add_task do | |
| 837 local data = {}; | |
| 838 local new_data = {}; | |
| 839 | |
| 840 function add_task(delay, callback) | |
| 841 local current_time = luasocket_gettime(); | |
| 842 delay = delay + current_time; | |
| 843 if delay >= current_time then | |
| 844 table_insert(new_data, {delay, callback}); | |
| 845 else | |
| 846 local r = callback(current_time); | |
| 847 if r and type(r) == "number" then | |
| 848 return add_task(r, callback); | |
| 849 end | |
| 850 end | |
| 851 end | |
| 852 | |
| 853 addtimer(function() | |
| 854 local current_time = luasocket_gettime(); | |
| 855 if #new_data > 0 then | |
| 856 for _, d in pairs(new_data) do | |
| 857 table_insert(data, d); | |
| 858 end | |
| 859 new_data = {}; | |
| 860 end | |
| 861 | |
| 862 local next_time = math_huge; | |
| 863 for i, d in pairs(data) do | |
| 864 local t, callback = d[1], d[2]; | |
| 865 if t <= current_time then | |
| 866 data[i] = nil; | |
| 867 local r = callback(current_time); | |
| 868 if type(r) == "number" then | |
| 869 add_task(r, callback); | |
| 870 next_time = math_min(next_time, r); | |
| 871 end | |
| 872 else | |
| 873 next_time = math_min(next_time, t - current_time); | |
| 874 end | |
| 875 end | |
| 876 return next_time; | |
| 877 end); | |
| 878 end | |
| 879 | |
| 835 stats = function( ) | 880 stats = function( ) |
| 836 return _readtraffic, _sendtraffic, _readlistlen, _sendlistlen, _timerlistlen | 881 return _readtraffic, _sendtraffic, _readlistlen, _sendlistlen, _timerlistlen |
| 837 end | 882 end |
| 838 | 883 |
| 839 local quitting; | 884 local quitting; |
| 1005 | 1050 |
| 1006 ----------------------------------// PUBLIC INTERFACE //-- | 1051 ----------------------------------// PUBLIC INTERFACE //-- |
| 1007 | 1052 |
| 1008 return { | 1053 return { |
| 1009 _addtimer = addtimer, | 1054 _addtimer = addtimer, |
| 1055 add_task = add_task; | |
| 1010 | 1056 |
| 1011 addclient = addclient, | 1057 addclient = addclient, |
| 1012 wrapclient = wrapclient, | 1058 wrapclient = wrapclient, |
| 1013 | 1059 |
| 1014 loop = loop, | 1060 loop = loop, |