diff --git a/eventlet/common.py b/eventlet/common.py index 4710fd3..38b880b 100644 --- a/eventlet/common.py +++ b/eventlet/common.py @@ -1,3 +1,4 @@ +import sys def get_errno(exc): """ Get the error code out of socket.error objects. socket.error in <2.5 does not have errno attribute @@ -17,3 +18,11 @@ def get_errno(exc): except IndexError: return None +if sys.version_info[0]<3: + clear_sys_exc_info = sys.exc_clear +else: + def clear_sys_exc_info(): + """No-op In py3k. + Exception information is not visible outside of except statements. + sys.exc_clear became obsolete and removed.""" + pass diff --git a/eventlet/hubs/hub.py b/eventlet/hubs/hub.py index de11def..8be08a4 100644 --- a/eventlet/hubs/hub.py +++ b/eventlet/hubs/hub.py @@ -2,18 +2,12 @@ import heapq import sys import traceback +from eventlet.common import clear_sys_exc_info from eventlet.support import greenlets as greenlet 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 +104,7 @@ class BaseHub(object): switch_out() except: self.squelch_generic_exception(sys.exc_info()) - sys.exc_clear() + clear_sys_exc_info() if self.greenlet.dead: self.greenlet = greenlet.greenlet(self.run) try: @@ -118,7 +112,7 @@ class BaseHub(object): cur.parent = self.greenlet except ValueError: pass # gets raised if there is a greenlet parent cycle - sys_exc_clear() + clear_sys_exc_info() return self.greenlet.switch() def squelch_exception(self, fileno, exc_info): @@ -257,7 +251,7 @@ class BaseHub(object): raise except: self.squelch_timer_exception(timer, sys.exc_info()) - sys.exc_clear() + clear_sys_exc_info() finally: self.timer_finished(timer) diff --git a/eventlet/hubs/selects.py b/eventlet/hubs/selects.py index f84e29a..bbd84b7 100644 --- a/eventlet/hubs/selects.py +++ b/eventlet/hubs/selects.py @@ -1,7 +1,7 @@ import sys import errno from eventlet import patcher -from eventlet.common import get_errno +from eventlet.common import get_errno, clear_sys_exc_info select = patcher.original('select') time = patcher.original('time') @@ -58,4 +58,4 @@ class Hub(BaseHub): raise except: self.squelch_exception(fileno, sys.exc_info()) - sys.exc_clear() + clear_sys_exc_info() diff --git a/tests/test__refcount.py b/tests/test__refcount.py index b5306dc..553971a 100644 --- a/tests/test__refcount.py +++ b/tests/test__refcount.py @@ -4,6 +4,7 @@ are not leaked by the hub. import sys import unittest from pprint import pformat +from eventlet.common import clear_sys_exc_info from eventlet.green import socket from eventlet.green.thread import start_new_thread from eventlet.green.time import sleep @@ -61,7 +62,7 @@ def run_interaction(run_client): def run_and_check(run_client): w = run_interaction(run_client=run_client) - sys.exc_clear() + clear_sys_exc_info() if w(): print pformat(gc.get_referrers(w())) for x in gc.get_referrers(w()):