Added clear_sysy_exc_info to eventlet.common.
Portable clearing of last exception information - No-op in 3.x and ys.exc_clear in 2.x
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
import sys
|
||||||
def get_errno(exc):
|
def get_errno(exc):
|
||||||
""" Get the error code out of socket.error objects.
|
""" Get the error code out of socket.error objects.
|
||||||
socket.error in <2.5 does not have errno attribute
|
socket.error in <2.5 does not have errno attribute
|
||||||
@@ -17,3 +18,11 @@ def get_errno(exc):
|
|||||||
except IndexError:
|
except IndexError:
|
||||||
return None
|
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
|
||||||
|
@@ -2,18 +2,12 @@ import heapq
|
|||||||
import sys
|
import sys
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
|
from eventlet.common import clear_sys_exc_info
|
||||||
from eventlet.support import greenlets as greenlet
|
from eventlet.support import greenlets as greenlet
|
||||||
from eventlet.hubs import timer
|
from eventlet.hubs import timer
|
||||||
from eventlet import patcher
|
from eventlet import patcher
|
||||||
time = patcher.original('time')
|
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"
|
READ="read"
|
||||||
WRITE="write"
|
WRITE="write"
|
||||||
|
|
||||||
@@ -110,7 +104,7 @@ class BaseHub(object):
|
|||||||
switch_out()
|
switch_out()
|
||||||
except:
|
except:
|
||||||
self.squelch_generic_exception(sys.exc_info())
|
self.squelch_generic_exception(sys.exc_info())
|
||||||
sys.exc_clear()
|
clear_sys_exc_info()
|
||||||
if self.greenlet.dead:
|
if self.greenlet.dead:
|
||||||
self.greenlet = greenlet.greenlet(self.run)
|
self.greenlet = greenlet.greenlet(self.run)
|
||||||
try:
|
try:
|
||||||
@@ -118,7 +112,7 @@ class BaseHub(object):
|
|||||||
cur.parent = self.greenlet
|
cur.parent = self.greenlet
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass # gets raised if there is a greenlet parent cycle
|
pass # gets raised if there is a greenlet parent cycle
|
||||||
sys_exc_clear()
|
clear_sys_exc_info()
|
||||||
return self.greenlet.switch()
|
return self.greenlet.switch()
|
||||||
|
|
||||||
def squelch_exception(self, fileno, exc_info):
|
def squelch_exception(self, fileno, exc_info):
|
||||||
@@ -257,7 +251,7 @@ class BaseHub(object):
|
|||||||
raise
|
raise
|
||||||
except:
|
except:
|
||||||
self.squelch_timer_exception(timer, sys.exc_info())
|
self.squelch_timer_exception(timer, sys.exc_info())
|
||||||
sys.exc_clear()
|
clear_sys_exc_info()
|
||||||
finally:
|
finally:
|
||||||
self.timer_finished(timer)
|
self.timer_finished(timer)
|
||||||
|
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import sys
|
import sys
|
||||||
import errno
|
import errno
|
||||||
from eventlet import patcher
|
from eventlet import patcher
|
||||||
from eventlet.common import get_errno
|
from eventlet.common import get_errno, clear_sys_exc_info
|
||||||
select = patcher.original('select')
|
select = patcher.original('select')
|
||||||
time = patcher.original('time')
|
time = patcher.original('time')
|
||||||
|
|
||||||
@@ -58,4 +58,4 @@ class Hub(BaseHub):
|
|||||||
raise
|
raise
|
||||||
except:
|
except:
|
||||||
self.squelch_exception(fileno, sys.exc_info())
|
self.squelch_exception(fileno, sys.exc_info())
|
||||||
sys.exc_clear()
|
clear_sys_exc_info()
|
||||||
|
@@ -4,6 +4,7 @@ are not leaked by the hub.
|
|||||||
import sys
|
import sys
|
||||||
import unittest
|
import unittest
|
||||||
from pprint import pformat
|
from pprint import pformat
|
||||||
|
from eventlet.common import clear_sys_exc_info
|
||||||
from eventlet.green import socket
|
from eventlet.green import socket
|
||||||
from eventlet.green.thread import start_new_thread
|
from eventlet.green.thread import start_new_thread
|
||||||
from eventlet.green.time import sleep
|
from eventlet.green.time import sleep
|
||||||
@@ -61,7 +62,7 @@ def run_interaction(run_client):
|
|||||||
|
|
||||||
def run_and_check(run_client):
|
def run_and_check(run_client):
|
||||||
w = run_interaction(run_client=run_client)
|
w = run_interaction(run_client=run_client)
|
||||||
sys.exc_clear()
|
clear_sys_exc_info()
|
||||||
if w():
|
if w():
|
||||||
print pformat(gc.get_referrers(w()))
|
print pformat(gc.get_referrers(w()))
|
||||||
for x in gc.get_referrers(w()):
|
for x in gc.get_referrers(w()):
|
||||||
|
Reference in New Issue
Block a user