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