| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- # Two reactors spinning at once.
- # IOCP reactor for most things
- # selectreactor for SSL
- #
- # The contents of this file are subject to the Python Software Foundation
- # License Version 2.3 (the License). You may not copy or use this file, in
- # either source code or executable form, except in compliance with the License.
- # You may obtain a copy of the License at http://www.python.org/license.
- #
- # Software distributed under the License is distributed on an AS IS basis,
- # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- # for the specific language governing rights and limitations under the
- # License.
- #
- # by Greg Hazel
- from twisted.internet import iocpreactor
- iocpreactor.proactor.install()
- from twisted.internet.selectreactor import SelectReactor
- selectreactor = SelectReactor()
- from twisted.internet import reactor
- selectreactor.spin_task = 0
- def selectrun():
- selectreactor.iterate(0)
- if selectreactor.spin_task > 0:
- reactor.callLater(0.01, selectrun)
-
- class HookedFactory(object):
- def __init__(self, factory):
- self.factory = factory
- def startedConnecting(self, connector):
- if selectreactor.spin_task == 0:
- reactor.callLater(0.01, selectrun)
- selectreactor.spin_task += 1
- return self.factory.startedConnecting(connector)
-
- def clientConnectionFailed(self, connector, reason):
- selectreactor.spin_task -= 1
- return self.factory.clientConnectionFailed(connector, reason)
- def clientConnectionLost(self, connector, reason):
- selectreactor.spin_task -= 1
- return self.factory.clientConnectionLost(connector, reason)
- def __getattr__(self, attr):
- return getattr(self.factory, attr)
- def spin_ssl(host, port, factory, contextFactory, timeout=30, bindAddress=None):
- factory = HookedFactory(factory)
- connector = selectreactor.connectSSL(host, port, factory, contextFactory,
- timeout, bindAddress)
- return connector
-
- reactor.connectSSL = spin_ssl
|