Author: Armin Rigo <[email protected]>
Branch:
Changeset: r892:e739af01aa02
Date: 2014-02-27 16:57 +0100
http://bitbucket.org/pypy/stmgc/changeset/e739af01aa02/
Log: Kill SP_SAFE_POINT_CANNOT_COLLECT.
diff --git a/c7/stm/contention.c b/c7/stm/contention.c
--- a/c7/stm/contention.c
+++ b/c7/stm/contention.c
@@ -75,11 +75,6 @@
assert(other_pseg->transaction_state == TS_MUST_ABORT);
other_pseg->pub.nursery_end = NSE_SIGNAL;
- /* we will issue a safe point and wait: */
- STM_PSEGMENT->safe_point = SP_SAFE_POINT_CANNOT_COLLECT;
- // XXX do we really need a safe_point here? It seems we can
- // kill it and the whole SP_SAFE_POINT_CANNOT_COLLECT
-
/* wait, hopefully until the other thread broadcasts "I'm
done aborting" (spurious wake-ups are ok). */
dprintf(("contention: wait C_SAFE_POINT...\n"));
@@ -90,7 +85,7 @@
/* now we return into _stm_write_slowpath() and will try again
to acquire the write lock on our object. */
- STM_PSEGMENT->safe_point = SP_RUNNING;
+ assert(STM_PSEGMENT->safe_point == SP_RUNNING);
}
mutex_unlock();
diff --git a/c7/stm/core.c b/c7/stm/core.c
--- a/c7/stm/core.c
+++ b/c7/stm/core.c
@@ -353,10 +353,10 @@
minor_collection(/*commit=*/ true);
mutex_lock();
- STM_PSEGMENT->safe_point = SP_SAFE_POINT_CAN_COLLECT;
+ STM_PSEGMENT->safe_point = SP_SAFE_POINT;
/* wait until the other thread is at a safe-point */
- wait_for_other_safe_points(SP_SAFE_POINT_CANNOT_COLLECT);
+ wait_for_other_safe_points();
/* the rest of this function either runs atomically without
releasing the mutex, or aborts the current thread. */
diff --git a/c7/stm/core.h b/c7/stm/core.h
--- a/c7/stm/core.h
+++ b/c7/stm/core.h
@@ -131,8 +131,7 @@
enum /* safe_point */ {
SP_NO_TRANSACTION=0,
SP_RUNNING,
- SP_SAFE_POINT_CANNOT_COLLECT,
- SP_SAFE_POINT_CAN_COLLECT,
+ SP_SAFE_POINT,
};
enum /* transaction_state */ {
TS_NONE=0,
diff --git a/c7/stm/sync.c b/c7/stm/sync.c
--- a/c7/stm/sync.c
+++ b/c7/stm/sync.c
@@ -226,12 +226,12 @@
void _stm_start_safe_point(void)
{
assert(STM_PSEGMENT->safe_point == SP_RUNNING);
- STM_PSEGMENT->safe_point = SP_SAFE_POINT_CAN_COLLECT;
+ STM_PSEGMENT->safe_point = SP_SAFE_POINT;
}
void _stm_stop_safe_point(void)
{
- assert(STM_PSEGMENT->safe_point == SP_SAFE_POINT_CAN_COLLECT);
+ assert(STM_PSEGMENT->safe_point == SP_SAFE_POINT);
STM_PSEGMENT->safe_point = SP_RUNNING;
if (STM_PSEGMENT->transaction_state == TS_MUST_ABORT)
@@ -240,7 +240,7 @@
#endif
-static void wait_for_other_safe_points(int requested_safe_point_kind)
+static void wait_for_other_safe_points(void)
{
/* Must be called with the mutex. When all other threads are in a
safe point of at least the requested kind, returns. Otherwise,
@@ -261,12 +261,9 @@
in the cond_wait() in this same function.
*/
- /* XXX review what occurs for the other kind! */
- assert(requested_safe_point_kind == SP_SAFE_POINT_CANNOT_COLLECT);
-
restart:
assert(_has_mutex());
- assert(STM_PSEGMENT->safe_point == SP_SAFE_POINT_CAN_COLLECT);
+ assert(STM_PSEGMENT->safe_point == SP_SAFE_POINT);
if (STM_PSEGMENT->transaction_state == TS_MUST_ABORT)
abort_with_mutex();
@@ -282,10 +279,7 @@
SP_RUNNING, or at the wrong kind of safe point.
*/
struct stm_priv_segment_info_s *other_pseg = get_priv_segment(i);
- if (other_pseg->safe_point == SP_RUNNING ||
- (requested_safe_point_kind == SP_SAFE_POINT_CAN_COLLECT &&
- other_pseg->safe_point == SP_SAFE_POINT_CANNOT_COLLECT)) {
-
+ if (other_pseg->safe_point == SP_RUNNING) {
/* we need to wait for this thread. Use NSE_SIGNAL to ask
it (and possibly all other threads in the same case) to
enter a safe-point soon. */
@@ -324,7 +318,7 @@
while (STM_SEGMENT->nursery_end == NSE_SIGNAL) {
dprintf(("collectable_safe_point...\n"));
- STM_PSEGMENT->safe_point = SP_SAFE_POINT_CAN_COLLECT;
+ STM_PSEGMENT->safe_point = SP_SAFE_POINT;
STM_SEGMENT->nursery_end = NURSERY_END;
/* signal all the threads blocked in
diff --git a/c7/stm/sync.h b/c7/stm/sync.h
--- a/c7/stm/sync.h
+++ b/c7/stm/sync.h
@@ -27,5 +27,5 @@
static void wait_for_end_of_inevitable_transaction(bool can_abort);
/* see the source for an exact description */
-static void wait_for_other_safe_points(int requested_safe_point_kind);
+static void wait_for_other_safe_points(void);
static void collectable_safe_point(void);
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit