Author: Remi Meier <[email protected]>
Branch: stmgc-c8
Changeset: r76128:7e650b854871
Date: 2015-02-25 13:20 +0100
http://bitbucket.org/pypy/pypy/changeset/7e650b854871/
Log: import stmgc e32b94df8ecb
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 @@
-8c547a55af94
+e32b94df8ecb
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
@@ -1089,6 +1089,27 @@
}
+void stm_stop_all_other_threads(void)
+{
+ if (!stm_is_inevitable()) /* may still abort */
+ _stm_become_inevitable("stop_all_other_threads");
+
+ s_mutex_lock();
+ synchronize_all_threads(STOP_OTHERS_AND_BECOME_GLOBALLY_UNIQUE);
+ s_mutex_unlock();
+}
+
+void stm_resume_all_other_threads(void)
+{
+ /* this calls 'committed_globally_unique_transaction()' even though
+ we're not committing now. It's a way to piggyback on the existing
+ implementation for stm_become_globally_unique_transaction(). */
+ s_mutex_lock();
+ committed_globally_unique_transaction();
+ s_mutex_unlock();
+}
+
+
static inline void _synchronize_fragment(stm_char *frag, ssize_t frag_size)
{
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
@@ -269,6 +269,37 @@
void stm_become_globally_unique_transaction(stm_thread_local_t *tl, const char
*msg);
void stm_validate(void);
+/* Temporarily stop all the other threads, by waiting until they
+ reach a safe-point. Don't nest the calls to stop/resume and make sure
+ that resume is called. The current transaction is turned inevitable. */
+void stm_stop_all_other_threads(void);
+void stm_resume_all_other_threads(void);
+
+
+/* Convenience macros to push the markers into the shadowstack */
+#define STM_PUSH_MARKER(tl, odd_num, p) do { \
+ uintptr_t _odd_num = (odd_num); \
+ assert(_odd_num & 1); \
+ STM_PUSH_ROOT(tl, _odd_num); \
+ STM_PUSH_ROOT(tl, p); \
+} while (0)
+
+#define STM_POP_MARKER(tl) ({ \
+ object_t *_popped = STM_POP_ROOT_RET(tl); \
+ STM_POP_ROOT_RET(tl); \
+ _popped; \
+})
+
+#define STM_UPDATE_MARKER_NUM(tl, odd_num) do { \
+ uintptr_t _odd_num = (odd_num); \
+ assert(_odd_num & 1); \
+ struct stm_shadowentry_s *_ss = (tl).shadowstack - 2; \
+ while (!(((uintptr_t)(_ss->ss)) & 1)) { \
+ _ss--; \
+ assert(_ss >= (tl).shadowstack_base); \
+ } \
+ _ss->ss = (object_t *)_odd_num; \
+} while (0)
/* Support for light finalizers. This is a simple version of
diff --git a/rpython/translator/stm/src_stm/stmgcintf.h
b/rpython/translator/stm/src_stm/stmgcintf.h
--- a/rpython/translator/stm/src_stm/stmgcintf.h
+++ b/rpython/translator/stm/src_stm/stmgcintf.h
@@ -38,6 +38,8 @@
long _pypy_stm_count(void);
+
+
/* C8: not implemented properly yet: */
extern void stmcb_commit_soon(void);
#define _STM_CARD_SIZE 32 /* must be >= 32 */
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit