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]
for line in req_lines[1:]:
if line == "": break
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