[pypy-commit] pypy stmgc-c8-gil-like: import stmgc/8009f12c327b
arigo
noreply at buildbot.pypy.org
Sat Jun 13 18:03:47 CEST 2015
Author: Armin Rigo <arigo at tunes.org>
Branch: stmgc-c8-gil-like
Changeset: r78085:259c750c401c
Date: 2015-06-13 18:03 +0200
http://bitbucket.org/pypy/pypy/changeset/259c750c401c/
Log: import stmgc/8009f12c327b
diff --git a/rpython/translator/stm/src_stm/revision b/rpython/translator/stm/src_stm/revision
--- a/rpython/translator/stm/src_stm/revision
+++ b/rpython/translator/stm/src_stm/revision
@@ -1,1 +1,1 @@
-5af967809206
+8009f12c327b
diff --git a/rpython/translator/stm/src_stm/stm/core.c b/rpython/translator/stm/src_stm/stm/core.c
--- a/rpython/translator/stm/src_stm/stm/core.c
+++ b/rpython/translator/stm/src_stm/stm/core.c
@@ -1220,8 +1220,9 @@
#ifdef STM_NO_AUTOMATIC_SETJMP
void _test_run_abort(stm_thread_local_t *tl) __attribute__((noreturn));
-int stm_is_inevitable(void)
+int stm_is_inevitable(stm_thread_local_t *tl)
{
+ assert(STM_SEGMENT->running_thread == tl);
switch (STM_PSEGMENT->transaction_state) {
case TS_REGULAR: return 0;
case TS_INEVITABLE: return 1;
@@ -1593,7 +1594,7 @@
void stm_stop_all_other_threads(void)
{
- if (!stm_is_inevitable()) /* may still abort */
+ if (!stm_is_inevitable(STM_SEGMENT->running_thread)) /* may still abort */
_stm_become_inevitable("stop_all_other_threads");
s_mutex_lock();
diff --git a/rpython/translator/stm/src_stm/stm/setup.c b/rpython/translator/stm/src_stm/stm/setup.c
--- a/rpython/translator/stm/src_stm/stm/setup.c
+++ b/rpython/translator/stm/src_stm/stm/setup.c
@@ -233,6 +233,8 @@
{
int num;
s_mutex_lock();
+ tl->self = tl; /* for faster access to &stm_thread_local (and easier
+ from the PyPy JIT, too) */
if (stm_all_thread_locals == NULL) {
stm_all_thread_locals = tl->next = tl->prev = tl;
num = 0;
diff --git a/rpython/translator/stm/src_stm/stmgc.h b/rpython/translator/stm/src_stm/stmgc.h
--- a/rpython/translator/stm/src_stm/stmgc.h
+++ b/rpython/translator/stm/src_stm/stmgc.h
@@ -71,7 +71,7 @@
/* the next fields are handled internally by the library */
int last_associated_segment_num; /* always a valid seg num */
int thread_local_counter;
- struct stm_thread_local_s *prev, *next;
+ struct stm_thread_local_s *self, *prev, *next;
void *creating_pthread[2];
} stm_thread_local_t;
@@ -87,10 +87,10 @@
long _stm_start_transaction(stm_thread_local_t *tl);
void _stm_commit_transaction(void);
void _stm_leave_noninevitable_transactional_zone(void);
-#define _stm_detach_inevitable_transaction(tl) do { \
- write_fence(); \
- assert(_stm_detached_inevitable_from_thread == 0); \
- _stm_detached_inevitable_from_thread = (intptr_t)(tl); \
+#define _stm_detach_inevitable_transaction(tl) do { \
+ write_fence(); \
+ assert(_stm_detached_inevitable_from_thread == 0); \
+ _stm_detached_inevitable_from_thread = (intptr_t)(tl->self); \
} while (0)
void _stm_reattach_transaction(stm_thread_local_t *tl);
void _stm_become_inevitable(const char*);
@@ -391,10 +391,10 @@
#ifdef STM_NO_AUTOMATIC_SETJMP
-int stm_is_inevitable(void);
+int stm_is_inevitable(stm_thread_local_t *tl);
#else
-static inline int stm_is_inevitable(void) {
- return !rewind_jmp_armed(&STM_SEGMENT->running_thread->rjthread);
+static inline int stm_is_inevitable(stm_thread_local_t *tl) {
+ return !rewind_jmp_armed(&tl->rjthread);
}
#endif
@@ -441,7 +441,7 @@
}
static inline void stm_leave_transactional_zone(stm_thread_local_t *tl) {
assert(STM_SEGMENT->running_thread == tl);
- if (stm_is_inevitable()) {
+ if (stm_is_inevitable(tl)) {
#ifdef STM_DEBUGPRINT
fprintf(stderr, "stm_leave_transactional_zone fast path\n");
#endif
@@ -472,7 +472,7 @@
static inline void stm_become_inevitable(stm_thread_local_t *tl,
const char* msg) {
assert(STM_SEGMENT->running_thread == tl);
- if (!stm_is_inevitable())
+ if (!stm_is_inevitable(tl))
_stm_become_inevitable(msg);
/* now, we're running the inevitable transaction, so this var should be 0 */
assert(_stm_detached_inevitable_from_thread == 0);
More information about the pypy-commit
mailing list