From 53a59d9370fc8e7155da4a7c04ad0c15f6c0750a Mon Sep 17 00:00:00 2001 From: amajorek Date: Fri, 26 Feb 2010 09:58:07 -0500 Subject: [PATCH 1/6] first draft of making eventlet py3k compatible. - __import__ used to import system modules in places where local module with the same name exist. - GreenSocket.timeout private member renamed to _timeout. It is R/O property in 3.x socket.socket object. - Calls to GreensSocket.timeout changed to call gettimeout to isolate clients from GreenSocket internals. - GreenSocket access to unknown attributes will be forwarded to fd member. i.e. py3k has _io_refs property not needed in 2.x version - get_errno moved to eventlet/greenio.py to be accessible to every place where testing socket.error.errno is needed - Modified tests to use makefile with mode='w' where data was written. 3.x does not allow to write to file opened for reading. - socket._fileobject class does not exist in 3.x. It will be emulated with _fileobject function. Also moved definition from eventlet.green.socket to eventlet.grreenio. --- eventlet/green/OpenSSL/SSL.py | 18 ++++++------- eventlet/green/os.py | 4 +-- eventlet/green/socket.py | 5 ++-- eventlet/green/ssl.py | 13 +++++---- eventlet/greenio.py | 51 ++++++++++++++++++++++++++--------- eventlet/hubs/hub.py | 9 ++++++- eventlet/tpool.py | 2 +- eventlet/wsgi.py | 10 +------ tests/api_test.py | 2 +- 9 files changed, 69 insertions(+), 45 deletions(-) diff --git a/eventlet/green/OpenSSL/SSL.py b/eventlet/green/OpenSSL/SSL.py index d0a0b42..8e2fe80 100644 --- a/eventlet/green/OpenSSL/SSL.py +++ b/eventlet/green/OpenSSL/SSL.py @@ -32,12 +32,12 @@ class GreenConnection(greenio.GreenSocket): except WantReadError: trampoline(self.fd.fileno(), read=True, - timeout=self.timeout, + timeout=self.gettimeout(), timeout_exc=socket.timeout) except WantWriteError: trampoline(self.fd.fileno(), write=True, - timeout=self.timeout, + timeout=self.gettimeout(), timeout_exc=socket.timeout) def dup(self): @@ -81,12 +81,12 @@ class GreenConnection(greenio.GreenSocket): except WantReadError: trampoline(self.fd.fileno(), read=True, - timeout=self.timeout, + timeout=self.gettimeout(), timeout_exc=socket.timeout) except WantWriteError: trampoline(self.fd.fileno(), write=True, - timeout=self.timeout, + timeout=self.gettimeout(), timeout_exc=socket.timeout) except SysCallError, e: if e[0] == -1 or e[0] > 0: @@ -111,12 +111,12 @@ class GreenConnection(greenio.GreenSocket): except WantReadError: trampoline(self.fd.fileno(), read=True, - timeout=self.timeout, + timeout=self.gettimeout(), timeout_exc=socket.timeout) except WantWriteError: trampoline(self.fd.fileno(), write=True, - timeout=self.timeout, + timeout=self.gettimeout(), timeout_exc=socket.timeout) send = write @@ -148,12 +148,12 @@ class GreenConnection(greenio.GreenSocket): except WantReadError: trampoline(self.fd.fileno(), read=True, - timeout=self.timeout, + timeout=self.gettimeout(), timeout_exc=socket.timeout) except WantWriteError: trampoline(self.fd.fileno(), write=True, - timeout=self.timeout, + timeout=self.gettimeout(), timeout_exc=socket.timeout) @@ -183,4 +183,4 @@ class GreenConnection(greenio.GreenSocket): Connection = ConnectionType = GreenConnection -del greenio \ No newline at end of file +del greenio diff --git a/eventlet/green/os.py b/eventlet/green/os.py index e8fe292..952c5ae 100644 --- a/eventlet/green/os.py +++ b/eventlet/green/os.py @@ -1,6 +1,6 @@ os_orig = __import__("os") import errno -import socket +socket = __import__("socket") from eventlet import greenio from eventlet import greenthread @@ -74,4 +74,4 @@ def waitpid(pid, options): return rpid, status greenthread.sleep(0.01) -# TODO: open \ No newline at end of file +# TODO: open diff --git a/eventlet/green/socket.py b/eventlet/green/socket.py index 4af8f05..01c5f7a 100644 --- a/eventlet/green/socket.py +++ b/eventlet/green/socket.py @@ -1,13 +1,14 @@ __socket = __import__('socket') for var in __socket.__all__: exec "%s = __socket.%s" % (var, var) -_fileobject = __socket._fileobject from eventlet.hubs import get_hub from eventlet.greenio import GreenSocket as socket from eventlet.greenio import SSL as _SSL # for exceptions from eventlet.greenio import _GLOBAL_DEFAULT_TIMEOUT -import os +from eventlet.greenio import _fileobject + +os = __import__('os') import sys import warnings diff --git a/eventlet/green/ssl.py b/eventlet/green/ssl.py index 9c15541..23bcadc 100644 --- a/eventlet/green/ssl.py +++ b/eventlet/green/ssl.py @@ -4,10 +4,9 @@ for attr in dir(__ssl): exec "%s = __ssl.%s" % (attr, attr) import errno -import time +time = __import__('time') from eventlet.hubs import trampoline -from thread import get_ident from eventlet.greenio import set_nonblocking, GreenSocket, SOCKET_CLOSED, CONNECT_ERR, CONNECT_SUCCESS orig_socket = __import__('socket') socket = orig_socket.socket @@ -36,7 +35,7 @@ class GreenSSLSocket(__ssl.SSLSocket): sock = GreenSocket(sock) self.act_non_blocking = sock.act_non_blocking - self.timeout = sock.timeout + self._timeout = sock.gettimeout() super(GreenSSLSocket, self).__init__(sock.fd, *args, **kw) del sock @@ -49,18 +48,18 @@ class GreenSSLSocket(__ssl.SSLSocket): self.recvfrom_into = lambda buffer, nbytes=None, flags=0: GreenSSLSocket.recvfrom_into(self, buffer, nbytes, flags) def settimeout(self, timeout): - self.timeout = timeout + self._timeout = timeout def gettimeout(self): - return self.timeout + return self._timeout def setblocking(self, flag): if flag: self.act_non_blocking = False - self.timeout = None + self._timeout = None else: self.act_non_blocking = True - self.timeout = 0.0 + self._timeout = 0.0 def _call_trampolining(self, func, *a, **kw): if self.act_non_blocking: diff --git a/eventlet/greenio.py b/eventlet/greenio.py index b95ab39..f750a32 100644 --- a/eventlet/greenio.py +++ b/eventlet/greenio.py @@ -20,6 +20,27 @@ __all__ = ['GreenSocket', 'GreenPipe', 'shutdown_safe'] CONNECT_ERR = set((errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK)) CONNECT_SUCCESS = set((0, errno.EISCONN)) +# Emulate _fileobject class in 3.x implementation +# Eventually this internal socket structure could be replaced with makefile calls. +try: + _fileobject = socket._fileobject +except AttributeError: + def _fileobject(sock, *args, **kwargs): + return _original_socket.makefile(sock, *args, **kwargs) + +def get_errno(exc): + """ Get the error code out of socket.error objects. + socket.error in <2.5 does not have errno attribute + socket.error in 3.x does not allow indexing access + """ + try: + return exc.errno + except AttributeError: + try: + return exc[0] + except (TypeError,IndexError): + return None + def socket_connect(descriptor, address): """ Attempts to connect to the address, returns the descriptor if it succeeds, @@ -42,7 +63,7 @@ def socket_accept(descriptor): try: return descriptor.accept() except socket.error, e: - if e[0] == errno.EWOULDBLOCK: + if get_errno(e) == errno.EWOULDBLOCK: return None raise @@ -102,7 +123,6 @@ class GreenSocket(object): Green version of socket.socket class, that is intended to be 100% API-compatible. """ - timeout = None def __init__(self, family_or_realsock=socket.AF_INET, *args, **kwargs): if isinstance(family_or_realsock, (int, long)): fd = _original_socket(family_or_realsock, *args, **kwargs) @@ -113,9 +133,9 @@ class GreenSocket(object): # import timeout from other socket, if it was there try: - self.timeout = fd.gettimeout() or socket.getdefaulttimeout() + self._timeout = fd.gettimeout() or socket.getdefaulttimeout() except AttributeError: - self.timeout = socket.getdefaulttimeout() + self._timeout = socket.getdefaulttimeout() set_nonblocking(fd) self.fd = fd @@ -140,6 +160,11 @@ class GreenSocket(object): def proto(self): return self.fd.proto + #forward unknown requests to fd + #i.e _io_refs and _decref_socketios in 3.x + def __getattr__(self, value): + return getattr(self.fd, value) + def accept(self): if self.act_non_blocking: return self.fd.accept() @@ -206,7 +231,7 @@ class GreenSocket(object): sock = self.fd.dup(*args, **kw) set_nonblocking(sock) newsock = type(self)(sock) - newsock.settimeout(self.timeout) + newsock.settimeout(self.gettimeout()) return newsock def fileno(self, *args, **kw): @@ -229,8 +254,8 @@ class GreenSocket(object): fn = self.listen = self.fd.listen return fn(*args, **kw) - def makefile(self, mode='r', bufsize=-1): - return socket._fileobject(self.dup(), mode, bufsize) + def makefile(self, *args, **kw): + return _fileobject(self.dup(), *args, **kw) def makeGreenFile(self, mode='r', bufsize=-1): warnings.warn("makeGreenFile has been deprecated, please use " @@ -253,7 +278,7 @@ class GreenSocket(object): raise trampoline(fd, read=True, - timeout=self.timeout, + timeout=self.gettimeout(), timeout_exc=socket.timeout) def recvfrom(self, *args): @@ -289,7 +314,7 @@ class GreenSocket(object): while tail < len_data: trampoline(fd, write=True, - timeout=self.timeout, + timeout=self.gettimeout(), timeout_exc=socket.timeout) tail += self.send(data[tail:], flags) @@ -300,10 +325,10 @@ class GreenSocket(object): def setblocking(self, flag): if flag: self.act_non_blocking = False - self.timeout = None + self._timeout = None else: self.act_non_blocking = True - self.timeout = 0.0 + self._timeout = 0.0 def setsockopt(self, *args, **kw): fn = self.setsockopt = self.fd.setsockopt @@ -327,10 +352,10 @@ class GreenSocket(object): if howlong == 0.0: self.setblocking(howlong) else: - self.timeout = howlong + self._timeout = howlong def gettimeout(self): - return self.timeout + return self._timeout class GreenPipe(object): diff --git a/eventlet/hubs/hub.py b/eventlet/hubs/hub.py index c5e885e..b6f7489 100644 --- a/eventlet/hubs/hub.py +++ b/eventlet/hubs/hub.py @@ -7,6 +7,13 @@ from eventlet.hubs import timer from eventlet import patcher time = patcher.original('time') +# In py3k exception information is not visible outside of except statements +# so sys.exc_clear become obsolete and removed. +try: + sys_exc_clear = sys.exc_clear +except AttributeError: + sys_exc_clear = lambda: None + READ="read" WRITE="write" @@ -110,7 +117,7 @@ class BaseHub(object): current.parent = self.greenlet except ValueError: pass # gets raised if there is a greenlet parent cycle - sys.exc_clear() + sys_exc_clear() return self.greenlet.switch() def squelch_exception(self, fileno, exc_info): diff --git a/eventlet/tpool.py b/eventlet/tpool.py index b36fc7c..df7d2c3 100644 --- a/eventlet/tpool.py +++ b/eventlet/tpool.py @@ -226,7 +226,7 @@ def setup(): csock = util.__original_socket__(socket.AF_INET, socket.SOCK_STREAM) csock.connect(('localhost', sock.getsockname()[1])) nsock, addr = sock.accept() - _rfile = greenio.Green_fileobject(greenio.GreenSocket(csock)) + _rfile = greenio.GreenSocket(csock).makefile() _wfile = nsock.makefile() _reqq = Queue(maxsize=-1) diff --git a/eventlet/wsgi.py b/eventlet/wsgi.py index 1eebd7e..133a446 100644 --- a/eventlet/wsgi.py +++ b/eventlet/wsgi.py @@ -10,6 +10,7 @@ from eventlet.green import socket from eventlet.green import BaseHTTPServer from eventlet import greenpool from eventlet import greenio +from eventlet.greenio import get_errno DEFAULT_MAX_SIMULTANEOUS_REQUESTS = 1024 DEFAULT_MAX_HTTP_VERSION = 'HTTP/1.1' @@ -40,15 +41,6 @@ BROKEN_SOCK = set((errno.EPIPE, errno.ECONNRESET)) # special flag return value for apps ALREADY_HANDLED = object() -def get_errno(err): - """ Simple method to get the error code out of socket.error objects. It - compensates for some cases where the code is not in the expected - location.""" - try: - return err[0] - except IndexError: - return None - class Input(object): def __init__(self, rfile, diff --git a/tests/api_test.py b/tests/api_test.py index ceb747f..abc84c9 100644 --- a/tests/api_test.py +++ b/tests/api_test.py @@ -39,7 +39,7 @@ class TestApi(TestCase): def accept_once(listenfd): try: conn, addr = listenfd.accept() - fd = conn.makefile() + fd = conn.makefile(mode='w') conn.close() fd.write('hello\n') fd.close() From ff18a2e01c78c98211c692848d733c6222aa682f Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Fri, 26 Feb 2010 16:47:22 -0800 Subject: [PATCH 2/6] 0.9.6 branding --- AUTHORS | 1 + doc/real_index.html | 2 +- eventlet/__init__.py | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/AUTHORS b/AUTHORS index 1b6d574..f921e4e 100644 --- a/AUTHORS +++ b/AUTHORS @@ -13,6 +13,7 @@ Contributors * Patrick Carlisle * Brantley Harris * Gregory Holt +* Joe Malicki * Chet Murthy * Eugene Oden * radix diff --git a/doc/real_index.html b/doc/real_index.html index 3be82f5..fad3ad0 100644 --- a/doc/real_index.html +++ b/doc/real_index.html @@ -41,7 +41,7 @@ easy_install eventlet

Alternately, you can download the source tarball:

diff --git a/eventlet/__init__.py b/eventlet/__init__.py index e82a15a..b70405e 100644 --- a/eventlet/__init__.py +++ b/eventlet/__init__.py @@ -1,4 +1,4 @@ -version_info = (0, 9, 6, "dev1") +version_info = (0, 9, 6) __version__ = ".".join(map(str, version_info)) try: From 15aa8eadd3caf91b4b1f6fb9294232609829b5c5 Mon Sep 17 00:00:00 2001 From: amajorek Date: Sat, 27 Feb 2010 16:31:00 -0500 Subject: [PATCH 4/6] py3k - extracting errno from exception wrapped into get_errno function to work under 3.x python. Exceptions do not have __getitem__ implemented. e.args[0] still works. --- eventlet/green/os.py | 9 +++++---- eventlet/green/profile.py | 4 ++-- eventlet/green/ssl.py | 32 ++++++++++++++++---------------- eventlet/greenio.py | 28 ++++++++++++++-------------- tests/greenio_test.py | 2 +- 5 files changed, 38 insertions(+), 37 deletions(-) diff --git a/eventlet/green/os.py b/eventlet/green/os.py index 952c5ae..83e81b5 100644 --- a/eventlet/green/os.py +++ b/eventlet/green/os.py @@ -3,6 +3,7 @@ import errno socket = __import__("socket") from eventlet import greenio +from eventlet.greenio import get_errno from eventlet import greenthread from eventlet import hubs @@ -27,10 +28,10 @@ def read(fd, n): try: return __original_read__(fd, n) except (OSError, IOError), e: - if e[0] != errno.EAGAIN: + if get_errno(e) != errno.EAGAIN: raise except socket.error, e: - if e[0] == errno.EPIPE: + if get_errno(e) == errno.EPIPE: return '' raise hubs.trampoline(fd, read=True) @@ -45,10 +46,10 @@ def write(fd, st): try: return __original_write__(fd, st) except (OSError, IOError), e: - if e[0] != errno.EAGAIN: + if get_errno(e) != errno.EAGAIN: raise except socket.error, e: - if e[0] != errno.EPIPE: + if get_errno(e) != errno.EPIPE: raise hubs.trampoline(fd, write=True) diff --git a/eventlet/green/profile.py b/eventlet/green/profile.py index 5c000da..5759d75 100644 --- a/eventlet/green/profile.py +++ b/eventlet/green/profile.py @@ -25,6 +25,7 @@ """This module is API-equivalent to the standard library :mod:`profile` module but it is greenthread-aware as well as thread-aware. Use this module to profile Eventlet-based applications in preference to either :mod:`profile` or :mod:`cProfile`. +FIXME: No testcases for this module. """ profile_orig = __import__('profile') @@ -34,9 +35,8 @@ for var in profile_orig.__all__: import new import sys -import time import traceback -import thread +thread = __import__('thread') # Original module needed. 2to3 translated import thread as from . import thread import functools from eventlet import greenthread diff --git a/eventlet/green/ssl.py b/eventlet/green/ssl.py index 23bcadc..a4c6140 100644 --- a/eventlet/green/ssl.py +++ b/eventlet/green/ssl.py @@ -7,7 +7,7 @@ import errno time = __import__('time') from eventlet.hubs import trampoline -from eventlet.greenio import set_nonblocking, GreenSocket, SOCKET_CLOSED, CONNECT_ERR, CONNECT_SUCCESS +from eventlet.greenio import set_nonblocking, GreenSocket, SOCKET_CLOSED, CONNECT_ERR, CONNECT_SUCCESS, get_errno orig_socket = __import__('socket') socket = orig_socket.socket timeout_exc = orig_socket.timeout @@ -69,12 +69,12 @@ class GreenSSLSocket(__ssl.SSLSocket): try: return func(*a, **kw) except SSLError, exc: - if exc[0] == SSL_ERROR_WANT_READ: + if get_errno(exc) == SSL_ERROR_WANT_READ: trampoline(self.fileno(), read=True, timeout=self.gettimeout(), timeout_exc=timeout_exc('timed out')) - elif exc[0] == SSL_ERROR_WANT_WRITE: + elif get_errno(exc) == SSL_ERROR_WANT_WRITE: trampoline(self.fileno(), write=True, timeout=self.gettimeout(), @@ -106,9 +106,9 @@ class GreenSSLSocket(__ssl.SSLSocket): try: v = self._sslobj.write(data) except SSLError, x: - if x.args[0] == SSL_ERROR_WANT_READ: + if get_errno(x) == SSL_ERROR_WANT_READ: return 0 - elif x.args[0] == SSL_ERROR_WANT_WRITE: + elif get_errno(x) == SSL_ERROR_WANT_WRITE: return 0 else: raise @@ -121,8 +121,8 @@ class GreenSSLSocket(__ssl.SSLSocket): except orig_socket.error, e: if self.act_non_blocking: raise - if e[0] == errno.EWOULDBLOCK or \ - e[0] == errno.ENOTCONN: + if get_errno(e) == errno.EWOULDBLOCK or \ + get_errno(e) == errno.ENOTCONN: return 0 raise @@ -155,10 +155,10 @@ class GreenSSLSocket(__ssl.SSLSocket): except orig_socket.error, e: if self.act_non_blocking: raise - if e[0] == errno.EWOULDBLOCK: + if ge_errno(e) == errno.EWOULDBLOCK: trampoline(self.fileno(), write=True, timeout=self.gettimeout(), timeout_exc=timeout_exc('timed out')) - if e[0] in SOCKET_CLOSED: + if get_errno(e) in SOCKET_CLOSED: return '' raise @@ -178,10 +178,10 @@ class GreenSSLSocket(__ssl.SSLSocket): except orig_socket.error, e: if self.act_non_blocking: raise - if e[0] == errno.EWOULDBLOCK: + if get_errno(e) == errno.EWOULDBLOCK: trampoline(self.fileno(), read=True, timeout=self.gettimeout(), timeout_exc=timeout_exc('timed out')) - if e[0] in SOCKET_CLOSED: + if get_errno(e) in SOCKET_CLOSED: return '' raise @@ -221,9 +221,9 @@ class GreenSSLSocket(__ssl.SSLSocket): try: return real_connect(self, addr) except orig_socket.error, exc: - if exc[0] in CONNECT_ERR: + if get_errno(exc) in CONNECT_ERR: trampoline(self.fileno(), write=True) - elif exc[0] in CONNECT_SUCCESS: + elif get_errno(exc) in CONNECT_SUCCESS: return else: raise @@ -233,10 +233,10 @@ class GreenSSLSocket(__ssl.SSLSocket): try: real_connect(self, addr) except orig_socket.error, exc: - if exc[0] in CONNECT_ERR: + if get_errno(exc) in CONNECT_ERR: trampoline(self.fileno(), write=True, timeout=end-time.time(), timeout_exc=timeout_exc('timed out')) - elif exc[0] in CONNECT_SUCCESS: + elif get_errno(exc) in CONNECT_SUCCESS: return else: raise @@ -272,7 +272,7 @@ class GreenSSLSocket(__ssl.SSLSocket): set_nonblocking(newsock) break except orig_socket.error, e: - if e[0] != errno.EWOULDBLOCK: + if get_errno(e) != errno.EWOULDBLOCK: raise trampoline(self.fileno(), read=True, timeout=self.gettimeout(), timeout_exc=timeout_exc('timed out')) diff --git a/eventlet/greenio.py b/eventlet/greenio.py index e069a03..f5dfb7f 100644 --- a/eventlet/greenio.py +++ b/eventlet/greenio.py @@ -28,11 +28,11 @@ def get_errno(exc): socket.error in 3.x does not allow indexing access """ try: - return exc.errno - except AttributeError: + return exc.args[0] + except (TypeError,IndexError): try: - return exc[0] - except (TypeError,IndexError): + return exc.errno + except AttributeError: return None def socket_connect(descriptor, address): @@ -209,7 +209,7 @@ class GreenSocket(object): try: trampoline(fd, write=True) except socket.error, ex: - return ex[0] + return get_errno(ex) else: end = time.time() + self.gettimeout() while True: @@ -221,7 +221,7 @@ class GreenSocket(object): trampoline(fd, write=True, timeout=end-time.time(), timeout_exc=socket.timeout(errno.EAGAIN)) except socket.error, ex: - return ex[0] + return get_errno(ex) def dup(self, *args, **kw): sock = self.fd.dup(*args, **kw) @@ -266,9 +266,9 @@ class GreenSocket(object): try: return fd.recv(buflen, flags) except socket.error, e: - if e[0] in SOCKET_BLOCKING: + if get_errno(e) in SOCKET_BLOCKING: pass - elif e[0] in SOCKET_CLOSED: + elif get_errno(e) in SOCKET_CLOSED: return '' else: raise @@ -308,7 +308,7 @@ class GreenSocket(object): try: total_sent += fd.send(data[total_sent:], flags) except socket.error, e: - if e[0] not in SOCKET_BLOCKING: + if get_errno(e) not in SOCKET_BLOCKING: raise if total_sent == len_data: @@ -392,10 +392,10 @@ class GreenPipe(object): try: return fd.read(buflen) except IOError, e: - if e[0] != errno.EAGAIN: + if get_errno(e) != errno.EAGAIN: return '' except socket.error, e: - if e[0] == errno.EPIPE: + if get_errno(e) == errno.EPIPE: return '' raise trampoline(fd, read=True) @@ -424,13 +424,13 @@ class GreenPipe(object): fd.flush() return len(data) except IOError, e: - if e[0] != errno.EAGAIN: + if get_errno(e) != errno.EAGAIN: raise except ValueError, e: # what's this for? pass except socket.error, e: - if e[0] != errno.EPIPE: + if get_errno(e) != errno.EPIPE: raise trampoline(fd, write=True) @@ -531,7 +531,7 @@ def shutdown_safe(sock): except socket.error, e: # we don't care if the socket is already closed; # this will often be the case in an http server context - if e[0] != errno.ENOTCONN: + if get_errno(e) != errno.ENOTCONN: raise diff --git a/tests/greenio_test.py b/tests/greenio_test.py index 7afda9c..8a3e019 100644 --- a/tests/greenio_test.py +++ b/tests/greenio_test.py @@ -41,7 +41,7 @@ class TestGreenIo(LimitedTestCase): self.assertEqual(e.args[0], 'timed out') except socket.error, e: # unreachable is also a valid outcome - if not e[0] in (errno.EHOSTUNREACH, errno.ENETUNREACH): + if not get_errno(e) in (errno.EHOSTUNREACH, errno.ENETUNREACH): raise def test_accept_timeout(self): From cac3d24f2fdc47d96829a4d9a86b999e2cc968b3 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Sat, 27 Feb 2010 17:59:50 -0800 Subject: [PATCH 5/6] Conditional import of attributes. --- eventlet/green/socket.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/eventlet/green/socket.py b/eventlet/green/socket.py index aeadc0d..eaba5ba 100644 --- a/eventlet/green/socket.py +++ b/eventlet/green/socket.py @@ -14,14 +14,20 @@ import warnings __patched__ = ['fromfd', 'socketpair', 'gethostbyname', 'create_connection', 'ssl', 'socket'] -__original_fromfd__ = __socket.fromfd -def fromfd(*args): - return socket(__original_fromfd__(*args)) +try: + __original_fromfd__ = __socket.fromfd + def fromfd(*args): + return socket(__original_fromfd__(*args)) +except AttributeError: + pass -__original_socketpair__ = __socket.socketpair -def socketpair(*args): - one, two = __original_socketpair__(*args) - return socket(one), socket(two) +try: + __original_socketpair__ = __socket.socketpair + def socketpair(*args): + one, two = __original_socketpair__(*args) + return socket(one), socket(two) +except AttributeError: + pass __original_gethostbyname__ = __socket.gethostbyname def gethostbyname(name): From 44b615c8d3a672890c9d930e553a6eedc6b04d5a Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Sat, 27 Feb 2010 19:09:55 -0800 Subject: [PATCH 6/6] amajorek's commit reminded me that we need the non-monkeypatched thread module here. --- eventlet/green/profile.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/eventlet/green/profile.py b/eventlet/green/profile.py index 5759d75..7f8fb6b 100644 --- a/eventlet/green/profile.py +++ b/eventlet/green/profile.py @@ -36,10 +36,11 @@ for var in profile_orig.__all__: import new import sys import traceback -thread = __import__('thread') # Original module needed. 2to3 translated import thread as from . import thread import functools from eventlet import greenthread +from eventlet import patcher +thread = patcher.original('thread') # non-monkeypatched module needed #This class provides the start() and stop() functions class Profile(profile_orig.Profile):