Author: Armin Rigo <ar...@tunes.org>
Branch: 
Changeset: r966:d0f79129cbb7
Date: 2014-03-06 17:37 +0100
http://bitbucket.org/pypy/stmgc/changeset/d0f79129cbb7/

Log:    Add stm_can_move().

diff --git a/c7/stm/list.h b/c7/stm/list.h
--- a/c7/stm/list.h
+++ b/c7/stm/list.h
@@ -1,4 +1,5 @@
 #include <stdlib.h>
+#include <stdbool.h>
 
 /************************************************************/
 
diff --git a/c7/stm/nursery.c b/c7/stm/nursery.c
--- a/c7/stm/nursery.c
+++ b/c7/stm/nursery.c
@@ -48,8 +48,9 @@
         tree_contains(STM_PSEGMENT->young_outside_nursery, (uintptr_t)obj));
 }
 
-bool _stm_in_nursery(object_t *obj)
+long stm_can_move(object_t *obj)
 {
+    /* 'long' return value to avoid using 'bool' in the public interface */
     return _is_in_nursery(obj);
 }
 
diff --git a/c7/stmgc.h b/c7/stmgc.h
--- a/c7/stmgc.h
+++ b/c7/stmgc.h
@@ -9,7 +9,6 @@
 
 #include <stddef.h>
 #include <stdint.h>
-#include <stdbool.h>
 #include <assert.h>
 #include <limits.h>
 #include <unistd.h>
@@ -72,10 +71,10 @@
 object_t *_stm_allocate_old(ssize_t size_rounded_up);
 char *_stm_real_address(object_t *o);
 #ifdef STM_TESTS
+#include <stdbool.h>
 bool _stm_was_read(object_t *obj);
 bool _stm_was_written(object_t *obj);
 uint8_t _stm_get_page_flag(uintptr_t index);
-bool _stm_in_nursery(object_t *obj);
 bool _stm_in_transaction(stm_thread_local_t *tl);
 char *_stm_get_segment_base(long index);
 void _stm_test_switch(stm_thread_local_t *tl);
@@ -108,8 +107,8 @@
 #else
 #define OPT_ASSERT(cond) assert(cond)
 #endif
-#define LIKELY(x)   __builtin_expect(x, true)
-#define UNLIKELY(x) __builtin_expect(x, false)
+#define LIKELY(x)   __builtin_expect(x, 1)
+#define UNLIKELY(x) __builtin_expect(x, 0)
 #define IMPLY(a, b) (!(a) || (b))
 
 
@@ -269,6 +268,10 @@
 long stm_id(object_t *obj);
 void stm_set_prebuilt_identityhash(object_t *obj, uint64_t hash);
 
+/* Returns 1 if the object can still move (it's in the nursery), or 0
+   otherwise.  After a minor collection no object can move any more. */
+long stm_can_move(object_t *);
+
 
 /* ==================== END ==================== */
 
diff --git a/c7/test/support.py b/c7/test/support.py
--- a/c7/test/support.py
+++ b/c7/test/support.py
@@ -33,7 +33,6 @@
 bool _checked_stm_write(object_t *obj);
 bool _stm_was_read(object_t *obj);
 bool _stm_was_written(object_t *obj);
-bool _stm_in_nursery(object_t *obj);
 char *_stm_real_address(object_t *obj);
 char *_stm_get_segment_base(long index);
 bool _stm_in_transaction(stm_thread_local_t *tl);
@@ -78,6 +77,8 @@
 long stm_identityhash(object_t *obj);
 long stm_id(object_t *obj);
 void stm_set_prebuilt_identityhash(object_t *obj, uint64_t hash);
+
+int stm_can_move(object_t *);
 """)
 
 
@@ -269,7 +270,7 @@
     pass
 
 def is_in_nursery(o):
-    return lib._stm_in_nursery(o)
+    return lib.stm_can_move(o)
 
 def stm_allocate_old(size):
     o = lib._stm_allocate_old(size)
diff --git a/c7/test/test_nursery.py b/c7/test/test_nursery.py
--- a/c7/test/test_nursery.py
+++ b/c7/test/test_nursery.py
@@ -184,3 +184,16 @@
         stm_write(old) # old objs to trace
         stm_set_char(old, 'y')
         self.commit_transaction()
+
+    def test_can_move(self):
+        self.start_transaction()
+        new = stm_allocate(16)
+        assert lib.stm_can_move(new) == 1
+        self.push_root(new)
+        stm_minor_collect()
+        old = self.pop_root()
+        assert lib.stm_can_move(old) == 0
+        self.commit_transaction()
+
+        self.start_transaction()
+        assert lib.stm_can_move(old) == 0
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to