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