I noticed processEnded is called by threads. This generates a subtle race condition for most code (or at least for my code). The fact processEnded is called from threads isn't documented anywhere and so I prefer to be safe than sorry since I assume most code is written thinking processEnded will run in the usual serialized context and not in a parallel racy thread.
diff -r 493b5c24e0f3 twisted/internet/posixbase.py --- a/twisted/internet/posixbase.py Tue May 16 04:57:00 2006 +0000 +++ b/twisted/internet/posixbase.py Wed May 17 15:59:28 2006 +0200 @@ -189,7 +189,7 @@ class PosixReactorBase(ReactorBase): if platformType == 'posix': signal.signal(signal.SIGCHLD, self._handleSigchld)
- def _handleSigchld(self, signum, frame, _threadSupport=platform.supportsThreads()): + def _handleSigchld(self, signum, frame): """Reap all processes on SIGCHLD.
This gets called on SIGCHLD. We do no processing inside a signal @@ -198,10 +198,7 @@ class PosixReactorBase(ReactorBase): eventloop round prevents us from violating the state constraints of arbitrary classes. """ - if _threadSupport: - self.callFromThread(process.reapAllProcesses) - else: - self.callLater(0, process.reapAllProcesses) + self.callLater(0, process.reapAllProcesses)
def startRunning(self, installSignalHandlers=1): # Just in case we're started on a different thread than