Author: Armin Rigo <ar...@tunes.org>
Branch: errno-again
Changeset: r75364:ecb186950165
Date: 2015-01-15 23:12 +0100
http://bitbucket.org/pypy/pypy/changeset/ecb186950165/

Log:    Can't call a function with save_err != 0 from a __del__

diff --git a/pypy/module/_multiprocessing/interp_semaphore.py 
b/pypy/module/_multiprocessing/interp_semaphore.py
--- a/pypy/module/_multiprocessing/interp_semaphore.py
+++ b/pypy/module/_multiprocessing/interp_semaphore.py
@@ -83,6 +83,8 @@
                          [rffi.CCHARP, rffi.INT, rffi.INT, rffi.UINT],
                          SEM_T, save_err=rffi.RFFI_SAVE_ERRNO)
     # sem_close is releasegil=False to be able to use it in the __del__
+    _sem_close_no_errno = external('sem_close', [SEM_T], rffi.INT,
+                                   releasegil=False)
     _sem_close = external('sem_close', [SEM_T], rffi.INT, releasegil=False,
                           save_err=rffi.RFFI_SAVE_ERRNO)
     _sem_unlink = external('sem_unlink', [rffi.CCHARP], rffi.INT,
@@ -328,7 +330,7 @@
         return sem
 
     def delete_semaphore(handle):
-        sem_close(handle)
+        _sem_close_no_errno(handle)
 
     def semlock_acquire(self, space, block, w_timeout):
         if not block:
diff --git a/pypy/module/select/interp_kqueue.py 
b/pypy/module/select/interp_kqueue.py
--- a/pypy/module/select/interp_kqueue.py
+++ b/pypy/module/select/interp_kqueue.py
@@ -3,7 +3,7 @@
 from pypy.interpreter.error import exception_from_saved_errno
 from pypy.interpreter.gateway import interp2app, unwrap_spec, WrappedDefault
 from pypy.interpreter.typedef import TypeDef, generic_new_descr, GetSetProperty
-from rpython.rlib._rsocket_rffi import socketclose
+from rpython.rlib._rsocket_rffi import socketclose_no_errno
 from rpython.rlib.rarithmetic import r_uint
 from rpython.rtyper.lltypesystem import rffi, lltype
 from rpython.rtyper.tool import rffi_platform
@@ -130,7 +130,7 @@
         if not self.get_closed():
             kqfd = self.kqfd
             self.kqfd = -1
-            socketclose(kqfd)
+            socketclose_no_errno(kqfd)
 
     def check_closed(self, space):
         if self.get_closed():
diff --git a/rpython/rlib/_rsocket_rffi.py b/rpython/rlib/_rsocket_rffi.py
--- a/rpython/rlib/_rsocket_rffi.py
+++ b/rpython/rlib/_rsocket_rffi.py
@@ -489,11 +489,13 @@
 socket = external('socket', [rffi.INT, rffi.INT, rffi.INT], socketfd_type)
 
 if WIN32:
-    socketclose = external('closesocket', [socketfd_type], rffi.INT,
-                           releasegil=False, save_err=SAVE_ERR)
+    socketclosename = 'closesocket'
 else:
-    socketclose = external('close', [socketfd_type], rffi.INT,
-                           releasegil=False, save_err=SAVE_ERR)
+    socketclosename = 'close'
+socketclose = external(socketclosename, [socketfd_type], rffi.INT,
+                       releasegil=False, save_err=SAVE_ERR)
+socketclose_no_errno = external(socketclosename, [socketfd_type], rffi.INT,
+                                releasegil=False)
 
 socketconnect = external('connect', [socketfd_type, sockaddr_ptr, socklen_t],
                          rffi.INT, save_err=SAVE_ERR)
diff --git a/rpython/rlib/rsocket.py b/rpython/rlib/rsocket.py
--- a/rpython/rlib/rsocket.py
+++ b/rpython/rlib/rsocket.py
@@ -517,7 +517,7 @@
         fd = self.fd
         if fd != _c.INVALID_SOCKET:
             self.fd = _c.INVALID_SOCKET
-            _c.socketclose(fd)
+            _c.socketclose_no_errno(fd)
 
     if hasattr(_c, 'fcntl'):
         def _setblocking(self, block):
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to