Author: Armin Rigo <[email protected]>
Branch: gc-del-3
Changeset: r84183:96fc68198993
Date: 2016-05-03 23:32 +0200
http://bitbucket.org/pypy/pypy/changeset/96fc68198993/
Log: Mess
diff --git a/rpython/memory/gc/base.py b/rpython/memory/gc/base.py
--- a/rpython/memory/gc/base.py
+++ b/rpython/memory/gc/base.py
@@ -6,9 +6,6 @@
from rpython.memory.support import DEFAULT_CHUNK_SIZE
from rpython.memory.support import get_address_stack, get_address_deque
from rpython.memory.support import AddressDict, null_address_dict
-from rpython.memory.support import make_list_of_nongc_instances
-from rpython.memory.support import list_set_nongc_instance
-from rpython.memory.support import list_get_nongc_instance
from rpython.rtyper.lltypesystem.llmemory import NULL, raw_malloc_usage
TYPEID_MAP = lltype.GcStruct('TYPEID_MAP', ('count', lltype.Signed),
@@ -36,31 +33,14 @@
self.config = config
assert isinstance(translated_to_c, bool)
self.translated_to_c = translated_to_c
- self.run_finalizer_queues = make_list_of_nongc_instances(0)
def setup(self):
# all runtime mutable values' setup should happen here
# and in its overriden versions! for the benefit of test_transformed_gc
self.finalizer_lock = False
- def register_finalizer_index(self, fq, index):
- "NOT_RPYTHON"
- if len(self.run_finalizer_queues) <= index:
- array = make_list_of_nongc_instances(index + 1)
- for i in range(len(self.run_finalizer_queues)):
- array[i] = self.run_finalizer_queues[i]
- self.run_finalizer_queues = array
- #
- fdold = list_get_nongc_instance(self.AddressDeque,
- self.run_finalizer_queues, index)
- list_set_nongc_instance(self.run_finalizer_queues, index,
- self.AddressDeque())
- if fdold is not None:
- fdold.delete()
-
def mark_finalizer_to_run(self, fq_index, obj):
- fdeque = list_get_nongc_instance(self.AddressDeque,
- self.run_finalizer_queues, fq_index)
+ fdeque = self.get_run_finalizer_queue(self.AddressDeque, fq_index)
fdeque.append(obj)
def post_setup(self):
@@ -85,6 +65,7 @@
def set_query_functions(self, is_varsize, has_gcptr_in_varsize,
is_gcarrayofgcptr,
finalizer_trigger,
+ get_run_finalizer_queue,
destructor_or_custom_trace,
offsets_to_gc_pointers,
fixed_size, varsize_item_sizes,
@@ -99,6 +80,7 @@
has_gcptr,
cannot_pin):
self.finalizer_trigger = finalizer_trigger
+ self.get_run_finalizer_queue = get_run_finalizer_queue
self.destructor_or_custom_trace = destructor_or_custom_trace
self.is_varsize = is_varsize
self.has_gcptr_in_varsize = has_gcptr_in_varsize
@@ -351,11 +333,11 @@
def enum_pending_finalizers(self, callback, arg):
i = 0
- while i < len(self.run_finalizer_queues):
- fdeque = list_get_nongc_instance(self.AddressDeque,
- self.run_finalizer_queues, i)
- if fdeque is not None:
- fdeque.foreach(callback, arg)
+ while True:
+ fdeque = self.get_run_finalizer_queue(self.AddressDeque, i)
+ if fdeque is None:
+ break
+ fdeque.foreach(callback, arg)
i += 1
enum_pending_finalizers._annspecialcase_ = 'specialize:arg(1)'
@@ -403,18 +385,18 @@
self.finalizer_lock = True
try:
i = 0
- while i < len(self.run_finalizer_queues):
- fdeque = list_get_nongc_instance(self.AddressDeque,
- self.run_finalizer_queues, i)
- if fdeque is not None and fdeque.non_empty():
+ while True:
+ fdeque = self.get_run_finalizer_queue(self.AddressDeque, i)
+ if fdeque is None:
+ break
+ if fdeque.non_empty():
self.finalizer_trigger(i)
i += 1
finally:
self.finalizer_lock = False
def finalizer_next_dead(self, fq_index):
- fdeque = list_get_nongc_instance(self.AddressDeque,
- self.run_finalizer_queues, fq_index)
+ fdeque = self.get_run_finalizer_queue(self.AddressDeque, fq_index)
if fdeque.non_empty():
obj = fdeque.popleft()
else:
diff --git a/rpython/memory/gctransform/framework.py
b/rpython/memory/gctransform/framework.py
--- a/rpython/memory/gctransform/framework.py
+++ b/rpython/memory/gctransform/framework.py
@@ -183,6 +183,7 @@
gcdata.typeids_list = a_random_address # patched in finish()
self.gcdata = gcdata
self.malloc_fnptr_cache = {}
+ self.finalizer_queue_indexes = {}
gcdata.gc = GCClass(translator.config.translation, **GC_PARAMS)
root_walker = self.build_root_walker()
@@ -554,6 +555,12 @@
[s_gc, s_typeid16],
s_gcref)
+ self.register_finalizer_ptr = getfn(GCClass.register_finalizer,
+ [s_gc,
+ annmodel.SomeInteger(),
+ s_gcref],
+ annmodel.s_None)
+
def create_custom_trace_funcs(self, gc, rtyper):
custom_trace_funcs = tuple(rtyper.custom_trace_funcs)
rtyper.custom_trace_funcs = custom_trace_funcs
@@ -685,6 +692,9 @@
ll_instance.inst_typeids_list=
llmemory.cast_ptr_to_adr(ll_typeids_list)
newgcdependencies.append(ll_typeids_list)
#
+ # update this field too
+ ll_instance.inst_run_finalizer_queues =
self.gcdata.run_finalizer_queues
+ #
return newgcdependencies
def get_finish_tables(self):
@@ -1498,6 +1508,29 @@
return None
return getattr(obj, '_hash_cache_', None)
+ def get_finalizer_queue_index(self, hop):
+ fq_tag = hop.spaceop.args[0].value
+ assert fq_tag.expr == 'FinalizerQueue TAG'
+ fq = fq_tag.default
+ try:
+ index = self.finalizer_queue_indexes[fq]
+ except KeyError:
+ index = self.gcdata.register_next_finalizer_queue(
+ self.gcdata.gc.AddressDeque)
+ self.finalizer_queue_indexes[fq] = index
+ return index
+
+ def gct_gc_fq_register(self, hop):
+ index = self.get_finalizer_queue_index(hop)
+ c_index = rmodel.inputconst(lltype.Signed, index)
+ v_ptr = hop.spaceop.args[1]
+ v_ptr = hop.genop("cast_opaque_ptr", [v_ptr],
+ resulttype=llmemory.GCREF)
+ hop.genop("direct_call", [self.register_finalizer_ptr, self.c_const_gc,
+ c_index, v_ptr])
+
+ def gct_gc_fq_next_dead(self, hop):
+ xxxx
class TransformerLayoutBuilder(gctypelayout.TypeLayoutBuilder):
diff --git a/rpython/memory/gctypelayout.py b/rpython/memory/gctypelayout.py
--- a/rpython/memory/gctypelayout.py
+++ b/rpython/memory/gctypelayout.py
@@ -4,6 +4,9 @@
from rpython.rlib.debug import ll_assert
from rpython.rlib.rarithmetic import intmask
from rpython.tool.identity_dict import identity_dict
+from rpython.memory.support import make_list_of_nongc_instances
+from rpython.memory.support import list_set_nongc_instance
+from rpython.memory.support import list_get_nongc_instance
class GCData(object):
@@ -47,6 +50,7 @@
assert isinstance(type_info_group, llgroup.group)
self.type_info_group = type_info_group
self.type_info_group_ptr = type_info_group._as_ptr()
+ self.run_finalizer_queues = make_list_of_nongc_instances(1)
def get(self, typeid):
res = llop.get_group_member(GCData.TYPE_INFO_PTR,
@@ -86,9 +90,28 @@
def init_finalizer_trigger(self, finalizer_trigger):
self._finalizer_trigger = finalizer_trigger
+ def register_next_finalizer_queue(self, AddressDeque):
+ "NOT_RPYTHON"
+ # 'self.run_finalizer_queues' has got no length, but is NULL-terminated
+ prevlength = self.run_finalizer_queues._obj.getlength()
+ array = make_list_of_nongc_instances(prevlength + 1)
+ for i in range(prevlength):
+ array[i] = self.run_finalizer_queues[i]
+ self.run_finalizer_queues = array
+ #
+ fq_index = prevlength - 1
+ assert fq_index >= 0
+ list_set_nongc_instance(self.run_finalizer_queues, fq_index,
+ AddressDeque())
+ return fq_index
+
def q_finalizer_trigger(self, fq_index):
self._finalizer_trigger(fq_index)
+ def q_get_run_finalizer_queue(self, AddressDeque, fq_index):
+ return list_get_nongc_instance(AddressDeque,
+ self.run_finalizer_queues, fq_index)
+
def q_destructor_or_custom_trace(self, typeid):
return self.get(typeid).customfunc
@@ -143,6 +166,7 @@
self.q_has_gcptr_in_varsize,
self.q_is_gcarrayofgcptr,
self.q_finalizer_trigger,
+ self.q_get_run_finalizer_queue,
self.q_destructor_or_custom_trace,
self.q_offsets_to_gc_pointers,
self.q_fixed_size,
diff --git a/rpython/memory/gcwrapper.py b/rpython/memory/gcwrapper.py
--- a/rpython/memory/gcwrapper.py
+++ b/rpython/memory/gcwrapper.py
@@ -23,7 +23,7 @@
self.prepare_graphs(flowgraphs)
self.gc.setup()
self.finalizer_queue_indexes = {}
- self.finalizer_queues = []
+ self.finalizer_queues = {}
self.has_write_barrier_from_array = hasattr(self.gc,
'write_barrier_from_array')
@@ -35,6 +35,7 @@
self.get_type_id = layoutbuilder.get_type_id
gcdata = layoutbuilder.initialize_gc_query_function(self.gc)
gcdata.init_finalizer_trigger(self.finalizer_trigger)
+ self.gcdata = gcdata
constants = collect_constants(flowgraphs)
for obj in constants:
@@ -207,11 +208,10 @@
try:
index = self.finalizer_queue_indexes[fq]
except KeyError:
- index = len(self.finalizer_queue_indexes)
- assert index == len(self.finalizer_queues)
+ index = self.gcdata.register_next_finalizer_queue(
+ self.gc.AddressDeque)
self.finalizer_queue_indexes[fq] = index
- self.finalizer_queues.append(fq)
- self.gc.register_finalizer_index(fq, index)
+ self.finalizer_queues[index] = fq
return index
def gc_fq_next_dead(self, fq_tag):
diff --git a/rpython/memory/support.py b/rpython/memory/support.py
--- a/rpython/memory/support.py
+++ b/rpython/memory/support.py
@@ -399,7 +399,7 @@
# ____________________________________________________________
-NONGCARRAY = lltype.Array(NONGCOBJECTPTR)
+NONGCARRAY = lltype.Array(NONGCOBJECTPTR, hints={'nolength': True})
def make_list_of_nongc_instances(count):
return lltype.malloc(NONGCARRAY, count, flavor='raw', zero=True,
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit