python3 compatibility

- dict.items().pop() in proc
- str/bytes in backdoor, api_test, ssl_test, test__refcount
- import httplib from six
- PEP-8 fixes
This commit is contained in:
Sergey Shepelev
2014-04-23 16:52:43 +04:00
parent 2da62a16c3
commit 49773bb12b
11 changed files with 131 additions and 109 deletions

View File

@@ -1,13 +1,13 @@
from __future__ import print_function
from code import InteractiveConsole
import errno
import socket
import sys
import errno
from code import InteractiveConsole
import eventlet
from eventlet import hubs
from eventlet.support import greenlets, get_errno
from eventlet.support import greenlets, get_errno, six
try:
sys.ps1
@@ -29,12 +29,14 @@ class FileProxy(object):
def flush(self):
pass
def write(self, *a, **kw):
self.f.write(*a, **kw)
def write(self, data, *a, **kw):
data = six.b(data)
self.f.write(data, *a, **kw)
self.f.flush()
def readline(self, *a):
return self.f.readline(*a).replace('\r\n', '\n')
line = self.f.readline(*a).replace(b'\r\n', b'\n')
return six.u(line)
def __getattr__(self, attr):
return getattr(self.f, attr)

View File

@@ -1,5 +1,6 @@
from eventlet import patcher
from eventlet.green import socket
from eventlet.support import six
to_patch = [('socket', socket)]
@@ -9,9 +10,10 @@ try:
except ImportError:
pass
patcher.inject('httplib',
globals(),
*to_patch)
if six.PY2:
patcher.inject('httplib', globals(), *to_patch)
if six.PY3:
patcher.inject('http.client', globals(), *to_patch)
if __name__ == '__main__':
test()

View File

@@ -11,11 +11,11 @@ try:
to_patch.append(('ssl', ssl))
except ImportError:
pass
patcher.inject('urllib', globals(), *to_patch)
# patch a bunch of things that have imports inside the
# function body; this is lame and hacky but I don't feel
# patch a bunch of things that have imports inside the
# function body; this is lame and hacky but I don't feel
# too bad because urllib is a hacky pile of junk that no
# one should be using anyhow
URLopener.open_http = patcher.patch_function(URLopener.open_http, ('httplib', httplib))

View File

@@ -1,16 +1,16 @@
from eventlet.support import get_errno, six
from eventlet.hubs import trampoline
BUFFER_SIZE = 4096
import array
import errno
import os
import socket
from socket import socket as _original_socket
import socket
import sys
import time
import warnings
from eventlet.support import get_errno, six
from eventlet.hubs import trampoline
BUFFER_SIZE = 4096
__all__ = ['GreenSocket', 'GreenPipe', 'shutdown_safe']
CONNECT_ERR = set((errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK))
@@ -178,7 +178,7 @@ class GreenSocket(object):
set_nonblocking(client)
return type(self)(client), addr
trampoline(fd, read=True, timeout=self.gettimeout(),
timeout_exc=socket.timeout("timed out"))
timeout_exc=socket.timeout("timed out"))
def connect(self, address):
if self.act_non_blocking:
@@ -196,7 +196,7 @@ class GreenSocket(object):
if time.time() >= end:
raise socket.timeout("timed out")
trampoline(fd, write=True, timeout=end - time.time(),
timeout_exc=socket.timeout("timed out"))
timeout_exc=socket.timeout("timed out"))
socket_checkerr(fd)
def connect_ex(self, address):
@@ -219,7 +219,7 @@ class GreenSocket(object):
if time.time() >= end:
raise socket.timeout(errno.EAGAIN)
trampoline(fd, write=True, timeout=end - time.time(),
timeout_exc=socket.timeout(errno.EAGAIN))
timeout_exc=socket.timeout(errno.EAGAIN))
socket_checkerr(fd)
except socket.error as ex:
return get_errno(ex)
@@ -239,7 +239,7 @@ class GreenSocket(object):
def makeGreenFile(self, *args, **kw):
warnings.warn("makeGreenFile has been deprecated, please use "
"makefile instead", DeprecationWarning, stacklevel=2)
"makefile instead", DeprecationWarning, stacklevel=2)
return self.makefile(*args, **kw)
def recv(self, buflen, flags=0):
@@ -256,7 +256,8 @@ class GreenSocket(object):
return ''
else:
raise
trampoline(fd,
trampoline(
fd,
read=True,
timeout=self.gettimeout(),
timeout_exc=socket.timeout("timed out"))
@@ -264,19 +265,19 @@ class GreenSocket(object):
def recvfrom(self, *args):
if not self.act_non_blocking:
trampoline(self.fd, read=True, timeout=self.gettimeout(),
timeout_exc=socket.timeout("timed out"))
timeout_exc=socket.timeout("timed out"))
return self.fd.recvfrom(*args)
def recvfrom_into(self, *args):
if not self.act_non_blocking:
trampoline(self.fd, read=True, timeout=self.gettimeout(),
timeout_exc=socket.timeout("timed out"))
timeout_exc=socket.timeout("timed out"))
return self.fd.recvfrom_into(*args)
def recv_into(self, *args):
if not self.act_non_blocking:
trampoline(self.fd, read=True, timeout=self.gettimeout(),
timeout_exc=socket.timeout("timed out"))
timeout_exc=socket.timeout("timed out"))
return self.fd.recv_into(*args)
def send(self, data, flags=0):
@@ -287,7 +288,6 @@ class GreenSocket(object):
# blocking socket behavior - sends all, blocks if the buffer is full
total_sent = 0
len_data = len(data)
while 1:
try:
total_sent += fd.send(data[total_sent:], flags)
@@ -299,7 +299,7 @@ class GreenSocket(object):
break
trampoline(self.fd, write=True, timeout=self.gettimeout(),
timeout_exc=socket.timeout("timed out"))
timeout_exc=socket.timeout("timed out"))
return total_sent
@@ -467,9 +467,10 @@ class GreenPipe(_fileobject):
def close(self):
super(GreenPipe, self).close()
for method in ['fileno', 'flush', 'isatty', 'next', 'read', 'readinto',
'readline', 'readlines', 'seek', 'tell', 'truncate',
'write', 'xreadlines', '__iter__', 'writelines']:
for method in [
'fileno', 'flush', 'isatty', 'next', 'read', 'readinto',
'readline', 'readlines', 'seek', 'tell', 'truncate',
'write', 'xreadlines', '__iter__', 'writelines']:
setattr(self, method, _operationOnClosedFile)
def __enter__(self):
@@ -479,7 +480,7 @@ class GreenPipe(_fileobject):
self.close()
def readinto(self, buf):
data = self.read(len(buf)) # FIXME could it be done without allocating intermediate?
data = self.read(len(buf)) # FIXME could it be done without allocating intermediate?
n = len(data)
try:
buf[:n] = data
@@ -506,9 +507,9 @@ class GreenPipe(_fileobject):
def seek(self, offset, whence=0):
self.flush()
if whence == 1 and offset == 0: # tell synonym
if whence == 1 and offset == 0: # tell synonym
return self.tell()
if whence == 1: # adjust offset by what is read ahead
if whence == 1: # adjust offset by what is read ahead
offset -= self._get_readahead_len()
try:
rv = os.lseek(self.fileno(), offset, whence)
@@ -518,7 +519,7 @@ class GreenPipe(_fileobject):
self._clear_readahead_buf()
return rv
if getattr(file, "truncate", None): # not all OSes implement truncate
if getattr(file, "truncate", None): # not all OSes implement truncate
def truncate(self, size=-1):
self.flush()
if size == -1:
@@ -528,7 +529,7 @@ class GreenPipe(_fileobject):
except OSError as e:
raise IOError(*e.args)
else:
self.seek(size) # move position&clear buffer
self.seek(size) # move position&clear buffer
return rv
def isatty(self):

View File

@@ -4,9 +4,11 @@ from eventlet import coros, proc, api
from eventlet.semaphore import Semaphore
import warnings
warnings.warn("The pool module is deprecated. Please use the "
"eventlet.GreenPool and eventlet.GreenPile classes instead.",
DeprecationWarning, stacklevel=2)
warnings.warn(
"The pool module is deprecated. Please use the "
"eventlet.GreenPool and eventlet.GreenPile classes instead.",
DeprecationWarning, stacklevel=2)
class Pool(object):
def __init__(self, min_size=0, max_size=4, track_events=False):
@@ -315,5 +317,3 @@ class Pool(object):
while finished < index + 1:
yield q.wait()
finished += 1

View File

@@ -1,9 +1,3 @@
import warnings
warnings.warn("The proc module is deprecated! Please use the greenthread "
"module, or any of the many other Eventlet cross-coroutine "
"primitives, instead.",
DeprecationWarning, stacklevel=2)
"""
This module provides means to spawn, kill and link coroutines. Linking means
subscribing to the coroutine's result, either in form of return value or
@@ -63,7 +57,16 @@ coroutines and wait for all them to complete. Such a function is provided by
this module.
"""
import sys
from eventlet import api, coros, hubs
from eventlet.support import six
import warnings
warnings.warn(
"The proc module is deprecated! Please use the greenthread "
"module, or any of the many other Eventlet cross-coroutine "
"primitives, instead.",
DeprecationWarning, stacklevel=2)
__all__ = ['LinkedExited',
'LinkedFailed',
@@ -91,11 +94,13 @@ class LinkedExited(Exception):
msg = self.msg % self.name
Exception.__init__(self, msg)
class LinkedCompleted(LinkedExited):
"""Raised when a linked proc finishes the execution cleanly"""
msg = "%r completed successfully"
class LinkedFailed(LinkedExited):
"""Raised when a linked proc dies because of unhandled exception"""
msg = "%r failed with %s"
@@ -104,12 +109,14 @@ class LinkedFailed(LinkedExited):
msg = self.msg % (name, typ.__name__)
LinkedExited.__init__(self, name, msg)
class LinkedKilled(LinkedFailed):
"""Raised when a linked proc dies because of unhandled GreenletExit
(i.e. it was killed)
"""
msg = """%r was killed with %s"""
def getLinkedFailed(name, typ, value=None, tb=None):
if issubclass(typ, api.GreenletExit):
return LinkedKilled(name, typ, value, tb)
@@ -137,6 +144,7 @@ class Link(object):
def __exit__(self, *args):
self.cancel()
class LinkToEvent(Link):
def __call__(self, source):
@@ -147,6 +155,7 @@ class LinkToEvent(Link):
else:
self.listener.send_exception(*source.exc_info())
class LinkToGreenlet(Link):
def __call__(self, source):
@@ -155,6 +164,7 @@ class LinkToGreenlet(Link):
else:
self.listener.throw(getLinkedFailed(source.name, *source.exc_info()))
class LinkToCallable(Link):
def __call__(self, source):
@@ -291,7 +301,7 @@ class Source(object):
if self.value is not _NOT_USED:
if self._exc is None:
res = repr(self.value)
if len(res)>50:
if len(res) > 50:
res = res[:50]+'...'
result.append('result=%s' % res)
else:
@@ -315,14 +325,14 @@ class Source(object):
def exc_info(self):
if not self._exc:
return (None, None, None)
elif len(self._exc)==3:
elif len(self._exc) == 3:
return self._exc
elif len(self._exc)==1:
elif len(self._exc) == 1:
if isinstance(self._exc[0], type):
return self._exc[0], None, None
else:
return self._exc[0].__class__, self._exc[0], None
elif len(self._exc)==2:
elif len(self._exc) == 2:
return self._exc[0], self._exc[1], None
else:
return self._exc
@@ -401,7 +411,8 @@ class Source(object):
self._start_send()
def _start_send(self):
hubs.get_hub().schedule_call_global(0, self._do_send, self._value_links.items(), self._value_links)
links_items = list(six.iteritems(self._value_links))
hubs.get_hub().schedule_call_global(0, self._do_send, links_items, self._value_links)
def send_exception(self, *throw_args):
assert not self.ready(), "%s has been fired already" % self
@@ -410,7 +421,8 @@ class Source(object):
self._start_send_exception()
def _start_send_exception(self):
hubs.get_hub().schedule_call_global(0, self._do_send, self._exception_links.items(), self._exception_links)
links_items = list(six.iteritems(self._exception_links))
hubs.get_hub().schedule_call_global(0, self._do_send, links_items, self._exception_links)
def _do_send(self, links, consult):
while links:
@@ -443,7 +455,7 @@ class Source(object):
if timeout is not None:
timer = api.timeout(timeout, *throw_args)
timer.__enter__()
if timeout==0:
if timeout == 0:
if timer.__exit__(None, None, None):
return
else:
@@ -565,7 +577,7 @@ class Proc(Source):
result = function(*args, **kwargs)
except:
self.send_exception(*sys.exc_info())
raise # let mainloop log the exception
raise # let mainloop log the exception
else:
self.send(result)
@@ -603,23 +615,25 @@ class Proc(Source):
spawn = Proc.spawn
def spawn_link(function, *args, **kwargs):
p = spawn(function, *args, **kwargs)
p.link()
return p
def spawn_link_value(function, *args, **kwargs):
p = spawn(function, *args, **kwargs)
p.link_value()
return p
def spawn_link_exception(function, *args, **kwargs):
p = spawn(function, *args, **kwargs)
p.link_exception()
return p
class wrap_errors(object):
"""Helper to make function return an exception, rather than raise it.

View File

@@ -1,5 +1,4 @@
import os
import os.path
import socket
from unittest import TestCase, main
import warnings
@@ -45,7 +44,7 @@ class TestApi(TestCase):
conn, addr = listenfd.accept()
fd = conn.makefile(mode='w')
conn.close()
fd.write('hello\n')
fd.write(b'hello\n')
fd.close()
finally:
listenfd.close()
@@ -56,7 +55,7 @@ class TestApi(TestCase):
client = eventlet.connect(('127.0.0.1', server.getsockname()[1]))
fd = client.makefile()
client.close()
assert fd.readline() == 'hello\n'
assert fd.readline() == b'hello\n'
assert fd.read() == ''
fd.close()
@@ -68,7 +67,7 @@ class TestApi(TestCase):
def accept_once(listenfd):
try:
conn, addr = listenfd.accept()
conn.write('hello\r\n')
conn.write(b'hello\r\n')
greenio.shutdown_safe(conn)
conn.close()
finally:
@@ -84,7 +83,7 @@ class TestApi(TestCase):
client = util.wrap_ssl(raw_client)
fd = socket._fileobject(client, 'rb', 8192)
assert fd.readline() == 'hello\r\n'
assert fd.readline() == b'hello\r\n'
try:
self.assertEquals('', fd.read(10))
except greenio.SSL.ZeroReturnError:
@@ -92,13 +91,13 @@ class TestApi(TestCase):
pass
greenio.shutdown_safe(client)
client.close()
check_hub()
def test_001_trampoline_timeout(self):
from eventlet import coros
server_sock = eventlet.listen(('127.0.0.1', 0))
bound_port = server_sock.getsockname()[1]
def server(sock):
client, addr = sock.accept()
api.sleep(0.1)
@@ -108,7 +107,7 @@ class TestApi(TestCase):
desc = eventlet.connect(('127.0.0.1', bound_port))
api.trampoline(desc, read=True, write=False, timeout=0.001)
except api.TimeoutError:
pass # test passed
pass # test passed
else:
assert False, "Didn't timeout"
@@ -120,6 +119,7 @@ class TestApi(TestCase):
bound_port = server.getsockname()[1]
done = [False]
def client_closer(sock):
while True:
(conn, addr) = sock.accept()
@@ -154,11 +154,11 @@ class TestApi(TestCase):
def test_naming_missing_class(self):
self.assertRaises(
ImportError, api.named, 'this_name_should_hopefully_not_exist.Foo')
def test_killing_dormant(self):
DELAY = 0.1
state = []
def test():
try:
state.append('start')
@@ -176,7 +176,7 @@ class TestApi(TestCase):
self.assertEquals(state, ['start'])
api.kill(g)
# will not get there, unless switching is explicitly scheduled by kill
self.assertEquals(state,['start', 'except'])
self.assertEquals(state, ['start', 'except'])
api.sleep(DELAY)
self.assertEquals(state, ['start', 'except', 'finished'])
@@ -192,4 +192,3 @@ class Foo(object):
if __name__ == '__main__':
main()

View File

@@ -14,15 +14,15 @@ class BackdoorTest(LimitedTestCase):
client = socket.socket()
client.connect(('localhost', listener.getsockname()[1]))
f = client.makefile('rw')
self.assert_('Python' in f.readline())
self.assert_(b'Python' in f.readline())
f.readline() # build info
f.readline() # help info
self.assert_('InteractiveConsole' in f.readline())
self.assertEquals('>>> ', f.read(4))
f.write('print("hi")\n')
self.assert_(b'InteractiveConsole' in f.readline())
self.assertEquals(b'>>> ', f.read(4))
f.write(b'print("hi")\n')
f.flush()
self.assertEquals('hi\n', f.readline())
self.assertEquals('>>> ', f.read(4))
self.assertEquals(b'hi\n', f.readline())
self.assertEquals(b'>>> ', f.read(4))
f.close()
client.close()
serv.kill()

View File

@@ -16,7 +16,7 @@ from tests import (
def listen_ssl_socket(address=('127.0.0.1', 0)):
sock = util.wrap_ssl(socket.socket(), certificate_file,
private_key_file, True)
private_key_file, True)
sock.bind(address)
sock.listen(50)
@@ -37,25 +37,25 @@ class SSLTest(LimitedTestCase):
def test_duplex_response(self):
def serve(listener):
sock, addr = listener.accept()
stuff = sock.read(8192)
sock.write('response')
sock.read(8192)
sock.write(b'response')
sock = listen_ssl_socket()
server_coro = eventlet.spawn(serve, sock)
client = util.wrap_ssl(eventlet.connect(('127.0.0.1', sock.getsockname()[1])))
client.write('line 1\r\nline 2\r\n\r\n')
self.assertEquals(client.read(8192), 'response')
client.write(b'line 1\r\nline 2\r\n\r\n')
self.assertEquals(client.read(8192), b'response')
server_coro.wait()
@skip_if_no_ssl
def test_ssl_close(self):
def serve(listener):
sock, addr = listener.accept()
stuff = sock.read(8192)
sock.read(8192)
try:
self.assertEquals("", sock.read(8192))
self.assertEquals(b"", sock.read(8192))
except greenio.SSL.ZeroReturnError:
pass
@@ -65,7 +65,7 @@ class SSLTest(LimitedTestCase):
raw_client = eventlet.connect(('127.0.0.1', sock.getsockname()[1]))
client = util.wrap_ssl(raw_client)
client.write('X')
client.write(b'X')
greenio.shutdown_safe(client)
client.close()
server_coro.wait()
@@ -74,14 +74,14 @@ class SSLTest(LimitedTestCase):
def test_ssl_connect(self):
def serve(listener):
sock, addr = listener.accept()
stuff = sock.read(8192)
sock.read(8192)
sock = listen_ssl_socket()
server_coro = eventlet.spawn(serve, sock)
raw_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_client = util.wrap_ssl(raw_client)
ssl_client.connect(('127.0.0.1', sock.getsockname()[1]))
ssl_client.write('abc')
ssl_client.write(b'abc')
greenio.shutdown_safe(ssl_client)
ssl_client.close()
server_coro.wait()
@@ -90,24 +90,24 @@ class SSLTest(LimitedTestCase):
def test_ssl_unwrap(self):
def serve():
sock, addr = listener.accept()
self.assertEquals(sock.recv(6), 'before')
self.assertEquals(sock.recv(6), b'before')
sock_ssl = util.wrap_ssl(sock, certificate_file, private_key_file,
server_side=True)
sock_ssl.do_handshake()
self.assertEquals(sock_ssl.read(6), 'during')
self.assertEquals(sock_ssl.read(6), b'during')
sock2 = sock_ssl.unwrap()
self.assertEquals(sock2.recv(5), 'after')
self.assertEquals(sock2.recv(5), b'after')
sock2.close()
listener = eventlet.listen(('127.0.0.1', 0))
server_coro = eventlet.spawn(serve)
client = eventlet.connect((listener.getsockname()))
client.send('before')
client.send(b'before')
client_ssl = util.wrap_ssl(client)
client_ssl.do_handshake()
client_ssl.write('during')
client_ssl.write(b'during')
client2 = client_ssl.unwrap()
client2.send('after')
client2.send(b'after')
server_coro.wait()
@skip_if_no_ssl
@@ -131,11 +131,11 @@ class SSLTest(LimitedTestCase):
def serve(listener):
conn, _ = listener.accept()
conn.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, BUFFER_SIZE)
self.assertEqual(conn.read(8), 'request')
conn.write('response')
self.assertEqual(conn.read(8), b'request')
conn.write(b'response')
stage_1.wait()
conn.sendall('x' * SENDALL_SIZE)
conn.sendall(b'x' * SENDALL_SIZE)
server_sock = listen_ssl_socket()
server_coro = eventlet.spawn(serve, server_sock)
@@ -143,8 +143,8 @@ class SSLTest(LimitedTestCase):
client_sock = eventlet.connect(server_sock.getsockname())
client_sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, BUFFER_SIZE)
client = util.wrap_ssl(client_sock)
client.write('request')
self.assertEqual(client.read(8), 'response')
client.write(b'request')
self.assertEqual(client.read(8), b'response')
stage_1.send()
check_idle_cpu_usage(0.2, 0.1)
@@ -154,14 +154,14 @@ class SSLTest(LimitedTestCase):
def test_greensslobject(self):
def serve(listener):
sock, addr = listener.accept()
sock.write('content')
sock.write(b'content')
greenio.shutdown_safe(sock)
sock.close()
listener = listen_ssl_socket(('', 0))
killer = eventlet.spawn(serve, listener)
eventlet.spawn(serve, listener)
client = ssl(eventlet.connect(('localhost', listener.getsockname()[1])))
self.assertEquals(client.read(1024), 'content')
self.assertEquals(client.read(1024), '')
self.assertEquals(client.read(1024), b'content')
self.assertEquals(client.read(1024), b'')
@skip_if_no_ssl
def test_regression_gh_17(self):
@@ -170,13 +170,13 @@ class SSLTest(LimitedTestCase):
# to simulate condition mentioned in GH-17
sock._sslobj = None
sock.sendall('some data')
sock.sendall(b'some data')
greenio.shutdown_safe(sock)
sock.close()
listener = listen_ssl_socket(('', 0))
killer = eventlet.spawn(serve, listener)
client = ssl(eventlet.connect(('localhost', listener.getsockname()[1])))
eventlet.spawn(serve, listener)
ssl(eventlet.connect(('localhost', listener.getsockname()[1])))
if __name__ == '__main__':
main()

View File

@@ -33,9 +33,9 @@ def handle_request(s, raise_on_timeout):
return
#print('handle_request - accepted')
res = conn.recv(100)
assert res == 'hello', repr(res)
assert res == b'hello', repr(res)
#print('handle_request - recvd %r' % res)
res = conn.send('bye')
res = conn.send(b'bye')
#print('handle_request - sent %r' % res)
#print('handle_request - conn refcount: %s' % sys.getrefcount(conn))
#conn.close()
@@ -46,10 +46,10 @@ def make_request(port):
s = socket.socket()
s.connect(('localhost', port))
#print('make_request - connected')
res = s.send('hello')
res = s.send(b'hello')
#print('make_request - sent %s' % res)
res = s.recv(100)
assert res == 'bye', repr(res)
assert res == b'bye', repr(res)
#print('make_request - recvd %r' % res)
#s.close()
@@ -59,7 +59,7 @@ def run_interaction(run_client):
start_new_thread(handle_request, (s, run_client))
if run_client:
start_new_thread(make_request, (port,))
sleep(0.1+SOCKET_TIMEOUT)
sleep(0.1 + SOCKET_TIMEOUT)
#print(sys.getrefcount(s.fd))
#s.close()
return weakref.ref(s.fd)
@@ -74,7 +74,7 @@ def run_and_check(run_client):
for x in gc.get_referrers(w()):
print(pformat(x))
for y in gc.get_referrers(x):
print('-', pformat(y))
print('- {0}'.format(pformat(y)))
raise AssertionError('server should be dead by now')
@@ -82,10 +82,11 @@ def test_clean_exit():
run_and_check(True)
run_and_check(True)
def test_timeout_exit():
run_and_check(False)
run_and_check(False)
if __name__=='__main__':
unittest.main()

View File

@@ -38,11 +38,14 @@ commands =
eventlet/green/__init__.py \
eventlet/green/_socket_nodns.py \
eventlet/green/ftplib.py \
eventlet/green/httplib.py \
eventlet/green/OpenSSL/__init__.py \
eventlet/green/subprocess.py \
eventlet/green/time.py \
eventlet/green/urllib.py \
eventlet/hubs/__init__.py \
eventlet/hubs/timer.py \
eventlet/pool.py \
eventlet/semaphore.py \
eventlet/support/__init__.py \
tests/__init__.py \