Author: Armin Rigo <[email protected]>
Branch:
Changeset: r1094:4024e96d9ba2
Date: 2014-03-25 14:10 +0100
http://bitbucket.org/pypy/stmgc/changeset/4024e96d9ba2/
Log: Add an extra argument to stm_become_inevitable() just for testing.
diff --git a/c7/demo/demo_random.c b/c7/demo/demo_random.c
--- a/c7/demo/demo_random.c
+++ b/c7/demo/demo_random.c
@@ -285,12 +285,12 @@
return (objptr_t)-1; // break current
} else if (get_rand(20) == 1) {
push_roots();
- stm_become_inevitable("please");
+ stm_become_inevitable(&stm_thread_local, "please");
pop_roots();
return NULL;
} else if (get_rand(240) == 1) {
push_roots();
- stm_become_globally_unique_transaction("really");
+ stm_become_globally_unique_transaction(&stm_thread_local, "really");
fprintf(stderr, "[GUT/%d]", (int)STM_SEGMENT->segment_num);
pop_roots();
return NULL;
diff --git a/c7/stm/core.c b/c7/stm/core.c
--- a/c7/stm/core.c
+++ b/c7/stm/core.c
@@ -676,9 +676,10 @@
s_mutex_unlock();
}
-void stm_become_globally_unique_transaction(const char *msg)
+void stm_become_globally_unique_transaction(stm_thread_local_t *tl,
+ const char *msg)
{
- stm_become_inevitable(msg); /* may still abort */
+ stm_become_inevitable(tl, msg); /* may still abort */
s_mutex_lock();
synchronize_all_threads(STOP_OTHERS_AND_BECOME_GLOBALLY_UNIQUE);
diff --git a/c7/stm/forksupport.c b/c7/stm/forksupport.c
--- a/c7/stm/forksupport.c
+++ b/c7/stm/forksupport.c
@@ -60,7 +60,7 @@
bool was_in_transaction = _stm_in_transaction(this_tl);
if (was_in_transaction) {
- stm_become_inevitable("fork");
+ stm_become_inevitable(this_tl, "fork");
/* Note that the line above can still fail and abort, which should
be fine */
}
diff --git a/c7/stmgc.h b/c7/stmgc.h
--- a/c7/stmgc.h
+++ b/c7/stmgc.h
@@ -275,7 +275,9 @@
/* Turn the current transaction inevitable. The 'jmpbuf' passed to
STM_START_TRANSACTION() is not going to be used any more after
this call (but the stm_become_inevitable() itself may still abort). */
-static inline void stm_become_inevitable(const char* msg) {
+static inline void stm_become_inevitable(stm_thread_local_t *tl,
+ const char* msg) {
+ assert(STM_SEGMENT->running_thread == tl);
if (STM_SEGMENT->jmpbuf_ptr != NULL)
_stm_become_inevitable(msg);
}
@@ -330,7 +332,8 @@
transaction is running concurrently. Avoid as much as possible.
Other transactions will continue running only after this transaction
commits. */
-void stm_become_globally_unique_transaction(const char *msg);
+void stm_become_globally_unique_transaction(stm_thread_local_t *tl,
+ const char *msg);
/* ==================== END ==================== */
diff --git a/c7/test/support.py b/c7/test/support.py
--- a/c7/test/support.py
+++ b/c7/test/support.py
@@ -53,8 +53,8 @@
void _stm_start_transaction(stm_thread_local_t *tl, stm_jmpbuf_t *jmpbuf);
bool _check_commit_transaction(void);
bool _check_abort_transaction(void);
-bool _check_become_inevitable(void);
-bool _check_become_globally_unique_transaction(void);
+bool _check_become_inevitable(stm_thread_local_t *tl);
+bool _check_become_globally_unique_transaction(stm_thread_local_t *tl);
int stm_is_inevitable(void);
void _set_type_id(object_t *obj, uint32_t h);
@@ -158,12 +158,12 @@
CHECKED(stm_abort_transaction());
}
-bool _check_become_inevitable() {
- CHECKED(stm_become_inevitable("TEST"));
+bool _check_become_inevitable(stm_thread_local_t *tl) {
+ CHECKED(stm_become_inevitable(tl, "TEST"));
}
-bool _check_become_globally_unique_transaction() {
- CHECKED(stm_become_globally_unique_transaction("TESTGUT"));
+bool _check_become_globally_unique_transaction(stm_thread_local_t *tl) {
+ CHECKED(stm_become_globally_unique_transaction(tl, "TESTGUT"));
}
#undef CHECKED
@@ -358,14 +358,6 @@
if lib._check_stop_safe_point():
raise Conflict()
-def stm_become_inevitable():
- if lib._check_become_inevitable():
- raise Conflict()
-
-def stm_become_globally_unique_transaction():
- if lib._check_become_globally_unique_transaction():
- raise Conflict()
-
def stm_minor_collect():
lib.stm_collect(0)
@@ -515,3 +507,13 @@
def set_thread_local_obj(self, newobj):
tl = self.tls[self.current_thread]
tl.thread_local_obj = newobj
+
+ def become_inevitable(self):
+ tl = self.tls[self.current_thread]
+ if lib._check_become_inevitable(tl):
+ raise Conflict()
+
+ def become_globally_unique_transaction(self):
+ tl = self.tls[self.current_thread]
+ if lib._check_become_globally_unique_transaction(tl):
+ raise Conflict()
diff --git a/c7/test/test_basic.py b/c7/test/test_basic.py
--- a/c7/test/test_basic.py
+++ b/c7/test/test_basic.py
@@ -383,7 +383,7 @@
stm_write(lp1)
stm_set_char(lp1, 'b')
assert lib.stm_is_inevitable() == 0
- stm_become_inevitable()
+ self.become_inevitable()
assert lib.stm_is_inevitable() == 1
self.commit_transaction()
#
diff --git a/c7/test/test_extra.py b/c7/test/test_extra.py
--- a/c7/test/test_extra.py
+++ b/c7/test/test_extra.py
@@ -86,7 +86,7 @@
#
self.switch(1)
self.start_transaction()
- lib._check_become_globally_unique_transaction()
+ self.become_globally_unique_transaction()
assert lib.stm_is_inevitable()
#
py.test.raises(Conflict, self.switch, 0)
diff --git a/c7/test/test_random.py b/c7/test/test_random.py
--- a/c7/test/test_random.py
+++ b/c7/test/test_random.py
@@ -346,7 +346,7 @@
thread_state.push_roots(ex)
ex.do(raising_call(trs.check_must_abort(),
- "stm_become_inevitable"))
+ "self.become_inevitable"))
if trs.check_must_abort():
thread_state.abort_transaction()
else:
diff --git a/c7/test/test_weakref.py b/c7/test/test_weakref.py
--- a/c7/test/test_weakref.py
+++ b/c7/test/test_weakref.py
@@ -176,7 +176,7 @@
# back in thread 0, we pop toref from the shadowstack
# in an inevitable transaction
self.start_transaction()
- stm_become_inevitable()
+ self.become_inevitable()
self.pop_root() # forget toref
stm_major_collect()
diff --git a/duhton/glob.c b/duhton/glob.c
--- a/duhton/glob.c
+++ b/duhton/glob.c
@@ -126,7 +126,7 @@
}
_du_save1(lst);
- stm_become_inevitable("print");
+ stm_become_inevitable(&stm_thread_local, "print");
_du_restore1(lst);
int i;
diff --git a/gil-c7/stmgc.h b/gil-c7/stmgc.h
--- a/gil-c7/stmgc.h
+++ b/gil-c7/stmgc.h
@@ -95,8 +95,12 @@
_stm_tloc = NULL;
if (pthread_mutex_unlock(&_stm_gil) != 0) abort();
}
-inline static void stm_become_inevitable(const char *msg) { }
+inline static void stm_become_inevitable(
+ stm_thread_local_t *tl, const char *msg) { }
inline static void _stm_become_inevitable(const char *msg) { }
+inline static void stm_become_globally_unique_transaction(
+ stm_thread_local_t *tl, const char *msg) { }
+
static inline int stm_is_inevitable(void) { return 1; }
inline static void stm_read(object_t *ob) { }
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit