diff options
author | Steven Barth <steven@midlink.org> | 2009-07-10 13:04:07 +0000 |
---|---|---|
committer | Steven Barth <steven@midlink.org> | 2009-07-10 13:04:07 +0000 |
commit | 7372c00dda800ee887ec63a6c3e0c3838da7897d (patch) | |
tree | aefa327c3f94ec2db61b0b0c079e42a81ec559a2 /libs | |
parent | 2dcd2eb9b2e3f2e437850f0645ffe9baf72efbdc (diff) |
Fix LuCId behaviour if thread-limit is reached
Diffstat (limited to 'libs')
-rw-r--r-- | libs/lucid/luasrc/lucid.lua | 35 | ||||
-rw-r--r-- | libs/lucid/luasrc/lucid/tcpserver.lua | 3 |
2 files changed, 26 insertions, 12 deletions
diff --git a/libs/lucid/luasrc/lucid.lua b/libs/lucid/luasrc/lucid.lua index 4963ccc304..96611d2441 100644 --- a/libs/lucid/luasrc/lucid.lua +++ b/libs/lucid/luasrc/lucid.lua @@ -110,22 +110,25 @@ end -- This main function of LuCId will wait for events on given file descriptors. function run() local pollint = tonumber((cursor:get(UCINAME, "main", "pollinterval"))) - local threadlimit = tonumber(cursor:get(UCINAME, "main", "threadlimit")) + local threadlimit = tonumber((cursor:get(UCINAME, "main", "threadlimit"))) while true do - if not threadlimit or tcount < threadlimit then - local stat, code = nixio.poll(pollt, pollint) + local stat, code = nixio.poll(pollt, pollint) - if stat and stat > 0 then - for _, polle in ipairs(pollt) do - if polle.revents ~= 0 and polle.handler then - polle.handler(polle) - end + if stat and stat > 0 then + local ok = false + for _, polle in ipairs(pollt) do + if polle.revents ~= 0 and polle.handler then + ok = ok or polle.handler(polle) end - elseif stat == 0 then - ifaddrs = nixio.getifaddrs() - collectgarbage("collect") end + if not ok then + -- Avoid high CPU usage if thread limit is reached + nixio.nanosleep(0, 100000000) + end + elseif stat == 0 then + ifaddrs = nixio.getifaddrs() + collectgarbage("collect") end for _, cb in ipairs(tickt) do @@ -200,6 +203,14 @@ function unregister_tick(cb) return false end +--- Tests whether a given number of processes can be created. +-- @oaram num Processes to be created +-- @return boolean status +function try_process(num) + local threadlimit = tonumber((cursor:get(UCINAME, "main", "threadlimit"))) + return not threadlimit or (threadlimit - tcount) >= (num or 1) +end + --- Create a new child process from a Lua function and assign a destructor. -- @param threadcb main function of the new process -- @param waitcb destructor callback @@ -320,4 +331,4 @@ function daemonize() nixio.dup(devnull, nixio.stderr) return true -end +end
\ No newline at end of file diff --git a/libs/lucid/luasrc/lucid/tcpserver.lua b/libs/lucid/luasrc/lucid/tcpserver.lua index 2897ec8eaa..47748e4a3e 100644 --- a/libs/lucid/luasrc/lucid/tcpserver.lua +++ b/libs/lucid/luasrc/lucid/tcpserver.lua @@ -111,6 +111,9 @@ end -- @param polle Poll descriptor -- @return handler process id or nil, error code, error message function accept(polle) + if not lucid.try_process() then + return false + end local socket, host, port = polle.fd:accept() if not socket then return nixio.syslog("warn", "accept() failed: " .. port) |