Author: Armin Rigo <[email protected]>
Branch: stm-gc
Changeset: r54414:0dbdf68abd87
Date: 2012-04-15 15:59 +0200
http://bitbucket.org/pypy/pypy/changeset/0dbdf68abd87/
Log: Transaction fixes.
diff --git a/pypy/rlib/debug.py b/pypy/rlib/debug.py
--- a/pypy/rlib/debug.py
+++ b/pypy/rlib/debug.py
@@ -6,6 +6,7 @@
def ll_assert(x, msg):
"""After translation to C, this becomes an RPyAssert."""
+ assert type(x) is bool, "bad type! got %r" % (type(x),)
assert x, msg
class Entry(ExtRegistryEntry):
diff --git a/pypy/rpython/memory/gc/stmgc.py b/pypy/rpython/memory/gc/stmgc.py
--- a/pypy/rpython/memory/gc/stmgc.py
+++ b/pypy/rpython/memory/gc/stmgc.py
@@ -123,6 +123,13 @@
self.main_thread_tls = StmGCTLS(self, in_main_thread=True)
self.main_thread_tls.start_transaction()
+ def setup_thread(self):
+ from pypy.rpython.memory.gc.stmtls import StmGCTLS
+ StmGCTLS(self, in_main_thread=False)
+
+ def teardown_thread(self):
+ self.get_tls().teardown_thread()
+
@always_inline
def get_tls(self):
from pypy.rpython.memory.gc.stmtls import StmGCTLS
@@ -228,6 +235,7 @@
self.get_tls().start_transaction()
def commit_transaction(self):
+ raise NotImplementedError
self.collector.commit_transaction()
@@ -325,6 +333,7 @@
return localobj
#
# Here, we need to really make a local copy
+ raise NotImplementedError
size = self.get_size(obj)
tls = self.collector.get_tls()
try:
@@ -390,6 +399,7 @@
"""Implement the common logic of id() and identityhash()
of an object, given as a GCREF.
"""
+ raise NotImplementedError
obj = llmemory.cast_ptr_to_adr(gcobj)
hdr = self.header(obj)
#
diff --git a/pypy/rpython/memory/gc/stmtls.py b/pypy/rpython/memory/gc/stmtls.py
--- a/pypy/rpython/memory/gc/stmtls.py
+++ b/pypy/rpython/memory/gc/stmtls.py
@@ -85,7 +85,7 @@
def cast_address_to_tls_object(tlsaddr):
if we_are_translated():
tls = llmemory.cast_adr_to_ptr(tlsaddr, base_ptr_lltype())
- return cast_base_ptr_to_instance(tls)
+ return cast_base_ptr_to_instance(StmGCTLS, tls)
else:
n = rffi.cast(lltype.Signed, tlsaddr)
return StmGCTLS.nontranslated_dict[n]
@@ -135,7 +135,8 @@
self.nursery_top = self.nursery_start + self.nursery_size
def local_nursery_is_empty(self):
- ll_assert(self.nursery_free, "local_nursery_is_empty: gc not running")
+ ll_assert(bool(self.nursery_free),
+ "local_nursery_is_empty: gc not running")
return self.nursery_free == self.nursery_start
# ------------------------------------------------------------
@@ -202,7 +203,7 @@
No more mallocs are allowed after this is called.
"""
- xxx
+ raise NotImplementedError
# ------------------------------------------------------------
@@ -242,7 +243,7 @@
obj = self.old_objects
self.old_objects = NULL
while obj:
- hdr = self.header(obj)
+ hdr = self.gc.header(obj)
hdr.tid |= GCFLAG_GLOBAL
obj = hdr.version
#
@@ -266,11 +267,8 @@
def collect_roots_from_stack(self):
- self.gc.root_walker.walk_roots(
- StmGCTLS._trace_drag_out1, # stack roots of the current thread
- None, # static in prebuilt non-gc
- None, # static in prebuilt gc
- self)
+ self.gc.root_walker.walk_current_stack_roots(
+ StmGCTLS._trace_drag_out1, self)
def _trace_drag_out1(self, root):
self._trace_drag_out(root, None)
diff --git a/pypy/rpython/memory/gctransform/framework.py
b/pypy/rpython/memory/gctransform/framework.py
--- a/pypy/rpython/memory/gctransform/framework.py
+++ b/pypy/rpython/memory/gctransform/framework.py
@@ -1374,19 +1374,16 @@
def walk_roots(self, collect_stack_root,
collect_static_in_prebuilt_nongc,
- collect_static_in_prebuilt_gc,
- arg=None):
+ collect_static_in_prebuilt_gc):
gcdata = self.gcdata
gc = self.gc
- if arg is None:
- arg = gc
if collect_static_in_prebuilt_nongc:
addr = gcdata.static_root_start
end = gcdata.static_root_nongcend
while addr != end:
result = addr.address[0]
if gc.points_to_valid_gc_object(result):
- collect_static_in_prebuilt_nongc(arg, result)
+ collect_static_in_prebuilt_nongc(gc, result)
addr += sizeofaddr
if collect_static_in_prebuilt_gc:
addr = gcdata.static_root_nongcend
@@ -1394,10 +1391,10 @@
while addr != end:
result = addr.address[0]
if gc.points_to_valid_gc_object(result):
- collect_static_in_prebuilt_gc(arg, result)
+ collect_static_in_prebuilt_gc(gc, result)
addr += sizeofaddr
if collect_stack_root:
- self.walk_stack_roots(collect_stack_root, arg) # abstract
+ self.walk_stack_roots(collect_stack_root) # abstract
def need_stacklet_support(self):
raise Exception("%s does not support stacklets" % (
diff --git a/pypy/rpython/memory/gctransform/stmframework.py
b/pypy/rpython/memory/gctransform/stmframework.py
--- a/pypy/rpython/memory/gctransform/stmframework.py
+++ b/pypy/rpython/memory/gctransform/stmframework.py
@@ -1,9 +1,11 @@
from pypy.rpython.memory.gctransform.framework import FrameworkGCTransformer
from pypy.rpython.memory.gctransform.framework import BaseRootWalker
from pypy.rpython.memory.gctransform.framework import sizeofaddr
-from pypy.rpython.lltypesystem import llmemory
+from pypy.rpython.lltypesystem import lltype, llmemory
from pypy.annotation import model as annmodel
from pypy.rlib.debug import fatalerror_notb
+from pypy.rlib.nonconst import NonConstant
+from pypy.rlib.objectmodel import specialize
class StmFrameworkGCTransformer(FrameworkGCTransformer):
@@ -33,11 +35,11 @@
self.gcdata.gc.stm_normalize_global,
[annmodel.SomeAddress()], annmodel.SomeAddress())
self.stm_enter_transactional_mode_ptr = getfn(
- self.gcdata.gc.enter_transactional_mode.im_func
- [s_sc], annmodel.s_None)
+ self.gcdata.gc.enter_transactional_mode.im_func,
+ [s_gc], annmodel.s_None)
self.stm_leave_transactional_mode_ptr = getfn(
- self.gcdata.gc.leave_transactional_mode.im_func
- [s_sc], annmodel.s_None)
+ self.gcdata.gc.leave_transactional_mode.im_func,
+ [s_gc], annmodel.s_None)
self.stm_start_ptr = getfn(
self.gcdata.gc.start_transaction.im_func,
[s_gc], annmodel.s_None)
@@ -110,7 +112,8 @@
self.decr_stack = decr_stack
root_iterator = shadowstack.get_root_iterator(gctransformer)
- def walk_stack_root(callback, start, end):
+ @specialize.argtype(1)
+ def walk_stack_root(callback, arg, start, end):
root_iterator.setcontext(NonConstant(llmemory.NULL))
gc = self.gc
addr = end
@@ -118,7 +121,7 @@
addr = root_iterator.nextleft(gc, start, addr)
if addr == llmemory.NULL:
return
- callback(gc, addr)
+ callback(arg, addr)
self.rootstackhook = walk_stack_root
rsd = gctransformer.root_stack_depth
@@ -143,10 +146,18 @@
llmemory.raw_free(base)
def walk_stack_roots(self, collect_stack_root):
+ raise NotImplementedError
# XXX only to walk the main thread's shadow stack, so far
stackgcdata = self.stackgcdata
if self.gcdata.main_thread_stack_base != stackgcdata.root_stack_base:
fatalerror_notb("XXX not implemented: walk_stack_roots in thread")
- self.rootstackhook(collect_stack_root,
+ self.rootstackhook(collect_stack_root, self.gcdata.gc,
stackgcdata.root_stack_base,
stackgcdata.root_stack_top)
+
+ @specialize.argtype(2)
+ def walk_current_stack_roots(self, collect_stack_root, arg):
+ stackgcdata = self.stackgcdata
+ self.rootstackhook(collect_stack_root, arg,
+ stackgcdata.root_stack_base,
+ stackgcdata.root_stack_top)
diff --git a/pypy/rpython/memory/gctypelayout.py
b/pypy/rpython/memory/gctypelayout.py
--- a/pypy/rpython/memory/gctypelayout.py
+++ b/pypy/rpython/memory/gctypelayout.py
@@ -433,7 +433,11 @@
# local data structure. We assume that objects are stored
# only temporarily there, so it is always cleared at the point
# where we collect the roots.
- assert TYPE._name == 'ExcData'
+ if TYPE._name == 'ExcData':
+ return
+ # Some other thread-local data don't have any GC pointers
+ # themselves. These are fine.
+ assert list(gc_pointers_inside(value, adr)) == []
return
else:
appendto = self.addresses_of_static_ptrs_in_nongc
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit