]> git.ipfire.org Git - thirdparty/Python/cpython.git/commit
Issue #1798: Add ctypes calling convention that allows safe access to
authorThomas Heller <theller@ctypes.org>
Wed, 4 Jun 2008 18:59:03 +0000 (18:59 +0000)
committerThomas Heller <theller@ctypes.org>
Wed, 4 Jun 2008 18:59:03 +0000 (18:59 +0000)
commite70c3378c039cae30cd9ae559c4bdeb923254c43
tree5977a09a2cd5bbe4aa3ff6bb52b4b554c179097a
parenta2b34b87a94871999c78f343773ccf0f8c545932
Issue #1798: Add ctypes calling convention that allows safe access to
errno (and LastError, on Windows).

ctypes maintains a module-global, but thread-local, variable that
contains an error number; called 'ctypes_errno' for this discussion.
This variable is a private copy of the systems 'errno' value; the copy
is swapped with the 'errno' variable on several occasions.

Foreign functions created with CDLL(..., use_errno=True), when called,
swap the values just before the actual function call, and swapped
again immediately afterwards.  The 'use_errno' parameter defaults to
False, in this case 'ctypes_errno' is not touched.

The values are also swapped immeditately before and after ctypes
callback functions are called, if the callbacks are constructed using
the new optional use_errno parameter set to True: CFUNCTYPE(..., use_errno=TRUE)
or WINFUNCTYPE(..., use_errno=True).

Two new ctypes functions are provided to access the 'ctypes_errno'
value from Python:

- ctypes.set_errno(value) sets ctypes_errno to 'value', the previous
  ctypes_errno value is returned.

- ctypes.get_errno() returns the current ctypes_errno value.

---

On Windows, the same scheme is implemented for the error value which
is managed by the GetLastError() and SetLastError() windows api calls.

The ctypes functions are 'ctypes.set_last_error(value)' and
'ctypes.get_last_error()', the CDLL and WinDLL optional parameter is
named 'use_last_error', defaults to False.

---

On Windows, TlsSetValue and TlsGetValue calls are used to provide
thread local storage for the variables; ctypes compiled with __GNUC__
uses __thread variables.
Lib/ctypes/__init__.py
Lib/ctypes/test/test_errno.py [new file with mode: 0644]
Misc/NEWS
Modules/_ctypes/_ctypes.c
Modules/_ctypes/callbacks.c
Modules/_ctypes/callproc.c
Modules/_ctypes/ctypes.h