From 3a3b78e3147cab8cdbc4bb2d577013734b73a8af Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Sun, 5 Jan 2014 11:57:53 +0100 Subject: [PATCH] python: Added an abort timeout for the freethread handler. --- python3/ashd/serve.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/python3/ashd/serve.py b/python3/ashd/serve.py index 6111ec6..74ccd92 100644 --- a/python3/ashd/serve.py +++ b/python3/ashd/serve.py @@ -86,24 +86,36 @@ class handler(object): return {} class freethread(handler): - def __init__(self, *, max=None, **kw): + def __init__(self, *, max=None, timeout=None, **kw): super().__init__(**kw) self.current = set() self.lk = threading.Lock() self.tcond = threading.Condition(self.lk) self.max = max + self.timeout = timeout @classmethod - def parseargs(cls, *, max=None, **args): + def parseargs(cls, *, max=None, abort=None, **args): ret = super().parseargs(**args) if max: ret["max"] = int(max) + if abort: + ret["timeout"] = int(abort) return ret def handle(self, req): with self.lk: - while self.max is not None and len(self.current) >= self.max: - self.tcond.wait() + if self.max is not None: + if self.timeout is not None: + now = start = time.time() + while len(self.current) >= self.max: + self.tcond.wait(start + self.timeout - now) + now = time.time() + if now - start > self.timeout: + os.abort() + else: + while len(self.current) >= self.max: + self.tcond.wait() th = reqthread(target=self.run, args=[req]) th.start() while th.is_alive() and th not in self.current: -- 2.11.0