Author: Armin Rigo <[email protected]>
Branch: 
Changeset: r912:f12f3ade6f01
Date: 2014-03-01 19:15 +0100
http://bitbucket.org/pypy/stmgc/changeset/f12f3ade6f01/

Log:    Small refactoring

diff --git a/c7/stm/gcpage.c b/c7/stm/gcpage.c
--- a/c7/stm/gcpage.c
+++ b/c7/stm/gcpage.c
@@ -147,17 +147,30 @@
     return lock_idx;
 }
 
-static inline bool mark_is_visited(object_t *obj)
+static inline bool mark_visited_test_and_set(object_t *obj)
 {
     uintptr_t lock_idx = mark_loc(obj);
     assert(write_locks[lock_idx] == 0 || write_locks[lock_idx] == WL_VISITED);
-    return write_locks[lock_idx] != 0;
+    if (write_locks[lock_idx] != 0) {
+        return true;
+    }
+    else {
+        write_locks[lock_idx] = WL_VISITED;
+        return false;
+    }
 }
 
-static inline void mark_set_visited(object_t *obj)
+static inline bool mark_visited_test_and_clear(object_t *obj)
 {
     uintptr_t lock_idx = mark_loc(obj);
-    write_locks[lock_idx] = WL_VISITED;
+    assert(write_locks[lock_idx] == 0 || write_locks[lock_idx] == WL_VISITED);
+    if (write_locks[lock_idx] != 0) {
+        write_locks[lock_idx] = 0;
+        return true;
+    }
+    else {
+        return false;
+    }
 }
 
 static void mark_record_modified_objects(void)
@@ -190,15 +203,19 @@
 static void reset_write_locks(void)
 {
     /* the write_locks array, containing the visit marker during
-       major collection, is cleared now, with two memsets (to avoid
-       clearing the never-used range in the middle corresponding to
-       uninitialized pages) */
-    object_t *loc1 = (object_t *)(uninitialized_page_start - stm_object_pages);
+       major collection, is cleared in sweep_large_objects() for
+       large objects, but is not cleared for small objects.
+       Clear it now. */
     object_t *loc2 = (object_t *)(uninitialized_page_stop  - stm_object_pages);
-    uintptr_t lock1_idx = mark_loc(loc1);
     uintptr_t lock2_idx = mark_loc(loc2 - 1) + 1;
 
-    memset(write_locks, 0, lock1_idx);
+#ifdef STM_TESTS
+    long _i;
+    for (_i=0; _i<lock2_idx; _i++) {
+        assert(write_locks[_i] == 0);
+        if (_i == 1000000) break;  /* ok, stop testing */
+    }
+#endif
     memset(write_locks + lock2_idx, 0, sizeof(write_locks) - lock2_idx);
 
     /* restore the write locks on the modified objects */
@@ -223,10 +240,10 @@
 
     if (obj == NULL)
         return;
-    if (mark_is_visited(obj))
+
+    if (mark_visited_test_and_set(obj))
         return;    /* already visited this object */
 
-    mark_set_visited(obj);
     LIST_APPEND(mark_objects_to_trace, REAL_ADDRESS(stm_object_pages, obj));
 }
 
@@ -258,7 +275,7 @@
 static inline bool largemalloc_keep_object_at(char *data)
 {
     /* this is called by _stm_largemalloc_sweep() */
-    return mark_is_visited((object_t *)(data - stm_object_pages));
+    return mark_visited_test_and_clear((object_t *)(data - stm_object_pages));
 }
 
 static void sweep_large_objects(void)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to