Author: Armin Rigo <ar...@tunes.org>
Branch: errno-again
Changeset: r75327:abcf3346ba45
Date: 2015-01-14 18:18 +0100
http://bitbucket.org/pypy/pypy/changeset/abcf3346ba45/

Log:    in-progress

diff --git a/rpython/jit/codewriter/jtransform.py 
b/rpython/jit/codewriter/jtransform.py
--- a/rpython/jit/codewriter/jtransform.py
+++ b/rpython/jit/codewriter/jtransform.py
@@ -1999,12 +1999,10 @@
                 or isinstance(RESTYPE, lltype.Ptr))
         c_offset, = op.args
         op1 = self.prepare_builtin_call(op, 'threadlocalref_get', [c_offset])
-        if c_offset.value.startswith('RPY_TLOFSLOOPINVARIANT_'):
+        if c_offset.value.loop_invariant:
             effect = EffectInfo.EF_LOOPINVARIANT
-        elif c_offset.value.startswith('RPY_TLOFS_'):
+        else:
             effect = EffectInfo.EF_CANNOT_RAISE
-        else:
-            assert 0
         return self.handle_residual_call(op1,
             oopspecindex=EffectInfo.OS_THREADLOCALREF_GET,
             extraeffect=effect)
diff --git a/rpython/jit/codewriter/test/test_jtransform.py 
b/rpython/jit/codewriter/test/test_jtransform.py
--- a/rpython/jit/codewriter/test/test_jtransform.py
+++ b/rpython/jit/codewriter/test/test_jtransform.py
@@ -160,7 +160,7 @@
             elif oopspecindex == EI.OS_RAW_FREE:
                 assert extraeffect == EI.EF_CANNOT_RAISE
             elif oopspecindex == EI.OS_THREADLOCALREF_GET:
-                assert extraeffect == EI.EF_LOOPINVARIANT
+                assert extraeffect == 
self.expected_effect_of_threadlocalref_get
             else:
                 assert extraeffect == EI.EF_ELIDABLE_CANNOT_RAISE
         return 'calldescr-%d' % oopspecindex
@@ -1342,14 +1342,19 @@
     assert op1.result is None
     assert op2 is None
 
-def test_threadlocalref_get():
+def _test_threadlocalref_get(loop_inv):
     from rpython.rlib.rthread import ThreadLocalField
-    tlfield = ThreadLocalField(lltype.Signed, 'foobar_test_')
+    tlfield = ThreadLocalField(lltype.Signed, 'foobar_test_',
+                               loop_invariant=loop_inv)
     OS_THREADLOCALREF_GET = effectinfo.EffectInfo.OS_THREADLOCALREF_GET
     c = const(tlfield.offset)
     v = varoftype(lltype.Signed)
     op = SpaceOperation('threadlocalref_get', [c], v)
-    tr = Transformer(FakeCPU(), FakeBuiltinCallControl())
+    cc = FakeBuiltinCallControl()
+    cc.expected_effect_of_threadlocalref_get = (
+        effectinfo.EffectInfo.EF_LOOPINVARIANT if loop_inv
+        else effectinfo.EffectInfo.EF_CANNOT_RAISE)
+    tr = Transformer(FakeCPU(), cc)
     op0 = tr.rewrite_operation(op)
     assert op0.opname == 'residual_call_ir_i'
     assert op0.args[0].value == 'threadlocalref_get' # pseudo-function as str
@@ -1358,6 +1363,12 @@
     assert op0.args[3] == 'calldescr-%d' % OS_THREADLOCALREF_GET
     assert op0.result == v
 
+def test_threadlocalref_get_no_loop_inv():
+    _test_threadlocalref_get(loop_inv=False)
+
+def test_threadlocalref_get_with_loop_inv():
+    _test_threadlocalref_get(loop_inv=True)
+
 def test_unknown_operation():
     op = SpaceOperation('foobar', [], varoftype(lltype.Void))
     tr = Transformer()
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
@@ -462,6 +462,9 @@
 if WIN32:
     WSAEVENT = cConfig.WSAEVENT
     WSANETWORKEVENTS = cConfig.WSANETWORKEVENTS
+    SAVE_ERR = rffi.RFFI_ERR_NONE
+else:
+    SAVE_ERR = rffi.RFFI_SAVE_ERRNO
 timeval = cConfig.timeval
 
 
@@ -474,7 +477,7 @@
                            calling_conv='c', **kwargs)
 
 if _POSIX:
-    dup = external('dup', [socketfd_type], socketfd_type)
+    dup = external('dup', [socketfd_type], socketfd_type, save_err=SAVE_ERR)
     gai_strerror = external('gai_strerror', [rffi.INT], CCHARP)
 
 #h_errno = c_int.in_dll(socketdll, 'h_errno')
@@ -486,11 +489,14 @@
 socket = external('socket', [rffi.INT, rffi.INT, rffi.INT], socketfd_type)
 
 if WIN32:
-    socketclose = external('closesocket', [socketfd_type], rffi.INT, 
releasegil=False)
+    socketclose = external('closesocket', [socketfd_type], rffi.INT,
+                           releasegil=False, save_err=SAVE_ERR)
 else:
-    socketclose = external('close', [socketfd_type], rffi.INT, 
releasegil=False)
+    socketclose = external('close', [socketfd_type], rffi.INT,
+                           releasegil=False, save_err=SAVE_ERR)
 
-socketconnect = external('connect', [socketfd_type, sockaddr_ptr, socklen_t], 
rffi.INT)
+socketconnect = external('connect', [socketfd_type, sockaddr_ptr, socklen_t],
+                         rffi.INT, save_err=SAVE_ERR)
 
 getaddrinfo = external('getaddrinfo', [CCHARP, CCHARP,
                         addrinfo_ptr,
@@ -518,36 +524,48 @@
 
 if _POSIX:
     inet_pton = external('inet_pton', [rffi.INT, rffi.CCHARP,
-                                              rffi.VOIDP], rffi.INT)
+                                       rffi.VOIDP], rffi.INT,
+                         save_err=SAVE_ERR)
 
     inet_ntop = external('inet_ntop', [rffi.INT, rffi.VOIDP, CCHARP,
-                                              socklen_t], CCHARP)
+                                       socklen_t], CCHARP,
+                         save_err=SAVE_ERR)
 
 inet_addr = external('inet_addr', [rffi.CCHARP], rffi.UINT)
 socklen_t_ptr = lltype.Ptr(rffi.CFixedArray(socklen_t, 1))
 socketaccept = external('accept', [socketfd_type, sockaddr_ptr,
-                              socklen_t_ptr], socketfd_type)
+                                   socklen_t_ptr], socketfd_type,
+                        save_err=SAVE_ERR)
 socketbind = external('bind', [socketfd_type, sockaddr_ptr, socklen_t],
-                              rffi.INT)
-socketlisten = external('listen', [socketfd_type, rffi.INT], rffi.INT)
+                              rffi.INT, save_err=SAVE_ERR)
+socketlisten = external('listen', [socketfd_type, rffi.INT], rffi.INT,
+                        save_err=SAVE_ERR)
 socketgetpeername = external('getpeername', [socketfd_type,
-                                    sockaddr_ptr, socklen_t_ptr], rffi.INT)
+                                    sockaddr_ptr, socklen_t_ptr], rffi.INT,
+                             save_err=SAVE_ERR)
 socketgetsockname = external('getsockname', [socketfd_type,
-                                   sockaddr_ptr, socklen_t_ptr], rffi.INT)
+                                   sockaddr_ptr, socklen_t_ptr], rffi.INT,
+                             save_err=SAVE_ERR)
 socketgetsockopt = external('getsockopt', [socketfd_type, rffi.INT,
-                               rffi.INT, rffi.VOIDP, socklen_t_ptr], rffi.INT)
+                               rffi.INT, rffi.VOIDP, socklen_t_ptr], rffi.INT,
+                            save_err=SAVE_ERR)
 socketsetsockopt = external('setsockopt', [socketfd_type, rffi.INT,
-                                   rffi.INT, rffi.VOIDP, socklen_t], rffi.INT)
+                                   rffi.INT, rffi.VOIDP, socklen_t], rffi.INT,
+                            save_err=SAVE_ERR)
 socketrecv = external('recv', [socketfd_type, rffi.VOIDP, rffi.INT,
-                                      rffi.INT], ssize_t)
+                               rffi.INT], ssize_t, save_err=SAVE_ERR)
 recvfrom = external('recvfrom', [socketfd_type, rffi.VOIDP, size_t,
-                           rffi.INT, sockaddr_ptr, socklen_t_ptr], rffi.INT)
+                           rffi.INT, sockaddr_ptr, socklen_t_ptr], rffi.INT,
+                    save_err=SAVE_ERR)
 send = external('send', [socketfd_type, rffi.CCHARP, size_t, rffi.INT],
-                       ssize_t)
+                       ssize_t, save_err=SAVE_ERR)
 sendto = external('sendto', [socketfd_type, rffi.VOIDP, size_t, rffi.INT,
-                                    sockaddr_ptr, socklen_t], ssize_t)
-socketshutdown = external('shutdown', [socketfd_type, rffi.INT], rffi.INT)
-gethostname = external('gethostname', [rffi.CCHARP, rffi.INT], rffi.INT)
+                                    sockaddr_ptr, socklen_t], ssize_t,
+                  save_err=SAVE_ERR)
+socketshutdown = external('shutdown', [socketfd_type, rffi.INT], rffi.INT,
+                          save_err=SAVE_ERR)
+gethostname = external('gethostname', [rffi.CCHARP, rffi.INT], rffi.INT,
+                       save_err=SAVE_ERR)
 gethostbyname = external('gethostbyname', [rffi.CCHARP],
                                 lltype.Ptr(cConfig.hostent))
 gethostbyaddr = external('gethostbyaddr', [rffi.VOIDP, rffi.INT, rffi.INT], 
lltype.Ptr(cConfig.hostent))
@@ -559,7 +577,8 @@
     fcntl = external('fcntl', [socketfd_type, rffi.INT, rffi.INT], rffi.INT)
     socketpair_t = rffi.CArray(socketfd_type)
     socketpair = external('socketpair', [rffi.INT, rffi.INT, rffi.INT,
-                          lltype.Ptr(socketpair_t)], rffi.INT)
+                          lltype.Ptr(socketpair_t)], rffi.INT,
+                          save_err=SAVE_ERR)
     if _HAS_AF_PACKET:
         ioctl = external('ioctl', [socketfd_type, rffi.INT, lltype.Ptr(ifreq)],
                          rffi.INT)
@@ -572,7 +591,8 @@
 select = external('select',
                   [rffi.INT, fd_set, fd_set,
                    fd_set, lltype.Ptr(timeval)],
-                  rffi.INT)
+                  rffi.INT,
+                  save_err=SAVE_ERR)
 
 FD_CLR = external_c('FD_CLR', [rffi.INT, fd_set], lltype.Void, macro=True)
 FD_ISSET = external_c('FD_ISSET', [rffi.INT, fd_set], rffi.INT, macro=True)
@@ -582,7 +602,7 @@
 if _POSIX:
     pollfdarray = rffi.CArray(pollfd)
     poll = external('poll', [lltype.Ptr(pollfdarray), nfds_t, rffi.INT],
-                    rffi.INT)
+                    rffi.INT, save_err=SAVE_ERR)
     # workaround for Mac OS/X on which poll() seems to behave a bit strangely
     # (see test_recv_send_timeout in pypy.module._socket.test.test_sock_app)
     # https://issues.apache.org/bugzilla/show_bug.cgi?id=34332
@@ -626,12 +646,12 @@
     WSADuplicateSocket = external('WSADuplicateSocketA',
                                   [socketfd_type, rwin32.DWORD,
                                    lltype.Ptr(WSAPROTOCOL_INFO)],
-                                  rffi.INT)
+                                  rffi.INT, save_err=SAVE_ERR)
     WSASocket = external('WSASocketA',
                          [rffi.INT, rffi.INT, rffi.INT,
                           lltype.Ptr(WSAPROTOCOL_INFO),
                           rwin32.DWORD, rwin32.DWORD],
-                         socketfd_type)
+                         socketfd_type, save_err=save_err)
 
 if WIN32:
     WSAData = cConfig.WSAData
@@ -657,7 +677,7 @@
     MAX_FD_SIZE = None
 
 else:
-    from rpython.rlib.rposix import get_errno as geterrno
+    from rpython.rlib.rposix import get_saved_errno as geterrno
 
     socket_strerror_str = os.strerror
     def gai_strerror_str(errno):
diff --git a/rpython/rlib/rthread.py b/rpython/rlib/rthread.py
--- a/rpython/rlib/rthread.py
+++ b/rpython/rlib/rthread.py
@@ -274,33 +274,40 @@
 class ThreadLocalField(object):
     def __init__(self, FIELDTYPE, fieldname, loop_invariant=False):
         "NOT_RPYTHON: must be prebuilt"
+        from thread import _local
         self.FIELDTYPE = FIELDTYPE
         self.fieldname = fieldname
-        self.loop_invariant = loop_invariant
-        if loop_invariant:
-            invariant = 'LOOPINVARIANT'
-        else:
-            invariant = ''
-        offset = CDefinedIntSymbolic('RPY_TLOFS%s_%s' % (invariant,
-                                                         self.fieldname),
+        self.local = _local()      # <- NOT_RPYTHON
+        zero = rffi.cast(FIELDTYPE, 0)
+        offset = CDefinedIntSymbolic('RPY_TLOFS_%s' % self.fieldname,
                                      default='?')
+        offset.loop_invariant = loop_invariant
         self.offset = offset
 
         def getraw():
-            _threadlocalref_seeme(self)
-            return llop.threadlocalref_get(FIELDTYPE, offset)
+            if we_are_translated():
+                _threadlocalref_seeme(self)
+                return llop.threadlocalref_get(FIELDTYPE, offset)
+            else:
+                return getattr(self.local, 'rawvalue', zero)
 
         @jit.dont_look_inside
         def get_or_make_raw():
-            _threadlocalref_seeme(self)
-            addr = llop.threadlocalref_addr(llmemory.Address)
-            return llop.raw_load(FIELDTYPE, addr, offset)
+            if we_are_translated():
+                _threadlocalref_seeme(self)
+                addr = llop.threadlocalref_addr(llmemory.Address)
+                return llop.raw_load(FIELDTYPE, addr, offset)
+            else:
+                return getattr(self.local, 'rawvalue', zero)
 
         @jit.dont_look_inside
         def setraw(value):
-            _threadlocalref_seeme(self)
-            addr = llop.threadlocalref_addr(llmemory.Address)
-            llop.raw_store(lltype.Void, addr, offset, value)
+            if we_are_translated():
+                _threadlocalref_seeme(self)
+                addr = llop.threadlocalref_addr(llmemory.Address)
+                llop.raw_store(lltype.Void, addr, offset, value)
+            else:
+                self.local.rawvalue = value
 
         self.getraw = getraw
         self.get_or_make_raw = get_or_make_raw
@@ -315,9 +322,7 @@
 
     def __init__(self, Cls, loop_invariant=False):
         "NOT_RPYTHON: must be prebuilt"
-        import thread
         self.Cls = Cls
-        self.local = thread._local()      # <- NOT_RPYTHON
         unique_id = ThreadLocalReference._COUNT
         ThreadLocalReference._COUNT += 1
         ThreadLocalField.__init__(self, lltype.Signed, 'tlref%d' % unique_id,
diff --git a/rpython/rtyper/lltypesystem/rffi.py 
b/rpython/rtyper/lltypesystem/rffi.py
--- a/rpython/rtyper/lltypesystem/rffi.py
+++ b/rpython/rtyper/lltypesystem/rffi.py
@@ -64,8 +64,8 @@
 RFFI_ZERO_ERRNO_BEFORE   = 4     # copy the value 0 into real errno before call
 RFFI_FULL_ERRNO          = RFFI_SAVE_ERRNO | RFFI_READSAVED_ERRNO
 RFFI_FULL_ERRNO_ZERO     = RFFI_SAVE_ERRNO | RFFI_ZERO_ERRNO_BEFORE
-RFFI_SAVE_LASTERROR      = 8
-RFFI_READSAVED_LASTERROR = 16
+RFFI_SAVE_LASTERROR      = 8     # XXX implement me!
+RFFI_READSAVED_LASTERROR = 16    # XXX implement me!
 RFFI_FULL_LASTERROR      = RFFI_SAVE_LASTERROR | RFFI_READSAVED_LASTERROR
 RFFI_ERR_NONE            = 0
 RFFI_ERR_ALL             = RFFI_FULL_ERRNO | RFFI_FULL_LASTERROR
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to