Part of twisted.internet.process View Source View In Hierarchy
I am a helper which describes a selectable asynchronous writer to a process's input pipe, including stdin.
Instance Variable | enableReadHack | A flag which determines how readability on this write descriptor will be
handled. If True , then readability may indicate the reader
for this write descriptor has been closed (ie, the connection has been
lost). If False , then readability events are ignored. |
Method | __init__ | Initialize, specifying a Process instance to connect to. |
Method | fileno | Return the fileno() of my process's stdin. |
Method | writeSomeData | Write some data to the open process. |
Method | write | Reliably write some data. |
Method | doRead | The only way a write pipe can become "readable" is at EOF, because the child has closed it, and we're using a reactor which doesn't distinguish between readable and closed (such as the select reactor). |
Method | connectionLost | See abstract.FileDescriptor.connectionLost. |
Inherited from FileDescriptor:
Method | doWrite | Called when data can be written. |
Method | writeConnectionLost | Indicates write connection was lost. |
Method | readConnectionLost | Indicates read connection was lost. |
Method | writeSequence | Reliably write a sequence of data. |
Method | loseConnection | Close the connection at the next available opportunity. |
Method | loseWriteConnection | Undocumented |
Method | stopReading | Stop waiting for read availability. |
Method | stopWriting | Stop waiting for write availability. |
Method | startReading | Start waiting for read availability. |
Method | startWriting | Start waiting for write availability. |
Method | stopConsuming | Stop consuming data. |
Method | resumeProducing | Resume producing data. |
Method | pauseProducing | Pause producing data. |
Method | stopProducing | Undocumented |
Method | _postLoseConnection | Called after a loseConnection(), when all data has been written. |
Method | _closeWriteConnection | Undocumented |
Method | _isSendBufferFull | Determine whether the user-space send buffer for this transport is full or not. |
Method | _maybePauseProducer | Possibly pause a producer, if there is one and the send buffer is full. |
Inherited from _ConsumerMixin (via FileDescriptor):
Instance Variable | producer | None if no producer is registered, otherwise the registered
producer. |
Instance Variable | producerPaused | A flag indicating whether the producer is currently paused. (type: bool or int ) |
Instance Variable | streamingProducer 0 | A flag indicating whether the producer was registered as a streaming (ie
push) producer or not (ie a pull producer). This will determine whether
the consumer may ever need to pause and resume it, or if it can merely call
resumeProducing on it when buffer space is available. |
Instance Variable | streamingProducer | bool or int |
Method | registerProducer | Register to receive data from a producer. |
Method | unregisterProducer | Stop consuming data from a producer, without disconnecting. |
Inherited from _LogOwner (via FileDescriptor):
Method | logPrefix | Override this method to insert custom logging behavior. Its return value will be inserted in front of every line. It may be called more times than the number of output lines. |
Method | _getLogPrefix | Determine the log prefix to use for messages related to
applicationObject , which may or may not be an interfaces.ILoggingContext
provider. |
True
, then readability may indicate the reader
for this write descriptor has been closed (ie, the connection has been
lost). If False
, then readability events are ignored.
The data is buffered until the underlying file descriptor is ready for
writing. If there is more than self.bufferSize
data in the
buffer and this descriptor has a registered streaming producer, its
pauseProducing()
method will be called.
Except that's not true on linux < 2.6.11. It has the following characteristics: write pipe is completely empty => POLLOUT (writable in select), write pipe is not completely empty => POLLIN (readable in select), write pipe's reader closed => POLLIN|POLLERR (readable and writable in select)
That's what this funky code is for. If linux was not broken, this function could be simply "return CONNECTION_LOST".
BUG: We call select no matter what the reactor. If the reactor is pollreactor, and the fd is > 1024, this will fail. (only occurs on broken versions of linux, though).