Author: Armin Rigo <[email protected]>
Branch: c7-refactor
Changeset: r714:3ffcf3c3473c
Date: 2014-02-09 16:00 +0100
http://bitbucket.org/pypy/stmgc/changeset/3ffcf3c3473c/

Log:    progress

diff --git a/c7/stmgc.h b/c7/stmgc.h
--- a/c7/stmgc.h
+++ b/c7/stmgc.h
@@ -36,7 +36,7 @@
 #define TLPREFIX __attribute__((address_space(256)))
 
 typedef TLPREFIX struct object_s object_t;
-typedef TLPREFIX struct stm_pub_region_info_s stm_pub_region_info_t;
+typedef TLPREFIX struct stm_region_info_s stm_region_info_t;
 typedef TLPREFIX struct stm_read_marker_s stm_read_marker_t;
 typedef TLPREFIX char stm_char;
 typedef void* stm_jmpbufptr_t[5];  /* for use with __builtin_setjmp() */
@@ -45,24 +45,32 @@
     uint8_t rm;
 };
 
-struct stm_pub_region_info_s {
+struct stm_region_info_s {
     uint8_t transaction_read_version;
+    uint8_t active;    /* 0 = no, 1 = active, 2 = inevitable */
     stm_char *nursery_current;
     uint64_t nursery_block_end;
+    char *thread_base;
 };
-#define STM_PRINFO           ((stm_pub_region_info_t *)4352)
+#define STM_REGION           ((stm_region_info_t *)4352)
 
-struct stm_thread_local_s {
+typedef struct stm_thread_local_s {
     object_t **shadowstack, **shadowstack_base;
     stm_jmpbufptr_t jmpbuf;
-    /* internal fields follow */
-    int _flags;
-    struct stm_thread_local_s *_prev, *_next;
+    /* the following fields are handled automatically by the library */
+    int region_number;
+    struct stm_thread_local_s *prev, *next;
 } stm_thread_local_t;
 
 /* this should use llvm's coldcc calling convention,
    but it's not exposed to C code so far */
 void _stm_write_slowpath(object_t *);
+stm_char *_stm_allocate_slowpath(ssize_t);
+void _stm_become_inevitable(char*);
+
+bool _stm_was_read(object_t *object);
+bool _stm_was_written(object_t *object);
+stm_thread_local_t *_stm_test_switch(stm_thread_local_t *);
 
 
 /* ==================== HELPERS ==================== */
@@ -97,7 +105,7 @@
 static inline void stm_read(object_t *obj)
 {
     ((stm_read_marker_t *)(((uintptr_t)obj) >> 4))->rm =
-        STM_PRINFO->transaction_read_version;
+        STM_REGION->transaction_read_version;
 }
 
 static inline void stm_write(object_t *obj)
@@ -106,27 +114,26 @@
         _stm_write_slowpath(obj);
 }
 
-/* must be provided by the user of this library */
-extern ssize_t stmcb_size(struct object_s *);
+/* Must be provided by the user of this library.
+   The "size rounded up" must be a multiple of 8 and at least 16. */
+extern ssize_t stmcb_size_rounded_up(struct object_s *);
 extern void stmcb_trace(struct object_s *, void (object_t **));
 
 
-stm_char *_stm_allocate_slowpath(ssize_t);
+static inline object_t *stm_allocate(ssize_t size_rounded_up)
+{
+    OPT_ASSERT(size_rounded_up >= 16);
+    OPT_ASSERT((size_rounded_up & 7) == 0);
 
-static inline object_t *stm_allocate(ssize_t size)
-{
-    assert((size % 8) == 0);
-    assert(size >= 16);
-
-    stm_char *p = STM_PRINFO->nursery_current;
-    stm_char *end = p + size;
-    STM_PRINFO->nursery_current = end;
-    if (UNLIKELY((uint64_t)end > STM_PRINFO->nursery_block_end))
-        p = _stm_allocate_slowpath(size);
+    stm_char *p = STM_REGION->nursery_current;
+    stm_char *end = p + size_rounded_up;
+    STM_REGION->nursery_current = end;
+    if (UNLIKELY((uint64_t)end > STM_REGION->nursery_block_end))
+        p = _stm_allocate_slowpath(size_rounded_up);
     return (object_t *)p;
 }
 
-object_t *stm_allocate_prebuilt(ssize_t size);
+object_t *stm_allocate_prebuilt(ssize_t size_rounded_up);
 
 void stm_setup(void);
 void stm_teardown(void);
@@ -137,9 +144,16 @@
 void stm_start_inevitable_transaction(stm_thread_local_t *tl);
 void stm_commit_transaction(void);
 void stm_abort_transaction(void);
-void stm_become_inevitable(char* msg);
 
-stm_thread_local_t *_stm_test_switch(stm_thread_local_t *tl);
+#define STM_START_TRANSACTION(tl)  ({                           \
+            int _restart = __builtin_setjmp((tl)->jmpbuf);      \
+            stm_start_transaction(tl);                          \
+            _restart; })
+
+static inline void stm_become_inevitable(char* msg) {
+    if (STM_REGION->active == 1)
+        _stm_become_inevitable(msg);
+}
 
 
 /* ==================== END ==================== */
diff --git a/c7/test/support.py b/c7/test/support.py
--- a/c7/test/support.py
+++ b/c7/test/support.py
@@ -1,21 +1,16 @@
 import os
 import cffi
+import sys
+assert sys.maxint == 9223372036854775807, "requires a 64-bit environment"
 
 # ----------
 os.environ['CC'] = 'clang'
 
 parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 
-header_files = [os.path.join(parent_dir, _n) for _n in
-                """core.h pagecopy.h list.h
-                reader_writer_lock.h
-                nursery.h pages.h
-                stmsync.h largemalloc.h""".split()]
-source_files = [os.path.join(parent_dir, _n) for _n in
-                """core.c pagecopy.c list.c
-                reader_writer_lock.c
-                nursery.c pages.c
-                stmsync.c largemalloc.c""".split()]
+source_files = [os.path.join(parent_dir, "stmgc.c")]
+all_files = [os.path.join(parent_dir, _n) for _n in os.listdir(parent_dir)
+             if _n.endswith('.h') or _n.endswith('.c')]
 
 _pycache_ = os.path.join(parent_dir, 'test', '__pycache__')
 if os.path.exists(_pycache_):
@@ -23,8 +18,7 @@
     if _fs:
         _fsmtime = min(os.stat(os.path.join(_pycache_, _f)).st_mtime
                        for _f in _fs)
-        if any(os.stat(src).st_mtime >= _fsmtime
-               for src in header_files + source_files):
+        if any(os.stat(src).st_mtime >= _fsmtime for src in all_files):
             import shutil
             shutil.rmtree(_pycache_)
 
@@ -36,31 +30,40 @@
 typedef ... jmpbufptr_t;
 #define SIZEOF_MYOBJ ...
 
-#define NB_NURSERY_PAGES ...
-#define NURSERY_SECTION ...
+typedef struct {
+    object_t **shadowstack, **shadowstack_base;
+    stm_jmpbufptr_t jmpbuf;
+    ...;
+} stm_thread_local_t;
+
+void stm_read(object_t *obj);
+void stm_write(object_t *obj);
+object_t *stm_allocate(ssize_t size_rounded_up);
+object_t *stm_allocate_prebuilt(ssize_t size_rounded_up);
 
 void stm_setup(void);
-void stm_setup_pthread(void);
+void stm_teardown(void);
+void stm_register_thread_local(stm_thread_local_t *tl);
+void stm_unregister_thread_local(stm_thread_local_t *tl);
 
-void stm_start_transaction(jmpbufptr_t *);
-bool _stm_stop_transaction(void);
-object_t *stm_allocate(size_t size);
+void stm_start_transaction(stm_thread_local_t *tl);
+void stm_start_inevitable_transaction(stm_thread_local_t *tl);
+void stm_commit_transaction(void);
+void stm_abort_transaction(void);
+void stm_become_inevitable(char* msg);
 
-void stm_read(object_t *object);
-void stm_write(object_t *object);
 bool _checked_stm_write(object_t *object);
-_Bool _stm_was_read(object_t *object);
-_Bool _stm_was_written(object_t *object);
-
-void _stm_restore_local_state(int thread_num);
-void stm_teardown(void);
-void stm_teardown_pthread(void);
+bool _stm_was_read(object_t *object);
+bool _stm_was_written(object_t *object);
+stm_thread_local_t *_stm_test_switch(stm_thread_local_t *);
 
 char *_stm_real_address(object_t *o);
-object_t *_stm_tl_address(char *ptr);
+object_t *_stm_region_address(char *ptr);
 bool _stm_is_young(object_t *o);
-object_t *_stm_allocate_old(size_t size);
+""")
 
+
+TEMPORARILY_DISABLED = """
 void _stm_start_safe_point(uint8_t);
 void _stm_stop_safe_point(uint8_t);
 bool _stm_check_stop_safe_point(void);
@@ -120,18 +123,14 @@
 void stm_become_inevitable(char* msg);
 void stm_start_inevitable_transaction();
 bool _checked_stm_become_inevitable();
+"""
 
-""")
 
 lib = ffi.verify('''
 #include <string.h>
 #include <assert.h>
 
-#include "core.h"
-#include "pages.h"
-#include "nursery.h"
-#include "stmsync.h"
-#include "largemalloc.h"
+#include "../stmgc.h"
 
 struct myobj_s {
     struct object_s hdr;
@@ -140,10 +139,6 @@
 typedef TLPREFIX struct myobj_s myobj_t;
 #define SIZEOF_MYOBJ sizeof(struct myobj_s)
 
-size_t stm_object_size_rounded_up(object_t * obj) {
-    return 16;
-}
-
 
 uint8_t _stm_get_flags(object_t *obj) {
     return obj->stm_flags;
@@ -250,12 +245,14 @@
 }
 
 
-size_t stmcb_size(struct object_s *obj)
+ssize_t stmcb_size_rounded_up(struct object_s *obj)
 {
     struct myobj_s *myobj = (struct myobj_s*)obj;
     if (myobj->type_id < 421420) {
         /* basic case: tid equals 42 plus the size of the object */
         assert(myobj->type_id >= 42 + sizeof(struct myobj_s));
+        assert((myobj->type_id - 42) >= 16);
+        assert(((myobj->type_id - 42) & 7) == 0);
         return myobj->type_id - 42;
     }
     else {
@@ -289,13 +286,9 @@
      force_generic_engine=True)
 
 
-import sys
-if sys.maxint > 2**32:
-    WORD = 8
-else:
-    WORD = 4
-
+WORD = 8
 HDR = lib.SIZEOF_MYOBJ
+assert HDR == 8
 
 class Conflict(Exception):
     pass
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to