Author: Armin Rigo <[email protected]>
Branch: c7
Changeset: r600:66e0f7f7267c
Date: 2014-01-04 16:54 +0100
http://bitbucket.org/pypy/stmgc/changeset/66e0f7f7267c/

Log:    Check both the x86 version and the general version.

diff --git a/checkfence/c7/unshare_page.c b/checkfence/c7/unshare_page.c
--- a/checkfence/c7/unshare_page.c
+++ b/checkfence/c7/unshare_page.c
@@ -20,38 +20,51 @@
     flag_page_private = SHARED_PAGE;
 }
 
-void _stm_privatize(void)
+void _stm_privatize(int mode)
 {
-    int previous = __sync_lock_test_and_set(&flag_page_private,
-                                            REMAPPING_PAGE);
-    switch (previous) {
-    case PRIVATE_PAGE:
-        lsl_assert(flag_page_private != SHARED_PAGE);
-        flag_page_private = PRIVATE_PAGE;
-        return;
+    int was_shared;
+    if (mode == 0) {
+        int previous = __sync_lock_test_and_set(&flag_page_private,
+                                                REMAPPING_PAGE);
+        if (previous == PRIVATE_PAGE) {
+            lsl_assert(flag_page_private != SHARED_PAGE);
+            flag_page_private = PRIVATE_PAGE;
+            return;
+        }
+        was_shared = (previous == SHARED_PAGE);
+    }
+    else {
+        was_shared = lsl_cas_32(&flag_page_private,
+                                SHARED_PAGE, REMAPPING_PAGE);
+        lsl_fence("load-load");
+    }
 
-    case REMAPPING_PAGE:
+    if (!was_shared) {
         lsl_assert(flag_page_private != SHARED_PAGE);
         /* here we wait until 'flag_page_private' is changed away from
            REMAPPING_PAGE, and we assume that it eventually occurs */
         lsl_assume(flag_page_private != REMAPPING_PAGE);
         lsl_fence("load-load");
-        return;
-
-    case SHARED_PAGE:
+    }
+    else {
         lsl_observe_label("privatizing");
         privatized_data = 42;
         lsl_fence("store-store");
         lsl_assert(flag_page_private == REMAPPING_PAGE);
         flag_page_private = PRIVATE_PAGE;
-        return;
     }
-    lsl_assert(0);
 }
 
-void PRIVATIZE(void)
+void PRIV_X86(void)
 {
-    _stm_privatize();
+    _stm_privatize(0);
     int data = privatized_data;
     lsl_observe_output("data", data);
 }
+
+void PRIV_GEN(void)
+{
+    _stm_privatize(1);
+    int data = privatized_data;
+    lsl_observe_output("data", data);
+}
diff --git a/checkfence/c7/unshare_page.lsl b/checkfence/c7/unshare_page.lsl
--- a/checkfence/c7/unshare_page.lsl
+++ b/checkfence/c7/unshare_page.lsl
@@ -1,2 +1,3 @@
 
-test T1 = INIT ( PRIVATIZE PRIVATIZE | PRIVATIZE PRIVATIZE | PRIVATIZE 
PRIVATIZE )
+test T1 = INIT ( PRIV_X86 PRIV_X86 | PRIV_X86 PRIV_X86 | PRIV_X86 PRIV_X86 )
+test T2 = INIT ( PRIV_GEN PRIV_GEN | PRIV_GEN PRIV_GEN | PRIV_GEN PRIV_GEN )
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to