Author: Armin Rigo <[email protected]>
Branch: finalizer
Changeset: r1465:c33f019f2ec4
Date: 2014-10-06 17:52 +0200
http://bitbucket.org/pypy/stmgc/changeset/c33f019f2ec4/
Log: Fixes by self-review
diff --git a/c7/stm/finalizer.c b/c7/stm/finalizer.c
--- a/c7/stm/finalizer.c
+++ b/c7/stm/finalizer.c
@@ -84,21 +84,30 @@
write_locks[lock_idx] = WL_FINALIZ_ORDER_1;
}
-static struct list_s *_finalizer_tmpstack;
+static struct list_s *_finalizer_tmpstack, *_finalizer_emptystack;
-static inline void append_to_finalizer_tmpstack(object_t **pobj)
+static inline void _append_to_finalizer_tmpstack(object_t **pobj)
{
object_t *obj = *pobj;
if (obj != NULL)
LIST_APPEND(_finalizer_tmpstack, obj);
}
-static void _recursively_bump_finalization_state(object_t *obj, int from_state,
- struct list_s *tmpstack)
+static inline struct list_s *finalizer_trace(object_t *obj, struct list_s *lst)
{
+ struct object_s *realobj =
+ (struct object_s *)REAL_ADDRESS(stm_object_pages, obj);
+ _finalizer_tmpstack = lst;
+ stmcb_trace(realobj, &_append_to_finalizer_tmpstack);
+ return _finalizer_tmpstack;
+}
+
+static void _recursively_bump_finalization_state(object_t *obj, int from_state)
+{
+ struct list_s *tmpstack = _finalizer_emptystack;
+ assert(list_is_empty(tmpstack));
+
assert(_finalization_state(obj) == from_state);
- assert(list_is_empty(tmpstack));
- _finalizer_tmpstack = tmpstack;
while (1) {
if (_finalization_state(obj) == from_state) {
@@ -106,9 +115,7 @@
write_locks[mark_loc(obj)]++;
/* trace */
- struct object_s *realobj =
- (struct object_s *)REAL_ADDRESS(stm_object_pages, obj);
- stmcb_trace(realobj, &append_to_finalizer_tmpstack);
+ tmpstack = finalizer_trace(obj, tmpstack);
}
if (list_is_empty(tmpstack))
@@ -116,6 +123,7 @@
obj = (object_t *)list_pop_item(tmpstack);
}
+ _finalizer_emptystack = tmpstack;
}
static void deal_with_objects_with_finalizers(void)
@@ -129,7 +137,7 @@
struct list_s *new_with_finalizer = list_create();
struct list_s *marked = list_create();
struct list_s *pending = list_create();
- struct list_s *tmpstack = list_create();
+ LIST_CREATE(_finalizer_emptystack);
long j;
for (j = 1; j <= NB_SEGMENTS; j++) {
@@ -152,17 +160,13 @@
int state = _finalization_state(y);
if (state <= 0) {
_bump_finalization_state_from_0_to_1(y);
- /* trace into the 'pending' list */
- struct object_s *realobj =
- (struct object_s *)REAL_ADDRESS(stm_object_pages, y);
- _finalizer_tmpstack = pending;
- stmcb_trace(realobj, &append_to_finalizer_tmpstack);
+ pending = finalizer_trace(y, pending);
}
else if (state == 2) {
- _recursively_bump_finalization_state(y, 2, tmpstack);
+ _recursively_bump_finalization_state(y, 2);
}
}
- _recursively_bump_finalization_state(x, 1, tmpstack);
+ _recursively_bump_finalization_state(x, 1);
}
list_clear(lst);
}
@@ -175,14 +179,14 @@
assert(state >= 2);
if (state == 2) {
LIST_APPEND(run_finalizers, x);
- _recursively_bump_finalization_state(x, 2, tmpstack);
+ _recursively_bump_finalization_state(x, 2);
}
else {
LIST_APPEND(new_with_finalizer, x);
}
}
- list_free(tmpstack);
+ LIST_FREE(_finalizer_emptystack);
list_free(pending);
list_free(marked);
list_free(get_priv_segment(1)->objects_with_finalizers);
diff --git a/c7/test/test_finalizer.py b/c7/test/test_finalizer.py
--- a/c7/test/test_finalizer.py
+++ b/c7/test/test_finalizer.py
@@ -2,7 +2,7 @@
import py
-class TestFinalizer(BaseTest):
+class TestLightFinalizer(BaseTest):
def setup_method(self, meth):
BaseTest.setup_method(self, meth)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit