[pypy-commit] stmgc c7: address conversion functions

Raemi noreply at buildbot.pypy.org
Tue Jan 14 15:16:33 CET 2014


Author: Remi Meier <remi.meier at gmail.com>
Branch: c7
Changeset: r605:0789b61edcca
Date: 2014-01-14 15:16 +0100
http://bitbucket.org/pypy/stmgc/changeset/0789b61edcca/

Log:	address conversion functions

diff --git a/c7/core.c b/c7/core.c
--- a/c7/core.c
+++ b/c7/core.c
@@ -182,11 +182,33 @@
     return REAL_ADDRESS(_STM_TL2->thread_base, src);
 }
 
+
 static char *get_thread_base(long thread_num)
 {
     return object_pages + thread_num * (NB_PAGES * 4096UL);
 }
 
+
+char *_stm_real_address(object_t *o)
+{
+    if (o == NULL)
+        return NULL;
+    assert(FIRST_OBJECT_PAGE * 4096 <= (uintptr_t)o
+           && (uintptr_t)o < NB_PAGES * 4096);
+    return real_address((uintptr_t)o);
+}
+
+object_t *_stm_tl_address(char *ptr)
+{
+    if (ptr == NULL)
+        return NULL;
+    
+    uintptr_t res = ptr - _STM_TL2->thread_base;
+    assert(FIRST_OBJECT_PAGE * 4096 <= res
+           && res < NB_PAGES * 4096);
+    return (object_t*)res;
+}
+
 void stm_abort_transaction(void);
 
 enum detect_conflicts_e { CANNOT_CONFLICT, CAN_CONFLICT };
diff --git a/c7/core.h b/c7/core.h
--- a/c7/core.h
+++ b/c7/core.h
@@ -90,5 +90,6 @@
 void stm_setup_thread(void);
 void stm_start_transaction(jmpbufptr_t *jmpbufptr);
 void stm_stop_transaction(void);
-
+char *_stm_real_address(object_t *o);
+object_t *_stm_tl_address(char *ptr);
 #endif
diff --git a/c7/test/support.py b/c7/test/support.py
--- a/c7/test/support.py
+++ b/c7/test/support.py
@@ -2,6 +2,7 @@
 import cffi
 
 # ----------
+os.environ['CC'] = 'clang'
 
 parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 
@@ -44,6 +45,8 @@
 void _stm_teardown(void);
 void _stm_teardown_thread(void);
 
+char *_stm_real_address(object_t *o);
+object_t *_stm_tl_address(char *ptr);
 
 void *memset(void *s, int c, size_t n);
 """)
@@ -63,23 +66,21 @@
      extra_compile_args=['-g', '-O0', '-Werror'],
      force_generic_engine=True)
 
-def intptr(p):
-    return int(ffi.cast("intptr_t", p))
 
 def stm_allocate(size):
-    return ffi.cast("char *", lib.stm_allocate(size))
+    return lib._stm_real_address(lib.stm_allocate(size))
 
 def stm_read(ptr):
-    lib.stm_read(ffi.cast("struct object_s *", ptr))
+    lib.stm_read(lib._stm_tl_address(ptr))
 
 def stm_write(ptr):
-    lib.stm_write(ffi.cast("struct object_s *", ptr))
+    lib.stm_write(lib._stm_tl_address(ptr))
 
 def _stm_was_read(ptr):
-    return lib._stm_was_read(ffi.cast("struct object_s *", ptr))
+    return lib._stm_was_read(lib._stm_tl_address(ptr))
 
 def _stm_was_written(ptr):
-    return lib._stm_was_written(ffi.cast("struct object_s *", ptr))
+    return lib._stm_was_written(lib._stm_tl_address(ptr))
 
 def stm_start_transaction():
     lib.stm_start_transaction()


More information about the pypy-commit mailing list