[pypy-commit] cffi default: Windows: don't muck with LastError in b_get_errno()

arigo noreply at buildbot.pypy.org
Wed Aug 22 18:56:22 CEST 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r869:af978ad0a0a8
Date: 2012-08-22 18:55 +0200
http://bitbucket.org/cffi/cffi/changeset/af978ad0a0a8/

Log:	Windows: don't muck with LastError in b_get_errno() and
	b_set_errno()

diff --git a/c/_cffi_backend.c b/c/_cffi_backend.c
--- a/c/_cffi_backend.c
+++ b/c/_cffi_backend.c
@@ -197,6 +197,8 @@
 # else
 #  include "misc_thread.h"
 # endif
+# define save_errno_only      save_errno
+# define restore_errno_only   restore_errno
 #endif
 
 #ifdef HAVE_WCHAR_H
@@ -4044,7 +4046,7 @@
 static PyObject *b_get_errno(PyObject *self, PyObject *noarg)
 {
     int err;
-    restore_errno();
+    restore_errno_only();
     err = errno;
     errno = 0;
     return PyInt_FromLong(err);
@@ -4056,7 +4058,7 @@
     if (!PyArg_ParseTuple(args, "i:set_errno", &i))
         return NULL;
     errno = i;
-    save_errno();
+    save_errno_only();
     errno = 0;
     Py_INCREF(Py_None);
     return Py_None;
diff --git a/c/misc_win32.h b/c/misc_win32.h
--- a/c/misc_win32.h
+++ b/c/misc_win32.h
@@ -45,6 +45,18 @@
     /* else: cannot report the error */
 }
 
+static void save_errno_only(void)
+{
+    int current_err = errno;
+    struct cffi_errno_s *p;
+
+    p = _geterrno_object();
+    if (p != NULL) {
+        p->saved_errno = current_err;
+    }
+    /* else: cannot report the error */
+}
+
 static void restore_errno(void)
 {
     struct cffi_errno_s *p;
@@ -57,6 +69,16 @@
     /* else: cannot report the error */
 }
 
+static void restore_errno_only(void)
+{
+    struct cffi_errno_s *p;
+
+    p = _geterrno_object();
+    if (p != NULL) {
+        errno = p->saved_errno;
+    }
+    /* else: cannot report the error */
+}
 
 /************************************************************/
 /* Emulate dlopen()&co. from the Windows API */


More information about the pypy-commit mailing list