Author: Armin Rigo <[email protected]>
Branch: 
Changeset: r302:e7249873dcda
Date: 2013-06-27 11:53 +0200
http://bitbucket.org/pypy/stmgc/changeset/e7249873dcda/

Log:    Tweak

diff --git a/c4/gcpage.c b/c4/gcpage.c
--- a/c4/gcpage.c
+++ b/c4/gcpage.c
@@ -565,11 +565,11 @@
             p->h_tid &= ~GCFLAG_VISITED;
         }
         else {
-            g2l_mark_as_deleted(item);
+            G2L_LOOP_DELETE(item);
             stm_free(p, stmgc_size(p));
         }
 
-    } G2L_LOOP_END;
+    } G2L_LOOP_END_AND_COMPRESS;
 }
 
 static void free_all_unused_local_pages(void)
diff --git a/c4/lists.c b/c4/lists.c
--- a/c4/lists.c
+++ b/c4/lists.c
@@ -22,6 +22,22 @@
   memset(g2l, 0, sizeof(struct G2L));
 }
 
+void _g2l_compress(struct G2L *g2l)
+{
+  wlog_t *item;
+  struct G2L g2l_copy;
+  memset(&g2l_copy, 0, sizeof(struct G2L));
+
+  G2L_LOOP_FORWARD(*g2l, item)
+    {
+      g2l_insert(&g2l_copy, item->addr, item->val);
+
+    } G2L_LOOP_END;
+
+  g2l_delete_not_used_any_more(g2l);
+  *g2l = g2l_copy;
+}
+
 wlog_t *_g2l_find(char *entry, gcptr addr)
 {
   revision_t key = (revision_t)addr;
@@ -120,7 +136,7 @@
 {
     wlog_t *entry;
     G2L_FIND(*g2l, addr, entry, goto missing);
-    g2l_mark_as_deleted(entry);
+    entry->addr = NULL;
     return;
 
  missing:
diff --git a/c4/lists.h b/c4/lists.h
--- a/c4/lists.h
+++ b/c4/lists.h
@@ -47,9 +47,11 @@
 {                                                                       \
   struct { char **next; char **end; } _stack[TREE_DEPTH_MAX], *_stackp; \
   char **_next, **_end, *_entry;                                        \
+  long _deleted_factor = 0;                                             \
+  struct G2L *_g2l = &(g2l);                                            \
   /* initialization */                                                  \
   _stackp = _stack;      /* empty stack */                              \
-  _next = (g2l).toplevel.items + INITIAL;                               \
+  _next = _g2l->toplevel.items + INITIAL;                               \
   _end = _next _PLUS_ TREE_ARITY;                                       \
   /* loop */                                                            \
   while (1)                                                             \
@@ -78,8 +80,11 @@
           continue;                                                     \
         }                                                               \
       /* points to a wlog_t item */                                     \
-      if (((wlog_t *)_entry)->addr == NULL)   /* deleted entry */       \
+      if (((wlog_t *)_entry)->addr == NULL) {   /* deleted entry */     \
+          _deleted_factor += 3;                                         \
           continue;                                                     \
+      }                                                                 \
+      _deleted_factor -= 4;                                             \
       item = (wlog_t *)_entry;
 
 #define G2L_LOOP_FORWARD(g2l, item)                             \
@@ -87,6 +92,9 @@
 #define G2L_LOOP_BACKWARD(g2l, item)                            \
                        _G2L_LOOP(g2l, item, (TREE_ARITY-1), -)
 #define G2L_LOOP_END     } }
+#define G2L_LOOP_END_AND_COMPRESS                                       \
+                         } if (_deleted_factor > 9) _g2l_compress(_g2l); }
+#define G2L_LOOP_DELETE(item)  { (item)->addr = NULL; _deleted_factor += 6; }
 
 #define G2L_FIND(g2l, addr1, result, goto_not_found)            \
 {                                                               \
@@ -101,6 +109,7 @@
 }
 
 wlog_t *_g2l_find(char *entry, gcptr addr);
+void _g2l_compress(struct G2L *g2l);
 void g2l_insert(struct G2L *g2l, gcptr addr, gcptr val);
 void g2l_delete_item(struct G2L *g2l, gcptr addr);
 
@@ -111,11 +120,6 @@
     return 1;
 }
 
-static inline void g2l_mark_as_deleted(wlog_t *entry)
-{
-    entry->addr = NULL;
-}
-
 /************************************************************/
 
 /* The gcptrlist_xx functions are implemented as an array that grows
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to