From 215ae8e5647dd3e3d7fc4b4273d2f3b6f8e69cde Mon Sep 17 00:00:00 2001 From: Joel Martin Date: Tue, 1 Feb 2011 10:47:45 -0600 Subject: [PATCH] Better reaper, catch occasional bad WS header line. Call waitpid in loop to catch SIGCHLD signals that happen while handling the original SIGCHLD signal. Pulled from websockify. --- utils/websocket.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/utils/websocket.py b/utils/websocket.py index cfda8706..8fb9e68f 100755 --- a/utils/websocket.py +++ b/utils/websocket.py @@ -147,7 +147,10 @@ Connection: Upgrade\r ret['path'] = req_lines[0].split(" ")[1] for line in req_lines[1:]: if line == "": break - var, val = line.split(": ") + try: + var, val = line.split(": ") + except: + raise Exception("Invalid handshake header: %s" % line) ret[var] = val if req_lines[-2] == "": @@ -315,12 +318,17 @@ Connection: Upgrade\r #self.vmsg("Running poll()") pass - def top_SIGCHLD(self, sig, stack): # Reap zombies after calling child SIGCHLD handler self.do_SIGCHLD(sig, stack) self.vmsg("Got SIGCHLD, reaping zombies") - os.waitpid(-1, os.WNOHANG) + try: + result = os.waitpid(-1, os.WNOHANG) + while result[0]: + self.vmsg("Reaped child process %s" % result[0]) + result = os.waitpid(-1, os.WNOHANG) + except (OSError): + pass def do_SIGCHLD(self, sig, stack): pass