Merging with the latest eventlet tip
This commit is contained in:
@@ -19,10 +19,3 @@ EVENTLET_THREADPOOL_SIZE
|
||||
The size of the threadpool in :mod:`~eventlet.tpool`. This is an
|
||||
environment variable because tpool constructs its pool on first
|
||||
use, so any control of the pool size needs to happen before then.
|
||||
|
||||
EVENTLET_TPOOL_DNS
|
||||
|
||||
If set to 'yes', uses :func:`eventlet.tpool.execute` to call
|
||||
:func:`~socket.gethostbyname` and :func:`~socket.getaddrinfo`,
|
||||
making them appear non-blocking. This environment variable is
|
||||
ignored on OS X.
|
||||
|
@@ -18,46 +18,9 @@ if os.environ.get("EVENTLET_NO_GREENDNS",'').lower() != "yes":
|
||||
except ImportError, ex:
|
||||
pass
|
||||
|
||||
__original_gethostbyname__ = __socket.gethostbyname
|
||||
# the thread primitives on Darwin have some bugs that make
|
||||
# it undesirable to use tpool for hostname lookups
|
||||
_can_use_tpool = (
|
||||
os.environ.get("EVENTLET_TPOOL_DNS",'').lower() == "yes"
|
||||
and not sys.platform.startswith('darwin'))
|
||||
def _gethostbyname_twisted(name):
|
||||
from twisted.internet import reactor
|
||||
from eventlet.twistedutil import block_on as _block_on
|
||||
return _block_on(reactor.resolve(name))
|
||||
|
||||
def _gethostbyname_tpool(name):
|
||||
from eventlet import tpool
|
||||
return tpool.execute(
|
||||
__original_gethostbyname__, name)
|
||||
|
||||
if getattr(get_hub(), 'uses_twisted_reactor', None):
|
||||
gethostbyname = _gethostbyname_twisted
|
||||
elif greendns:
|
||||
if greendns:
|
||||
gethostbyname = greendns.gethostbyname
|
||||
elif _can_use_tpool:
|
||||
gethostbyname = _gethostbyname_tpool
|
||||
else:
|
||||
gethostbyname = __original_gethostbyname__
|
||||
|
||||
|
||||
__original_getaddrinfo__ = __socket.getaddrinfo
|
||||
def _getaddrinfo_tpool(*args, **kw):
|
||||
from eventlet import tpool
|
||||
return tpool.execute(
|
||||
__original_getaddrinfo__, *args, **kw)
|
||||
|
||||
if greendns:
|
||||
getaddrinfo = greendns.getaddrinfo
|
||||
elif _can_use_tpool:
|
||||
getaddrinfo = _getaddrinfo_tpool
|
||||
else:
|
||||
getaddrinfo = __original_getaddrinfo__
|
||||
|
||||
if greendns:
|
||||
gethostbyname_ex = greendns.gethostbyname_ex
|
||||
getnameinfo = greendns.getnameinfo
|
||||
__patched__ = __patched__ + ['gethostbyname_ex', 'getnameinfo']
|
||||
|
51
tests/fork_test.py
Normal file
51
tests/fork_test.py
Normal file
@@ -0,0 +1,51 @@
|
||||
from tests.patcher_test import ProcessBase
|
||||
|
||||
|
||||
class ForkTest(ProcessBase):
|
||||
def test_simple(self):
|
||||
newmod = '''
|
||||
import eventlet
|
||||
import os
|
||||
import sys
|
||||
import signal
|
||||
mydir = %r
|
||||
signal_file = os.path.join(mydir, "output.txt")
|
||||
pid = os.fork()
|
||||
if (pid != 0):
|
||||
eventlet.Timeout(10)
|
||||
try:
|
||||
port = None
|
||||
while True:
|
||||
try:
|
||||
contents = open(signal_file, "rb").read()
|
||||
port = int(contents.split()[0])
|
||||
break
|
||||
except (IOError, IndexError, ValueError, TypeError):
|
||||
eventlet.sleep(0.1)
|
||||
eventlet.connect(('127.0.0.1', port))
|
||||
while True:
|
||||
try:
|
||||
contents = open(signal_file, "rb").read()
|
||||
result = contents.split()[1]
|
||||
break
|
||||
except (IOError, IndexError):
|
||||
eventlet.sleep(0.1)
|
||||
print 'result', result
|
||||
finally:
|
||||
os.kill(pid, signal.SIGTERM)
|
||||
else:
|
||||
try:
|
||||
s = eventlet.listen(('', 0))
|
||||
fd = open(signal_file, "wb")
|
||||
fd.write(str(s.getsockname()[1]))
|
||||
fd.write("\\n")
|
||||
fd.flush()
|
||||
s.accept()
|
||||
fd.write("done")
|
||||
fd.flush()
|
||||
finally:
|
||||
fd.close()
|
||||
'''
|
||||
self.write_to_tempfile("newmod", newmod % self.tempdir)
|
||||
output, lines = self.launch_subprocess('newmod.py')
|
||||
self.assertEqual(lines[0], "result done", output)
|
Reference in New Issue
Block a user