summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAllan Saddi <allan@saddi.com>2009-05-04 13:33:39 -0700
committerAllan Saddi <allan@saddi.com>2009-05-04 13:33:39 -0700
commitd68f57f284490f4d497dd8df6c3aa6588f8ec7a4 (patch)
tree3a09b2fb9c5bf7bc68ec70028aff849976d89920
parentddc2a9ec8ad1e21be96caf9f84676371d404c224 (diff)
downloadflup-d68f57f284490f4d497dd8df6c3aa6588f8ec7a4.tar.gz
Be tolerant of EAGAIN when sending messages to parent process.
-rw-r--r--flup/server/preforkserver.py31
1 files changed, 18 insertions, 13 deletions
diff --git a/flup/server/preforkserver.py b/flup/server/preforkserver.py
index 128293b..5eded2c 100644
--- a/flup/server/preforkserver.py
+++ b/flup/server/preforkserver.py
@@ -309,6 +309,21 @@ class PreforkServer(object):
"""Override to provide access control."""
return True
+ def _notifyParent(self, parent, msg):
+ """Send message to parent, ignoring EPIPE and retrying on EAGAIN"""
+ while True:
+ try:
+ parent.send(msg)
+ return True
+ except socket.error, e:
+ if e[0] == errno.EPIPE:
+ return False # Parent is gone
+ if e[0] == errno.EAGAIN:
+ # Wait for socket change before sending again
+ select.select([], [parent], [])
+ else:
+ raise
+
def _child(self, sock, parent):
"""Main loop for children."""
requestCount = 0
@@ -353,12 +368,7 @@ class PreforkServer(object):
continue
# Notify parent we're no longer available.
- try:
- parent.send('\x00')
- except socket.error, e:
- # If parent is gone, finish up this request.
- if e[0] != errno.EPIPE:
- raise
+ self._notifyParent(parent, '\x00')
# Do the job.
self._jobClass(clientSock, addr, *self._jobArgs).run()
@@ -370,13 +380,8 @@ class PreforkServer(object):
break
# Tell parent we're free again.
- try:
- parent.send('\xff')
- except socket.error, e:
- if e[0] == errno.EPIPE:
- # Parent is gone.
- return
- raise
+ if not self._notifyParent(parent, '\xff'):
+ return # Parent is gone.
# Signal handlers