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

Reply via email to