Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r74753:0331b21a1685 Date: 2014-11-28 14:51 +0100 http://bitbucket.org/pypy/pypy/changeset/0331b21a1685/
Log: Support threadlocalref_{addr,get} when running on the llinterp too. diff --git a/rpython/jit/metainterp/test/test_threadlocal.py b/rpython/jit/metainterp/test/test_threadlocal.py --- a/rpython/jit/metainterp/test/test_threadlocal.py +++ b/rpython/jit/metainterp/test/test_threadlocal.py @@ -11,10 +11,11 @@ tlfield = rthread.ThreadLocalField(lltype.Signed, 'foobar_test_') def f(): + tlfield.setraw(0x544c) return tlfield.getraw() res = self.interp_operations(f, []) - assert res == 0x544c # magic value returned by llinterp + assert res == 0x544c class TestLLtype(ThreadLocalTest, LLJitMixin): diff --git a/rpython/rlib/rthread.py b/rpython/rlib/rthread.py --- a/rpython/rlib/rthread.py +++ b/rpython/rlib/rthread.py @@ -286,11 +286,13 @@ _threadlocalref_seeme(self) return llop.threadlocalref_get(FIELDTYPE, offset) + @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) + @jit.dont_look_inside def setraw(value): _threadlocalref_seeme(self) addr = llop.threadlocalref_addr(llmemory.Address) diff --git a/rpython/rlib/test/test_rthread.py b/rpython/rlib/test/test_rthread.py --- a/rpython/rlib/test/test_rthread.py +++ b/rpython/rlib/test/test_rthread.py @@ -52,6 +52,18 @@ assert get_ident() == thread.get_ident() +def test_threadlocalref_on_llinterp(): + from rpython.rtyper.test.test_llinterp import interpret + tlfield = ThreadLocalField(lltype.Signed, "rthread_test_") + # + def f(): + x = tlfield.setraw(42) + return tlfield.getraw() + # + res = interpret(f, []) + assert res == 42 + + class AbstractThreadTests(AbstractGCTestClass): use_threads = True diff --git a/rpython/rtyper/llinterp.py b/rpython/rtyper/llinterp.py --- a/rpython/rtyper/llinterp.py +++ b/rpython/rtyper/llinterp.py @@ -133,6 +133,19 @@ for line in lines: log.traceback(line) + def get_tlobj(self): + try: + return self._tlobj + except AttributeError: + from rpython.rtyper.lltypesystem import rffi + PERRNO = rffi.CArrayPtr(rffi.INT) + fake_p_errno = lltype.malloc(PERRNO.TO, 1, flavor='raw', zero=True, + track_allocation=False) + self._tlobj = {'RPY_TLOFS_p_errno': fake_p_errno, + #'thread_ident': ..., + } + return self._tlobj + def find_roots(self): """Return a list of the addresses of the roots.""" #log.findroots("starting") @@ -920,13 +933,11 @@ return 0 def op_threadlocalref_addr(self): - raise NotImplementedError("threadlocalref_addr") + return _address_of_thread_local() - def op_threadlocalref_get(self, offset): - if (type(offset) is CDefinedIntSymbolic and - offset.expr == 'RPY_TLOFS_foobar_test_'): # used in tests - return 0x544c - raise NotImplementedError("threadlocalref_get") + def op_threadlocalref_get(self, RESTYPE, offset): + return self.op_raw_load(RESTYPE, _address_of_thread_local(), offset) + op_threadlocalref_get.need_result_type = True # __________________________________________________________ # operations on addresses @@ -973,9 +984,9 @@ ll_p = rffi.cast(rffi.CArrayPtr(RESTYPE), rffi.ptradd(ll_p, offset)) value = ll_p[0] - ## elif getattr(addr, 'is_fake_thread_local_addr', False): - ## assert type(offset) is CDefinedIntSymbolic - ## value = self.llinterpreter.tlobj[offset.expr] + elif getattr(addr, 'is_fake_thread_local_addr', False): + assert type(offset) is CDefinedIntSymbolic + value = self.llinterpreter.get_tlobj()[offset.expr] else: assert offset.TYPE == RESTYPE value = getattr(addr, str(RESTYPE).lower())[offset.repeat] @@ -996,9 +1007,9 @@ ll_p = rffi.cast(rffi.CArrayPtr(ARGTYPE), rffi.ptradd(ll_p, offset)) ll_p[0] = value - ## elif getattr(addr, 'is_fake_thread_local_addr', False): - ## assert type(offset) is CDefinedIntSymbolic - ## self.llinterpreter.tlobj[offset.expr] = value + elif getattr(addr, 'is_fake_thread_local_addr', False): + assert type(offset) is CDefinedIntSymbolic + self.llinterpreter.get_tlobj()[offset.expr] = value else: assert offset.TYPE == ARGTYPE getattr(addr, str(ARGTYPE).lower())[offset.repeat] = value @@ -1320,6 +1331,10 @@ return llmemory.fakeaddress(addr.ptr._obj._ptr) return addr +class _address_of_thread_local(object): + _TYPE = llmemory.Address + is_fake_thread_local_addr = True + # by default we route all logging messages to nothingness # e.g. tests can then switch on logging to get more help _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit