# ``twisted`.`internet`.`cfreactor`.`CFReactor``

class documentation

`class CFReactor(PosixReactorBase): (source)`

Implements interfaces: `twisted.internet.interfaces.IReactorFDSet`

View In Hierarchy

The CoreFoundation reactor.

You probably want to use this via the `install` API.

Method | `__init__` | Undocumented
Method | `addReader` | Implement `IReactorFDSet.addReader`.
Method | `addWriter` | Implement `IReactorFDSet.addWriter`.
Method | `callLater` | Implement `IReactorTime.callLater`.
Method | `crash` | Implement `IReactorCore.crash`
Method | `getReaders` | Implement `IReactorFDSet.getReaders`.
Method | `getWriters` | Implement `IReactorFDSet.getWriters`.
Method | `installWaker` | Override `installWaker` in order to use `_WakerPlus`; otherwise this should be exactly the same as the parent implementation.
Method | `iterate` | Emulate the behavior of `iterate()` for things that want to call it, by letting the loop run for a little while and then scheduling a timed call to exit it.
Method | `mainLoop` | Run the runner (`CFRunLoopRun` or something that calls it), which runs the run loop until `crash()` is called.
Method | `removeAll` | Implement `IReactorFDSet.removeAll`.
Method | `removeReader` | Implement `IReactorFDSet.removeReader`.
Method | `removeWriter` | Implement `IReactorFDSet.removeWriter`.
Method | `stop` | Implement `IReactorCore.stop`.
Instance Variable | `waker` | Undocumented
Method | `_flag2idx` | Convert a `kCFSocket...` constant to an index into the read/write state list (`_READ` or `_WRITE`) (the 4th element of the value of `self._fdmap`).
Method | `_moveCallLaterSooner` | No summary
Method | `_scheduleSimulate` | Schedule a call to `self.runUntilCurrent`. This will cancel the currently scheduled call if it is already scheduled.
Method | `_socketCallback` | The socket callback issued by CFRunLoop. This will issue `doRead` or `doWrite` calls to the `IReadDescriptor` and `IWriteDescriptor` registered with the file descriptor that we are being notified of.
Method | `_stopNow` | Immediately stop the CFRunLoop (which must be running!).
Method | `_unwatchFD` | Unregister a file descriptor with the `CFRunLoop`, or modify its state so that it's listening for only one notification (read or write) as opposed to both; used to implement `removeReader` and `removeWriter`.
Method | `_watchFD` | Register a file descriptor with the `CFRunLoop`, or modify its state so that it's listening for both notifications (read and write) rather than just one; used to implement `addReader` and `addWriter`.
Instance Variable | `_cfrunloop` | the `CFRunLoop` pyobjc object wrapped by this reactor.
Instance Variable | `_currentSimulator` | if a CFTimer is currently scheduled with the CF run loop to run Twisted callLater calls, this is a reference to it. Otherwise, it is `None`
Instance Variable | `_fdmap` | a dictionary, mapping an integer (a file descriptor) to a 4-tuple of:

Instance Variable

`_idmap`

a dictionary, mapping the id() of an `IReadDescriptor` or `IWriteDescriptor` to a `fd` in `_fdmap`. Implemented in this manner so that we don't have to rely (even more) on the hashability of `IReadDescriptor` providers, and we know that they won't be collected since these are kept in sync with `_fdmap`. Necessary because the .fileno() of a file descriptor may change at will, so we need to be able to look up what its file descriptor used to be, so that we can look it up in `_fdmap`

Instance Variable | `_inCFLoop` | Is `CFRunLoopRun` currently running?
Instance Variable | `_runner` | Undocumented

Inherited from `PosixReactorBase`:

Method | `adoptDatagramPort` | Add an existing listening SOCK_DGRAM socket to the reactor to monitor for read and write readiness.
Method | `adoptStreamConnection` |
Method | `adoptStreamPort` | Create a new `IListeningPort` from an already-initialized socket.
Method | `connectSSL` | Connect a client Protocol to a remote SSL socket.
Method | `connectTCP` | Connect a TCP client.
Method | `connectUNIX` | Connect a client protocol to a UNIX socket.
Method | `connectUNIXDatagram` | Connects a `ConnectedDatagramProtocol` instance to a path.
Method | `listenMulticast` | Connects a given DatagramProtocol to the given numeric UDP port.
Method | `listenSSL` | Connects a given protocol factory to the given numeric TCP/IP port. The connection is a SSL one, using contexts created by the context factory.
Method | `listenTCP` | Connects a given protocol factory to the given numeric TCP/IP port.
Method | `listenUDP` | Connects a given `DatagramProtocol` to the given numeric UDP port.
Method | `listenUNIX` | Listen on a UNIX socket.
Method | `listenUNIXDatagram` | Connects a given `DatagramProtocol` to the given path.
Method | `spawnProcess` | Spawn a process, with a process protocol.
Method | `_handleSignals` | Extend the basic signal handling logic to also support handling SIGCHLD to know when to try to reap child processes.
Method | `_removeAll` | Remove all readers and writers, and list of removed `IReadDescriptor`s and `IWriteDescriptor`s.
Method | `_uninstallHandler` | If a child waker was created and installed, uninstall it now.
Class Variable | `_supportedAddressFamilies` | Undocumented
Instance Variable | `_childWaker` | `None` or a reference to the `_SIGCHLDWaker` which is used to properly notice child process termination.

Inherited from `_SignalReactorMixin` (via `PosixReactorBase`):

Method | `run` | Undocumented
Method | `startRunning` | Extend the base implementation in order to remember whether signal handlers should be installed later.
Method | `_reallyStartRunning` | Extend the base implementation by also installing signal handlers, if `self._installSignalHandlers` is true.
Instance Variable | `_installSignalHandlers` | A flag which indicates whether any signal handlers will be installed during startup. This includes handlers for SIGCHLD to monitor child processes, and SIGINT, SIGTERM, and SIGBREAK to stop the reactor.

Inherited from `_DisconnectSelectableMixin` (via `PosixReactorBase`):

Method | `_disconnectSelectable` | Utility function for disconnecting a selectable.

Inherited from `ReactorBase` (via `PosixReactorBase`):

Method | `addSystemEventTrigger` | See twisted.internet.interfaces.IReactorCore.addSystemEventTrigger.
Method | `callFromThread` | Cause a function to be executed by the reactor thread.
Method | `callInThread` | See `twisted.internet.interfaces.IReactorInThreads.callInThread`.
Method | `callWhenRunning` | See twisted.internet.interfaces.IReactorCore.callWhenRunning.
Method | `disconnectAll` | Disconnect every reader, and writer in the system.
Method | `doIteration` | Do one iteration over the readers and writers which have been added.
Method | `fireSystemEvent` | See twisted.internet.interfaces.IReactorCore.fireSystemEvent.
Method | `getDelayedCalls` | See `twisted.internet.interfaces.IReactorTime.getDelayedCalls`
Method | `getThreadPool` | See `twisted.internet.interfaces.IReactorThreads.getThreadPool`.
Method | `removeSystemEventTrigger` | See twisted.internet.interfaces.IReactorCore.removeSystemEventTrigger.
Method | `resolve` | Return a Deferred that will resolve a hostname.
Method | `run` | Fire 'startup' System Events, move the reactor to the 'running' state, then run the main loop until it is stopped with `stop()` or `crash()`.
Method | `runUntilCurrent` | Run all pending timed calls.
Method | `sigBreak` | Handle a SIGBREAK interrupt.
Method | `sigInt` | Handle a SIGINT interrupt.
Method | `sigTerm` | Handle a SIGTERM interrupt.
Method | `startRunning` | Method called when reactor starts: do some initialization and fire startup events.
Method | `suggestThreadPoolSize` | See `twisted.internet.interfaces.IReactorThreads.suggestThreadPoolSize`.
Method | `timeout` | Determine the longest time the reactor may sleep (waiting on I/O notification, perhaps) before it must wake up to service a time-related event.
Method | `wakeUp` | Wake up the event loop.
Class Variable | `__name__` | Undocumented
Class Variable | `installed` | Undocumented
Class Variable | `seconds` | Get the current time in seconds.
Instance Variable | `running` | See `IReactorCore.running`
Instance Variable | `threadCallQueue` | Undocumented
Instance Variable | `threadpool` | Undocumented
Instance Variable | `threadpoolShutdownID` | Undocumented
Instance Variable | `usingThreads` | Undocumented
Method | `_cancelCallLater` | Undocumented
Method | `_initThreadPool` | Create the threadpool accessible with callFromThread.
Method | `_initThreads` | Undocumented
Method | `_insertNewDelayedCalls` | Undocumented
Method | `_reallyStartRunning` | Method called to transition to the running state. This should happen in the during startup event trigger phase.
Method | `_stopThreadPool` | No summary
Class Variable | `_lock` | Undocumented
Instance Variable | `_cancellations` | Undocumented
Instance Variable | `_eventTriggers` | Undocumented
Instance Variable | `_exitSignal` | See `_ISupportsExitSignalCapturing._exitSignal`
Instance Variable | `_internalReaders` | Undocumented
Instance Variable | `_justStopped` | A flag which is true between the time `reactor.stop` is called and the time the shutdown system event is fired. This is used to determine whether that event should be fired after each iteration through the mainloop. This should be replaced with an explicit state machine.
Instance Variable | `_newTimedCalls` | Undocumented
Instance Variable | `_pendingTimedCalls` | Undocumented
Instance Variable | `_registerAsIOThread` | A flag controlling whether the reactor will register the thread it is running in as the I/O thread when it starts. If `True`, registration will be done, otherwise it will not be.
Instance Variable | `_started` | A flag which is true from the time `reactor.run` is called until the time `reactor.run` returns. This is used to prevent calls to `reactor.run` on a running reactor. This should be replaced with an explicit state machine.
Instance Variable | `_startedBefore` | Undocumented
Instance Variable | `_stopped` | A flag which is true between paired calls to `reactor.run` and `reactor.stop`. This should be replaced with an explicit state machine.
Instance Variable | `_threadpoolStartupID` | Undocumented

Inherited from `PluggableResolverMixin` (via `PosixReactorBase`, `ReactorBase`):

Method | `installNameResolver` | See `IReactorPluggableNameResolver`.
Method | `installResolver` | See `IReactorPluggableResolver`.
Instance Variable | `resolver` | The installed `IResolverSimple`.
Property | `nameResolver` | Implementation of read-only `IReactorPluggableNameResolver.nameResolver`.
Instance Variable | `_nameResolver` | The installed `IHostnameResolver`.

def __init__(self, runLoop=None, runner=None): (source)
overrides `twisted.internet.base.ReactorBase.__init__`

Undocumented

def addReader(self, reader): (source)
from `twisted.internet.interfaces.IReactorFDSet`
overrides `twisted.internet.base.ReactorBase.addReader`
Implement `IReactorFDSet.addReader`.
def addWriter(self, writer): (source)
from `twisted.internet.interfaces.IReactorFDSet`
overrides `twisted.internet.base.ReactorBase.addWriter`
Implement `IReactorFDSet.addWriter`.
def callLater(self, _seconds, _f, *args, **kw): (source)
from `twisted.internet.interfaces.IReactorTime`
overrides `twisted.internet.base.ReactorBase.callLater`
Implement `IReactorTime.callLater`.
def crash(self): (source)
from `twisted.internet.interfaces.IReactorCore`
overrides `twisted.internet.base.ReactorBase.crash`
Implement `IReactorCore.crash`
def getReaders(self): (source)
from `twisted.internet.interfaces.IReactorFDSet`
overrides `twisted.internet.base.ReactorBase.getReaders`
Implement `IReactorFDSet.getReaders`.
def getWriters(self): (source)
from `twisted.internet.interfaces.IReactorFDSet`
overrides `twisted.internet.base.ReactorBase.getWriters`
Implement `IReactorFDSet.getWriters`.
def installWaker(self): (source)
overrides `twisted.internet.posixbase.PosixReactorBase.installWaker`
Override `installWaker` in order to use `_WakerPlus`; otherwise this should be exactly the same as the parent implementation.
def iterate(self, delay=0): (source)
from `twisted.internet.interfaces.IReactorCore`
overrides `twisted.internet.base.ReactorBase.iterate`
Emulate the behavior of `iterate()` for things that want to call it, by letting the loop run for a little while and then scheduling a timed call to exit it.
def mainLoop(self): (source)
overrides `twisted.internet.base._SignalReactorMixin.mainLoop`
Run the runner (`CFRunLoopRun` or something that calls it), which runs the run loop until `crash()` is called.
def removeAll(self): (source)
from `twisted.internet.interfaces.IReactorFDSet`
overrides `twisted.internet.base.ReactorBase.removeAll`
Implement `IReactorFDSet.removeAll`.
def removeReader(self, reader): (source)
from `twisted.internet.interfaces.IReactorFDSet`
overrides `twisted.internet.base.ReactorBase.removeReader`
Implement `IReactorFDSet.removeReader`.
def removeWriter(self, writer): (source)
from `twisted.internet.interfaces.IReactorFDSet`
overrides `twisted.internet.base.ReactorBase.removeWriter`
Implement `IReactorFDSet.removeWriter`.
def stop(self): (source)
from `twisted.internet.interfaces.IReactorCore`
overrides `twisted.internet.base.ReactorBase.stop`
Implement `IReactorCore.stop`.
waker = (source)
overrides `twisted.internet.posixbase.PosixReactorBase.waker`

Undocumented

def _flag2idx(self, flag): (source)
Convert a `kCFSocket...` constant to an index into the read/write state list (`_READ` or `_WRITE`) (the 4th element of the value of `self._fdmap`).

Parameters
flag | `kCFSocketReadCallBack` or `kCFSocketWriteCallBack`
Returns
`_READ` or `_WRITE`

def _moveCallLaterSooner(self, tple): (source)
overrides `twisted.internet.base.ReactorBase._moveCallLaterSooner`
Override `PosixReactorBase`'s implementation of `IDelayedCall.reset` so that it will immediately reschedule. Normally `_moveCallLaterSooner` depends on the fact that `runUntilCurrent` is always run before the mainloop goes back to sleep, so this forces it to immediately recompute how long the loop needs to stay asleep.
def _scheduleSimulate(self, force=False): (source)
Schedule a call to `self.runUntilCurrent`. This will cancel the currently scheduled call if it is already scheduled.

Parameters
force:`bool` | Even if there are no timed calls, make sure that `runUntilCurrent` runs immediately (in a 0-seconds-from-now `CFRunLoopTimer`). This is necessary for calls which need to trigger behavior of `runUntilCurrent` other than running timed calls, such as draining the thread call queue or calling `crash()` when the appropriate flags are set.

def _socketCallback(self, cfSocket, callbackType, ignoredAddress, ignoredData, context): (source)
The socket callback issued by CFRunLoop. This will issue `doRead` or `doWrite` calls to the `IReadDescriptor` and `IWriteDescriptor` registered with the file descriptor that we are being notified of.

Parameters
cfSocket | The `CFSocket` which has got some activity.
callbackType | The type of activity that we are being notified of. Either `kCFSocketReadCallBack` or `kCFSocketWriteCallBack`.
ignoredAddress | Unused, because this is not used for either of the callback types we register for.
ignoredData | Unused, because this is not used for either of the callback types we register for.
context | The data associated with this callback by `CFSocketCreateWithNative` (in `CFReactor._watchFD`). A 2-tuple of `(int, CFRunLoopSource)`.

def _stopNow(self): (source)
Immediately stop the CFRunLoop (which must be running!).
def _unwatchFD(self, fd, descr, flag): (source)
Unregister a file descriptor with the `CFRunLoop`, or modify its state so that it's listening for only one notification (read or write) as opposed to both; used to implement `removeReader` and `removeWriter`.

Parameters
fd:`int` | a file descriptor
descr | an `IReadDescriptor` or `IWriteDescriptor`
flag | `kCFSocketWriteCallBack` `kCFSocketReadCallBack`

def _watchFD(self, fd, descr, flag): (source)
Register a file descriptor with the `CFRunLoop`, or modify its state so that it's listening for both notifications (read and write) rather than just one; used to implement `addReader` and `addWriter`.

Parameters
fd:`int` | The file descriptor.
descr | the `IReadDescriptor` or `IWriteDescriptor`
flag | the flag to register for callbacks on, either `kCFSocketReadCallBack` or `kCFSocketWriteCallBack`

_cfrunloop = (source)
the `CFRunLoop` pyobjc object wrapped by this reactor.
_currentSimulator = (source)
if a CFTimer is currently scheduled with the CF run loop to run Twisted callLater calls, this is a reference to it. Otherwise, it is `None`
_fdmap: `dict` = (source)

a dictionary, mapping an integer (a file descriptor) to a 4-tuple of:

- source: a `CFRunLoopSource`; the source associated with this socket.
- socket: a `CFSocket` wrapping the file descriptor.
- descriptor: an `IReadDescriptor` and/or `IWriteDescriptor` provider.
- read-write: a 2-`list` of booleans: respectively, whether this descriptor is currently registered for reading or registered for writing.

_idmap: `dict` = (source)
a dictionary, mapping the id() of an `IReadDescriptor` or `IWriteDescriptor` to a `fd` in `_fdmap`. Implemented in this manner so that we don't have to rely (even more) on the hashability of `IReadDescriptor` providers, and we know that they won't be collected since these are kept in sync with `_fdmap`. Necessary because the .fileno() of a file descriptor may change at will, so we need to be able to look up what its file descriptor used to be, so that we can look it up in `_fdmap`
_inCFLoop: `bool` = (source)
Is `CFRunLoopRun` currently running?
_runner = (source)

Undocumented