• Thomas Heller's avatar
    Issue #1798: Add ctypes calling convention that allows safe access to · e70c3378
    Thomas Heller authored
    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.
    e70c3378
NEWS 85.9 KB