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