Author: Benjamin Peterson <benja...@python.org> Branch: Changeset: r53309:07dbab355581 Date: 2012-03-11 19:18 -0700 http://bitbucket.org/pypy/pypy/changeset/07dbab355581/
Log: properly save and restore errno state as thread local diff --git a/lib_pypy/_ctypes/builtin.py b/lib_pypy/_ctypes/builtin.py --- a/lib_pypy/_ctypes/builtin.py +++ b/lib_pypy/_ctypes/builtin.py @@ -31,24 +31,20 @@ arg = cobj._get_buffer_value() return _rawffi.wcharp2rawunicode(arg, lgt) -class ErrorObject(local): - def __init__(self): - self.errno = 0 - self.winerror = 0 -_error_object = ErrorObject() +_err = local() def get_errno(): - return _error_object.errno + return getattr(_err, "errno", 0) def set_errno(errno): - old_errno = _error_object.errno - _error_object.errno = errno + old_errno = get_errno() + _err.errno = errno return old_errno def get_last_error(): - return _error_object.winerror + return getattr(_err, "winerror", 0) def set_last_error(winerror): - old_winerror = _error_object.winerror - _error_object.winerror = winerror + old_winerror = get_last_error() + _err.winerror = winerror return old_winerror diff --git a/lib_pypy/_ctypes/function.py b/lib_pypy/_ctypes/function.py --- a/lib_pypy/_ctypes/function.py +++ b/lib_pypy/_ctypes/function.py @@ -3,7 +3,7 @@ from _ctypes.primitive import SimpleType, _SimpleCData from _ctypes.basics import ArgumentError, keepalive_key from _ctypes.basics import is_struct_shape -from _ctypes.builtin import set_errno, set_last_error +from _ctypes.builtin import get_errno, set_errno, get_last_error, set_last_error import _rawffi import _ffi import sys @@ -350,16 +350,24 @@ def _call_funcptr(self, funcptr, *newargs): if self._flags_ & _rawffi.FUNCFLAG_USE_ERRNO: - set_errno(_rawffi.get_errno()) + tmp = _rawffi.get_errno() + _rawffi.set_errno(get_errno()) + set_errno(tmp) if self._flags_ & _rawffi.FUNCFLAG_USE_LASTERROR: - set_last_error(_rawffi.get_last_error()) + tmp = _rawffi.get_last_error() + _rawffi.set_last_error(get_last_error()) + set_last_error(tmp) try: result = funcptr(*newargs) finally: if self._flags_ & _rawffi.FUNCFLAG_USE_ERRNO: - set_errno(_rawffi.get_errno()) + tmp = _rawffi.get_errno() + _rawffi.set_errno(get_errno()) + set_errno(tmp) if self._flags_ & _rawffi.FUNCFLAG_USE_LASTERROR: - set_last_error(_rawffi.get_last_error()) + tmp = _rawffi.get_last_error() + _rawffi.set_last_error(get_last_error()) + set_last_error(tmp) # try: return self._build_result(self._restype_, result, newargs) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit