Merging with the latest eventlet tip

This commit is contained in:
R. Tyler Ballance
2010-08-27 14:07:12 -07:00
3 changed files with 52 additions and 45 deletions

View File

@@ -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.

View File

@@ -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
View 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)