Author: Remi Meier <remi.me...@gmail.com>
Branch: finalizer-queues
Changeset: r2004:0bd420ee56c1
Date: 2016-11-23 17:05 +0100
http://bitbucket.org/pypy/stmgc/changeset/0bd420ee56c1/

Log:    fix and a bit of cleanup

        why are simple things so hard to get right?

diff --git a/c8/stm/finalizer.c b/c8/stm/finalizer.c
--- a/c8/stm/finalizer.c
+++ b/c8/stm/finalizer.c
@@ -70,30 +70,31 @@
         stm_spin_loop();
     }
 
-    if (!list_is_empty(STM_PSEGMENT->finalizers->run_finalizers)) {
+    struct finalizers_s *local_fs = STM_PSEGMENT->finalizers;
+    if (!list_is_empty(local_fs->run_finalizers)) {
         /* copy 'STM_PSEGMENT->finalizers->run_finalizers' into
            'g_finalizers.run_finalizers', dropping any initial NULLs
            (finalizers already called) */
-        struct list_s *src = STM_PSEGMENT->finalizers->run_finalizers;
+        struct list_s *src = local_fs->run_finalizers;
         if (list_count(src)) {
             g_finalizers.run_finalizers = list_extend(
                 g_finalizers.run_finalizers,
                 src, 0);
         }
     }
-    LIST_FREE(STM_PSEGMENT->finalizers->run_finalizers);
+    LIST_FREE(local_fs->run_finalizers);
 
     /* copy the whole 'STM_PSEGMENT->finalizers->objects_with_finalizers'
        into 'g_finalizers.objects_with_finalizers' */
     g_finalizers.objects_with_finalizers = list_extend(
         g_finalizers.objects_with_finalizers,
-        STM_PSEGMENT->finalizers->objects_with_finalizers, 0);
-    
assert(list_is_empty(STM_PSEGMENT->finalizers->probably_young_objects_with_finalizers));
-    LIST_FREE(STM_PSEGMENT->finalizers->objects_with_finalizers);
-    
LIST_FREE(STM_PSEGMENT->finalizers->probably_young_objects_with_finalizers);
+        local_fs->objects_with_finalizers, 0);
+    LIST_FREE(local_fs->objects_with_finalizers);
+    assert(list_is_empty(local_fs->probably_young_objects_with_finalizers));
+    LIST_FREE(local_fs->probably_young_objects_with_finalizers);
 
     // re-init
-    init_finalizers(STM_PSEGMENT->finalizers);
+    init_finalizers(local_fs);
 
     __sync_lock_release(&g_finalizers.lock);
 }
@@ -219,6 +220,7 @@
     for (j = 1; j < NB_SEGMENTS; j++) {
         struct stm_priv_segment_info_s *pseg = get_priv_segment(j);
 
+        assert(list_is_empty(pseg->young_objects_with_destructors));
         struct list_s *lst = pseg->old_objects_with_destructors;
         long i, count = list_count(lst);
         lst->count = 0;
@@ -353,6 +355,7 @@
 
     struct list_s *marked = list_create();
 
+    assert(list_is_empty(f->probably_young_objects_with_finalizers));
     struct list_s *lst = f->objects_with_finalizers;
     long i, count = list_count(lst);
     lst->count = 0;
@@ -611,10 +614,11 @@
                 /* no need to become inevitable for local ones */
                 /* Remove obj from list and return it. */
                 object_t *obj = (object_t*)list_item(lst, i);
-                if (i < count - 2) {
+                int remaining = count - i - 2;
+                if (remaining > 0) {
                     memmove(&lst->items[i],
                             &lst->items[i + 2],
-                            (count - 2) * sizeof(uintptr_t));
+                            remaining * sizeof(uintptr_t));
                 }
                 lst->count -= 2;
                 return obj;
@@ -629,9 +633,10 @@
         stm_spin_loop();
     }
 
-    int count = list_count(g_finalizers.run_finalizers);
+    struct list_s *lst = g_finalizers.run_finalizers;
+    int count = list_count(lst);
     for (int i = 0; i < count; i += 2) {
-        int qindex = (int)list_item(g_finalizers.run_finalizers, i + 1);
+        int qindex = (int)list_item(lst, i + 1);
         if (qindex == queue_index) {
             /* XXX: become inevitable, bc. otherwise, we would need to keep
                around the original g_finalizers.run_finalizers to restore it
@@ -643,20 +648,21 @@
                     /* avoid blocking here, waiting for another INEV 
transaction.
                        If we did that, application code could not proceed 
(start the
                        next transaction) and it will not be obvious from the 
profile
-                       why we were WAITing. */
+                       why we were WAITing. XXX: still true? */
                     __sync_lock_release(&g_finalizers.lock);
                     return NULL;
                 }
             }
 
             /* Remove obj from list and return it. */
-            object_t *obj = (object_t*)list_item(g_finalizers.run_finalizers, 
i);
-            if (i < count - 2) {
-                memmove(&g_finalizers.run_finalizers->items[i],
-                        &g_finalizers.run_finalizers->items[i + 2],
-                        (count - 2) * sizeof(uintptr_t));
+            object_t *obj = (object_t*)list_item(lst, i);
+            int remaining = count - i - 2;
+            if (remaining > 0) {
+                memmove(&lst->items[i],
+                        &lst->items[i + 2],
+                        remaining * sizeof(uintptr_t));
             }
-            g_finalizers.run_finalizers->count -= 2;
+            lst->count -= 2;
 
             __sync_lock_release(&g_finalizers.lock);
             return obj;
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to