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.
This commit is contained in:
Joel Martin 2011-02-01 10:47:45 -06:00
parent ec2b614037
commit 215ae8e564
1 changed files with 11 additions and 3 deletions

View File

@ -147,7 +147,10 @@ Connection: Upgrade\r
ret['path'] = req_lines[0].split(" ")[1] ret['path'] = req_lines[0].split(" ")[1]
for line in req_lines[1:]: for line in req_lines[1:]:
if line == "": break if line == "": break
var, val = line.split(": ") try:
var, val = line.split(": ")
except:
raise Exception("Invalid handshake header: %s" % line)
ret[var] = val ret[var] = val
if req_lines[-2] == "": if req_lines[-2] == "":
@ -315,12 +318,17 @@ Connection: Upgrade\r
#self.vmsg("Running poll()") #self.vmsg("Running poll()")
pass pass
def top_SIGCHLD(self, sig, stack): def top_SIGCHLD(self, sig, stack):
# Reap zombies after calling child SIGCHLD handler # Reap zombies after calling child SIGCHLD handler
self.do_SIGCHLD(sig, stack) self.do_SIGCHLD(sig, stack)
self.vmsg("Got SIGCHLD, reaping zombies") 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): def do_SIGCHLD(self, sig, stack):
pass pass