From: Steven Barth Date: Wed, 25 Jun 2008 16:48:48 +0000 (+0000) Subject: * libs/httpd: Automatically remove timed out threads X-Git-Tag: 0.8.0~774 X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fluci.git;a=commitdiff_plain;h=215e225fe9965be0852f4f4f2f72dca1d0c608f0;ds=inline * libs/httpd: Automatically remove timed out threads --- diff --git a/libs/httpd/luasrc/httpd.lua b/libs/httpd/luasrc/httpd.lua index a9b1ccbb4..9eaa9a68d 100644 --- a/libs/httpd/luasrc/httpd.lua +++ b/libs/httpd/luasrc/httpd.lua @@ -36,8 +36,8 @@ function Thread.__init__(self, socket, func) self.waiting = false end -function Thread.getidletime(self) - return os.difftime(os.time(), self.stamp) +function Thread.touched(self) + return self.stamp end function Thread.iswaiting(self) @@ -71,7 +71,7 @@ end Daemon = luci.util.class() -function Daemon.__init__(self, threadlimit, timeout) +function Daemon.__init__(self, threadlimit, waittime, timeout) self.reading = {} self.threads = {} self.handler = {} @@ -82,7 +82,8 @@ function Daemon.__init__(self, threadlimit, timeout) self.debug = false self.threadlimit = threadlimit - self.timeout = timeout or 0.1 + self.waittime = waittime or 0.1 + self.timeout = timeout or 90 end function Daemon.dprint(self, msg) @@ -144,6 +145,7 @@ function Daemon.step(self) -- create client handler for sock, thread in pairs( self.threads ) do + local now = os.time() -- reap dead clients if thread:status() == "dead" then @@ -153,6 +155,10 @@ function Daemon.step(self) sock:close() self.threadc = self.threadc - 1 self.threads[sock] = nil + + elseif os.difftime(now, thread:touched()) > self.timeout then + self.threads[sock] = nil + sock:close() -- resume working threads elseif not thread:iswaiting() then if self.debug then @@ -199,6 +205,6 @@ function Daemon.step(self) end if err == "timeout" and not working then - socket.sleep(self.timeout) + socket.sleep(self.waittime) end end