Author: Armin Rigo <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit