[Twisted-Python] [patch] 1/4 process disconneting
Andrea Arcangeli
andrea at cpushare.com
Wed May 17 10:28:07 EDT 2006
Here a list of fixes present in CPUShare-Twisted mercurial tree and
missing in Twisted SVN trunk. Most of these have been posted as a ticket
in trac without feedback (by now the links in the tickets are obsolete
due to bugs in tailor that required a rebuild of the SVN->HG repository,
but nobody asked about the dangling link anyway). So I rensend them here
just in case somebody is interested. I will not answer to replies
because I've no time, sorry. Each email contains one patch.
This fixes a reentrance problem in connectionLost if invoked by shutdown
at the same time as the real disconnect.
diff -r 493b5c24e0f3 twisted/internet/process.py
--- a/twisted/internet/process.py Tue May 16 04:57:00 2006 +0000
+++ b/twisted/internet/process.py Wed May 17 15:59:28 2006 +0200
@@ -82,7 +82,24 @@ def detectLinuxBrokenPipeBehavior():
# Call at import time
detectLinuxBrokenPipeBehavior()
-class ProcessWriter(abstract.FileDescriptor):
+class ProcessReaderWriter(abstract.FileDescriptor):
+ """(Internal) Helper class to avoid code duplication between
+ ProcessReader and ProcessWriter."""
+ def connectionLost(self, reason):
+ """Close my end of the pipe, signal the Process (which signals the
+ ProcessProtocol).
+ See also abstract.FileDescriptor.connectionLost.
+ """
+ # connectionLost can be called multiple times, for example
+ # both from the loseConnection timer, and from the
+ # shutdown event as well, but childConnectionLost
+ # needs to be invoked only once
+ disconnected = self.disconnected
+ abstract.FileDescriptor.connectionLost(self, reason)
+ if not disconnected:
+ self.proc.childConnectionLost(self.name, reason)
+
+class ProcessWriter(ProcessReaderWriter):
"""(Internal) Helper class to write into a Process's input pipe.
I am a helper which describes a selectable asynchronous writer to a
@@ -174,14 +191,8 @@ class ProcessWriter(abstract.FileDescrip
else:
self.stopReading()
- def connectionLost(self, reason):
- """See abstract.FileDescriptor.connectionLost.
- """
- abstract.FileDescriptor.connectionLost(self, reason)
- self.proc.childConnectionLost(self.name, reason)
-
-
-class ProcessReader(abstract.FileDescriptor):
+
+class ProcessReader(ProcessReaderWriter):
"""ProcessReader
I am a selectable representation of a process's output pipe, such as
@@ -224,13 +235,6 @@ class ProcessReader(abstract.FileDescrip
self.disconnecting = 1
self.stopReading()
self.reactor.callLater(0, self.connectionLost, failure.Failure(CONNECTION_DONE))
-
- def connectionLost(self, reason):
- """Close my end of the pipe, signal the Process (which signals the
- ProcessProtocol).
- """
- abstract.FileDescriptor.connectionLost(self, reason)
- self.proc.childConnectionLost(self.name, reason)
class Process(styles.Ephemeral):
More information about the Twisted-Python
mailing list