Skip to contentSkip to conversation

memorder.tex: Fix typos in description of litmus test C-ISA2+o-r+a-r+a-r+a-o

PATCH Applied Junchang Wang 3 participants 7 messages Nov 5, 2018 – Nov 8, 2018

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 memorder.tex: Fix typos in description of litmus test C-ISA2+o-r+a-r+a-r+a-o

This is the only patch for the second half of Chapter Memory Ordering. Please take a look. Thanks.

---
 memorder/memorder.tex | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
memorder/memorder.tex +2 -2
index 8e11e92..7f80612 100644
@@ -2899,11 +2899,11 @@ shows a three-step release-acquire chain, but where \co{P3()}'s
 final access is a \co{READ_ONCE()} from \co{x0}, which is
 accessed via \co{WRITE_ONCE()} by \co{P0()}, forming a non-temporal
 load-to-store link between these two processes.
-However, because \co{P0()}'s \co{smp_store_release()} (line~12)
+However, because \co{P0()}'s \co{smp_store_release()} (line~8)
 is cumulative, if \co{P3()}'s \co{READ_ONCE()} returns zero,
 this cumulativity will force the \co{READ_ONCE()} to be ordered
 before \co{P0()}'s \co{smp_store_release()}.
-In addition, the release-acquire chain (lines~12, 20, 21, 28, 29, and~37)
+In addition, the release-acquire chain (lines~8, 16, 17, 24, 25, and~33)
 forces \co{P3()}'s \co{READ_ONCE()} to be ordered after \co{P0()}'s
 \co{smp_store_release()}.
 Because \co{P3()}'s \co{READ_ONCE()} cannot be both before and after
Signature · 1 line
2.7.4
#1 lore raw

From 0e43c93660383b7560c55131754dbc4bfaf13052 Mon Sep 17 00:00:00 2001
From: Akira Yokosawa <[email protected]>
Date: Mon, 5 Nov 2018 20:27:02 +0900
Subject: [PATCH] memorder: Fix line numbers by applying new scheme to C-ISA2+o-r+a-r+a-r+a-o

Line numbers referring to Listing 15.23 don't match the line counts in the snippet. Fix this by putting labels in the source of the litmus test and referring them by \lnref{} macros.

---

Quoted 3 lines · Junchang Wang

This is the only patch for the second half of Chapter Memory Ordering. Please take a look. Thanks.

Good catch!

While we are here, why not apply the new scheme for snippets to this litmus test? Labeling lines in the source code can prevent such mismatches.

For the new scheme to support litmus tests, please see commit log of 69a75a84d7c3 ("future/formalregress: Example of extraction of snippet from .litmus file")

Thanks. Akira

--

 .../formal/litmus/C-ISA2+o-r+a-r+a-r+a-o.litmus    | 22 ++++-----
 memorder/memorder.tex                              | 52 +++-------------------
 2 files changed, 19 insertions(+), 55 deletions(-)
CodeSamples/formal/litmus/C-ISA2+o-r+a-r+a-r+a-o.litmus +12 -10
index 343fded..b899369 100644
@@ -1,15 +1,16 @@
 C C-ISA2+o-r+a-r+a-r+a-o
+//\begin[snippet][labelbase=ln:formal:litmus:C-ISA2+o-r+a-r+a-r+a-o:whole,commandchars=\\\@\$]
 {
 }
 
-{
-#include "api.h"
-}
-
+{				//\fcvexclude
+#include "api.h"		//\fcvexclude
+}				//\fcvexclude
+				//\fcvexclude
 P0(int *x0, int *x1)
 {
 	WRITE_ONCE(*x0, 2);
-	smp_store_release(x1, 2);
+	smp_store_release(x1, 2);	//\lnlbl[P0:rel]
 }
 
 
@@ -17,16 +18,16 @@ P1(int *x1, int *x2)
 {
 	int r2;
 
-	r2 = smp_load_acquire(x1);
-	smp_store_release(x2, 2);
+	r2 = smp_load_acquire(x1);	//\lnlbl[P1:acq]
+	smp_store_release(x2, 2);	//\lnlbl[P1:rel]
 }
 
 P2(int *x2, int *x3)
 {
 	int r2;
 
-	r2 = smp_load_acquire(x2);
-	smp_store_release(x3, 2);
+	r2 = smp_load_acquire(x2);	//\lnlbl[P2:acq]
+	smp_store_release(x3, 2);	//\lnlbl[P2:rel]
 }
 
 P3(int *x3, int *x0)
@@ -34,8 +35,9 @@ P3(int *x3, int *x0)
 	int r1;
 	int r2;
 
-	r1 = smp_load_acquire(x3);
+	r1 = smp_load_acquire(x3);	//\lnlbl[P3:acq]
 	r2 = READ_ONCE(*x0);
 }
 
+//\end[snippet]
 exists (1:r2=2 /\ 2:r2=2 /\ 3:r1=2 /\ 3:r2=0)
memorder/memorder.tex +7 -45

72 lines not on this page · raw message

Signature · 1 line
2.7.4
#2 lore raw
Quoted 17 lines · Akira Yokosawa
Quoted 1 line

From 0e43c93660383b7560c55131754dbc4bfaf13052 Mon Sep 17 00:00:00 2001

From: Akira Yokosawa <[email protected]>
Date: Mon, 5 Nov 2018 20:27:02 +0900
Subject: [PATCH] memorder: Fix line numbers by applying new scheme to C-ISA2+o-r+a-r+a-r+a-o

Line numbers referring to Listing 15.23 don't match the line counts in the snippet. Fix this by putting labels in the source of the litmus test and referring them by \lnref{} macros.

---

Quoted 3 lines · Junchang Wang

This is the only patch for the second half of Chapter Memory Ordering. Please take a look. Thanks.

Quoted 8 lines

Good catch!

While we are here, why not apply the new scheme for snippets to this litmus test? Labeling lines in the source code can prevent such mismatches.

For the new scheme to support litmus tests, please see commit log of 69a75a84d7c3 ("future/formalregress: Example of extraction of snippet from .litmus file")

Indeed, good catch!!! And here I -thought- that I proof-read this stuff...

Junchang, does Akira's approach look good to you?

Thanx, Paul

Quoted 146 lines

Thanks. Akira

--

 .../formal/litmus/C-ISA2+o-r+a-r+a-r+a-o.litmus    | 22 ++++-----
 memorder/memorder.tex                              | 52 +++-------------------
 2 files changed, 19 insertions(+), 55 deletions(-)
CodeSamples/formal/litmus/C-ISA2+o-r+a-r+a-r+a-o.litmus +12 -10
index 343fded..b899369 100644
@@ -1,15 +1,16 @@
 C C-ISA2+o-r+a-r+a-r+a-o
+//\begin[snippet][labelbase=ln:formal:litmus:C-ISA2+o-r+a-r+a-r+a-o:whole,commandchars=\\\@\$]
 {
 }
 
-{
-#include "api.h"
-}
-
+{				//\fcvexclude
+#include "api.h"		//\fcvexclude
+}				//\fcvexclude
+				//\fcvexclude
 P0(int *x0, int *x1)
 {
 	WRITE_ONCE(*x0, 2);
-	smp_store_release(x1, 2);
+	smp_store_release(x1, 2);	//\lnlbl[P0:rel]
 }
 
 
@@ -17,16 +18,16 @@ P1(int *x1, int *x2)
 {
 	int r2;
 
-	r2 = smp_load_acquire(x1);
-	smp_store_release(x2, 2);
+	r2 = smp_load_acquire(x1);	//\lnlbl[P1:acq]
+	smp_store_release(x2, 2);	//\lnlbl[P1:rel]
 }
 
 P2(int *x2, int *x3)
 {
 	int r2;
 
-	r2 = smp_load_acquire(x2);
-	smp_store_release(x3, 2);
+	r2 = smp_load_acquire(x2);	//\lnlbl[P2:acq]
+	smp_store_release(x3, 2);	//\lnlbl[P2:rel]
 }
 
 P3(int *x3, int *x0)
@@ -34,8 +35,9 @@ P3(int *x3, int *x0)
 	int r1;
 	int r2;
 
-	r1 = smp_load_acquire(x3);
+	r1 = smp_load_acquire(x3);	//\lnlbl[P3:acq]
 	r2 = READ_ONCE(*x0);
 }
 
+//\end[snippet]
 exists (1:r2=2 /\ 2:r2=2 /\ 3:r1=2 /\ 3:r2=0)
memorder/memorder.tex +7 -45
index 8e11e92..d92d1e5 100644
@@ -2841,49 +2841,7 @@ from the passage of time, so that no matter how many threads are
 involved, the corresponding \co{exists} clause cannot trigger.
 
 \begin{listing}[tbp]
-{ \scriptsize
-\begin{verbbox}[\LstLineNo]
-C C-ISA2+o-r+a-r+a-r+a-o
-{
-}
-
-P0(int *x0, int *x1)
-{
-  WRITE_ONCE(*x0, 2);
-  smp_store_release(x1, 2);
-}
-
-
-P1(int *x1, int *x2)
-{
-  int r2;
-
-  r2 = smp_load_acquire(x1);
-  smp_store_release(x2, 2);
-}
-
-P2(int *x2, int *x3)
-{
-  int r2;
-
-  r2 = smp_load_acquire(x2);
-  smp_store_release(x3, 2);
-}
-
-P3(int *x3, int *x0)
-{
-  int r1;
-  int r2;
-
-  r1 = smp_load_acquire(x3);
-  r2 = READ_ONCE(*x0);
-}
-
-exists (1:r2=2 /\ 2:r2=2 /\ 3:r1=2 /\ 3:r2=0)
-\end{verbbox}
-}
-\centering
-\theverbbox
+\input{CodeSamples/formal/litmus/[email protected]}
 \caption{Long ISA2 Release-Acquire Chain}
 \label{lst:memorder:Long ISA2 Release-Acquire Chain}
 \end{listing}
@@ -2899,16 +2857,20 @@ shows a three-step release-acquire chain, but where \co{P3()}'s
 final access is a \co{READ_ONCE()} from \co{x0}, which is
 accessed via \co{WRITE_ONCE()} by \co{P0()}, forming a non-temporal
 load-to-store link between these two processes.
-However, because \co{P0()}'s \co{smp_store_release()} (line~12)
+\begin{lineref}[ln:formal:litmus:C-ISA2+o-r+a-r+a-r+a-o:whole]
+However, because \co{P0()}'s \co{smp_store_release()} (line~\lnref{P0:rel})
 is cumulative, if \co{P3()}'s \co{READ_ONCE()} returns zero,
 this cumulativity will force the \co{READ_ONCE()} to be ordered
 before \co{P0()}'s \co{smp_store_release()}.
-In addition, the release-acquire chain (lines~12, 20, 21, 28, 29, and~37)
+In addition, the release-acquire chain
+(lines~\lnref{P0:rel}, \lnref{P1:acq}, \lnref{P1:rel}, \lnref{P2:acq},
+\lnref{P2:rel}, and~\lnref{P3:acq})
 forces \co{P3()}'s \co{READ_ONCE()} to be ordered after \co{P0()}'s
 \co{smp_store_release()}.
 Because \co{P3()}'s \co{READ_ONCE()} cannot be both before and after
 \co{P0()}'s \co{smp_store_release()}, either or both of two things must
 be true:
+\end{lineref}
 
 \begin{enumerate}
 \item	\co{P3()}'s \co{READ_ONCE()} came after \co{P0()}'s
Signature · 1 line
2.7.4
#3 lore raw
Quoted 24 lines · Paul E. McKenney
Quoted 22 lines · Akira Yokosawa
Quoted 1 line

From 0e43c93660383b7560c55131754dbc4bfaf13052 Mon Sep 17 00:00:00 2001

From: Akira Yokosawa <[email protected]>
Date: Mon, 5 Nov 2018 20:27:02 +0900
Subject: [PATCH] memorder: Fix line numbers by applying new scheme to C-ISA2+o-r+a-r+a-r+a-o

Line numbers referring to Listing 15.23 don't match the line counts in the snippet. Fix this by putting labels in the source of the litmus test and referring them by \lnref{} macros.

---

Quoted 3 lines · Junchang Wang

This is the only patch for the second half of Chapter Memory Ordering. Please take a look. Thanks.

Good catch!

While we are here, why not apply the new scheme for snippets to this litmus test? Labeling lines in the source code can prevent such mismatches.

Quoted 8 lines
Quoted 3 lines

For the new scheme to support litmus tests, please see commit log of 69a75a84d7c3 ("future/formalregress: Example of extraction of snippet from .litmus file")

Indeed, good catch!!! And here I -thought- that I proof-read this stuff...

Junchang, does Akira's approach look good to you?

Hi Paul,

Sorry for the late response. The new scheme is the right approach in comparison to hard-coding line numbers; Akira's approach looks good to me.

@Akira Yokosawa Thanks a lot for pointing me to the right scheme, which looks nice. I believe we programmers tend to hard-coding line numbers/variables at the very beginning of drafting/coding; that's a nice tradeoff between efficiency and portability :-) . I can help check and apply the new scheme in reading through other chapters.

Thanks,
--Junchang

Quoted 149 lines

Thanx, Paul

Quoted 146 lines

Thanks. Akira

--

 .../formal/litmus/C-ISA2+o-r+a-r+a-r+a-o.litmus    | 22 ++++-----
 memorder/memorder.tex                              | 52 +++-------------------
 2 files changed, 19 insertions(+), 55 deletions(-)
CodeSamples/formal/litmus/C-ISA2+o-r+a-r+a-r+a-o.litmus +12 -10
index 343fded..b899369 100644
@@ -1,15 +1,16 @@
 C C-ISA2+o-r+a-r+a-r+a-o
+//\begin[snippet][labelbase=ln:formal:litmus:C-ISA2+o-r+a-r+a-r+a-o:whole,commandchars=\\\@\$]
 {
 }
 
-{
-#include "api.h"
-}
-
+{                            //\fcvexclude
+#include "api.h"             //\fcvexclude
+}                            //\fcvexclude
+                             //\fcvexclude
 P0(int *x0, int *x1)
 {
      WRITE_ONCE(*x0, 2);
-     smp_store_release(x1, 2);
+     smp_store_release(x1, 2);       //\lnlbl[P0:rel]
 }
 
 
@@ -17,16 +18,16 @@ P1(int *x1, int *x2)
 {
      int r2;
 
-     r2 = smp_load_acquire(x1);
-     smp_store_release(x2, 2);
+     r2 = smp_load_acquire(x1);      //\lnlbl[P1:acq]
+     smp_store_release(x2, 2);       //\lnlbl[P1:rel]
 }
 
 P2(int *x2, int *x3)
 {
      int r2;
 
-     r2 = smp_load_acquire(x2);
-     smp_store_release(x3, 2);
+     r2 = smp_load_acquire(x2);      //\lnlbl[P2:acq]
+     smp_store_release(x3, 2);       //\lnlbl[P2:rel]
 }
 
 P3(int *x3, int *x0)
@@ -34,8 +35,9 @@ P3(int *x3, int *x0)
      int r1;
      int r2;
 
-     r1 = smp_load_acquire(x3);
+     r1 = smp_load_acquire(x3);      //\lnlbl[P3:acq]
      r2 = READ_ONCE(*x0);
 }
 
+//\end[snippet]
 exists (1:r2=2 /\ 2:r2=2 /\ 3:r1=2 /\ 3:r2=0)
memorder/memorder.tex +7 -46
index 8e11e92..d92d1e5 100644
@@ -2841,49 +2841,7 @@ from the passage of time, so that no matter how many threads are
 involved, the corresponding \co{exists} clause cannot trigger.
 
 \begin{listing}[tbp]
-{ \scriptsize
-\begin{verbbox}[\LstLineNo]
-C C-ISA2+o-r+a-r+a-r+a-o
-{
-}
-
-P0(int *x0, int *x1)
-{
-  WRITE_ONCE(*x0, 2);
-  smp_store_release(x1, 2);
-}
-
-
-P1(int *x1, int *x2)
-{
-  int r2;
-
-  r2 = smp_load_acquire(x1);
-  smp_store_release(x2, 2);
-}
-
-P2(int *x2, int *x3)
-{
-  int r2;
-
-  r2 = smp_load_acquire(x2);
-  smp_store_release(x3, 2);
-}
-
-P3(int *x3, int *x0)
-{
-  int r1;
-  int r2;
-
-  r1 = smp_load_acquire(x3);
-  r2 = READ_ONCE(*x0);
-}
-
-exists (1:r2=2 /\ 2:r2=2 /\ 3:r1=2 /\ 3:r2=0)
-\end{verbbox}
-}
-\centering
-\theverbbox
+\input{CodeSamples/formal/litmus/[email protected]}
 \caption{Long ISA2 Release-Acquire Chain}
 \label{lst:memorder:Long ISA2 Release-Acquire Chain}
 \end{listing}
@@ -2899,16 +2857,20 @@ shows a three-step release-acquire chain, but where \co{P3()}'s
 final access is a \co{READ_ONCE()} from \co{x0}, which is
 accessed via \co{WRITE_ONCE()} by \co{P0()}, forming a non-temporal
 load-to-store link between these two processes.
-However, because \co{P0()}'s \co{smp_store_release()} (line~12)
+\begin{lineref}[ln:formal:litmus:C-ISA2+o-r+a-r+a-r+a-o:whole]
+However, because \co{P0()}'s \co{smp_store_release()} (line~\lnref{P0:rel})
 is cumulative, if \co{P3()}'s \co{READ_ONCE()} returns zero,
 this cumulativity will force the \co{READ_ONCE()} to be ordered
 before \co{P0()}'s \co{smp_store_release()}.
-In addition, the release-acquire chain (lines~12, 20, 21, 28, 29, and~37)
+In addition, the release-acquire chain
+(lines~\lnref{P0:rel}, \lnref{P1:acq}, \lnref{P1:rel}, \lnref{P2:acq},
+\lnref{P2:rel}, and~\lnref{P3:acq})
 forces \co{P3()}'s \co{READ_ONCE()} to be ordered after \co{P0()}'s
 \co{smp_store_release()}.
 Because \co{P3()}'s \co{READ_ONCE()} cannot be both before and after
 \co{P0()}'s \co{smp_store_release()}, either or both of two things must
 be true:
+\end{lineref}
 
 \begin{enumerate}
 \item        \co{P3()}'s \co{READ_ONCE()} came after \co{P0()}'s
--

2.7.4

Acked-by Junchang Wang
#4 lore raw
Quoted 31 lines · Junchang Wang
Quoted 30 lines · Paul E. McKenney
Quoted 17 lines · Akira Yokosawa
Quoted 1 line

From 0e43c93660383b7560c55131754dbc4bfaf13052 Mon Sep 17 00:00:00 2001

From: Akira Yokosawa <[email protected]>
Date: Mon, 5 Nov 2018 20:27:02 +0900
Subject: [PATCH] memorder: Fix line numbers by applying new scheme to C-ISA2+o-r+a-r+a-r+a-o

Line numbers referring to Listing 15.23 don't match the line counts in the snippet. Fix this by putting labels in the source of the litmus test and referring them by \lnref{} macros.

---

Quoted 3 lines · Junchang Wang

This is the only patch for the second half of Chapter Memory Ordering. Please take a look. Thanks.

Quoted 8 lines

Good catch!

While we are here, why not apply the new scheme for snippets to this litmus test? Labeling lines in the source code can prevent such mismatches.

For the new scheme to support litmus tests, please see commit log of 69a75a84d7c3 ("future/formalregress: Example of extraction of snippet from .litmus file")

Indeed, good catch!!! And here I -thought- that I proof-read this stuff...

Quoted 7 lines
Quoted 1 line

Junchang, does Akira's approach look good to you?

Hi Paul,

Sorry for the late response. The new scheme is the right approach in comparison to hard-coding line numbers; Akira's approach looks good to me.

Very good! Unless you tell me otherwise, I will add your:

This would indicate your approval of Akira's patch.

Thanx, Paul

Quoted 161 lines

@Akira Yokosawa Thanks a lot for pointing me to the right scheme, which looks nice. I believe we programmers tend to hard-coding line numbers/variables at the very beginning of drafting/coding; that's a nice tradeoff between efficiency and portability :-) . I can help check and apply the new scheme in reading through other chapters.

Thanks,
--Junchang

Quoted 149 lines

Thanx, Paul

Quoted 146 lines

Thanks. Akira

--

 .../formal/litmus/C-ISA2+o-r+a-r+a-r+a-o.litmus    | 22 ++++-----
 memorder/memorder.tex                              | 52 +++-------------------
 2 files changed, 19 insertions(+), 55 deletions(-)
CodeSamples/formal/litmus/C-ISA2+o-r+a-r+a-r+a-o.litmus +12 -10
index 343fded..b899369 100644
@@ -1,15 +1,16 @@
 C C-ISA2+o-r+a-r+a-r+a-o
+//\begin[snippet][labelbase=ln:formal:litmus:C-ISA2+o-r+a-r+a-r+a-o:whole,commandchars=\\\@\$]
 {
 }
 
-{
-#include "api.h"
-}
-
+{                            //\fcvexclude
+#include "api.h"             //\fcvexclude
+}                            //\fcvexclude
+                             //\fcvexclude
 P0(int *x0, int *x1)
 {
      WRITE_ONCE(*x0, 2);
-     smp_store_release(x1, 2);
+     smp_store_release(x1, 2);       //\lnlbl[P0:rel]
 }
 
 
@@ -17,16 +18,16 @@ P1(int *x1, int *x2)
 {
      int r2;
 
-     r2 = smp_load_acquire(x1);
-     smp_store_release(x2, 2);
+     r2 = smp_load_acquire(x1);      //\lnlbl[P1:acq]
+     smp_store_release(x2, 2);       //\lnlbl[P1:rel]
 }
 
 P2(int *x2, int *x3)
 {
      int r2;
 
-     r2 = smp_load_acquire(x2);
-     smp_store_release(x3, 2);
+     r2 = smp_load_acquire(x2);      //\lnlbl[P2:acq]
+     smp_store_release(x3, 2);       //\lnlbl[P2:rel]
 }
 
 P3(int *x3, int *x0)
@@ -34,8 +35,9 @@ P3(int *x3, int *x0)
      int r1;
      int r2;
 
-     r1 = smp_load_acquire(x3);
+     r1 = smp_load_acquire(x3);      //\lnlbl[P3:acq]
      r2 = READ_ONCE(*x0);
 }
 
+//\end[snippet]
 exists (1:r2=2 /\ 2:r2=2 /\ 3:r1=2 /\ 3:r2=0)
memorder/memorder.tex +7 -46
index 8e11e92..d92d1e5 100644
@@ -2841,49 +2841,7 @@ from the passage of time, so that no matter how many threads are
 involved, the corresponding \co{exists} clause cannot trigger.
 
 \begin{listing}[tbp]
-{ \scriptsize
-\begin{verbbox}[\LstLineNo]
-C C-ISA2+o-r+a-r+a-r+a-o
-{
-}
-
-P0(int *x0, int *x1)
-{
-  WRITE_ONCE(*x0, 2);
-  smp_store_release(x1, 2);
-}
-
-
-P1(int *x1, int *x2)
-{
-  int r2;
-
-  r2 = smp_load_acquire(x1);
-  smp_store_release(x2, 2);
-}
-
-P2(int *x2, int *x3)
-{
-  int r2;
-
-  r2 = smp_load_acquire(x2);
-  smp_store_release(x3, 2);
-}
-
-P3(int *x3, int *x0)
-{
-  int r1;
-  int r2;
-
-  r1 = smp_load_acquire(x3);
-  r2 = READ_ONCE(*x0);
-}
-
-exists (1:r2=2 /\ 2:r2=2 /\ 3:r1=2 /\ 3:r2=0)
-\end{verbbox}
-}
-\centering
-\theverbbox
+\input{CodeSamples/formal/litmus/[email protected]}
 \caption{Long ISA2 Release-Acquire Chain}
 \label{lst:memorder:Long ISA2 Release-Acquire Chain}
 \end{listing}
@@ -2899,16 +2857,20 @@ shows a three-step release-acquire chain, but where \co{P3()}'s
 final access is a \co{READ_ONCE()} from \co{x0}, which is
 accessed via \co{WRITE_ONCE()} by \co{P0()}, forming a non-temporal
 load-to-store link between these two processes.
-However, because \co{P0()}'s \co{smp_store_release()} (line~12)
+\begin{lineref}[ln:formal:litmus:C-ISA2+o-r+a-r+a-r+a-o:whole]
+However, because \co{P0()}'s \co{smp_store_release()} (line~\lnref{P0:rel})
 is cumulative, if \co{P3()}'s \co{READ_ONCE()} returns zero,
 this cumulativity will force the \co{READ_ONCE()} to be ordered
 before \co{P0()}'s \co{smp_store_release()}.
-In addition, the release-acquire chain (lines~12, 20, 21, 28, 29, and~37)
+In addition, the release-acquire chain
+(lines~\lnref{P0:rel}, \lnref{P1:acq}, \lnref{P1:rel}, \lnref{P2:acq},
+\lnref{P2:rel}, and~\lnref{P3:acq})
 forces \co{P3()}'s \co{READ_ONCE()} to be ordered after \co{P0()}'s
 \co{smp_store_release()}.
 Because \co{P3()}'s \co{READ_ONCE()} cannot be both before and after
 \co{P0()}'s \co{smp_store_release()}, either or both of two things must
 be true:
+\end{lineref}
 
 \begin{enumerate}
 \item        \co{P3()}'s \co{READ_ONCE()} came after \co{P0()}'s
--

2.7.4

#5 lore raw
Quoted 37 lines · Paul E. McKenney
Quoted 35 lines · Junchang Wang
Quoted 24 lines · Paul E. McKenney
Quoted 22 lines · Akira Yokosawa
Quoted 1 line

From 0e43c93660383b7560c55131754dbc4bfaf13052 Mon Sep 17 00:00:00 2001

From: Akira Yokosawa <[email protected]>
Date: Mon, 5 Nov 2018 20:27:02 +0900
Subject: [PATCH] memorder: Fix line numbers by applying new scheme to C-ISA2+o-r+a-r+a-r+a-o

Line numbers referring to Listing 15.23 don't match the line counts in the snippet. Fix this by putting labels in the source of the litmus test and referring them by \lnref{} macros.

---

Quoted 3 lines · Junchang Wang

This is the only patch for the second half of Chapter Memory Ordering. Please take a look. Thanks.

Good catch!

While we are here, why not apply the new scheme for snippets to this litmus test? Labeling lines in the source code can prevent such mismatches.

Quoted 7 lines
Quoted 3 lines

For the new scheme to support litmus tests, please see commit log of 69a75a84d7c3 ("future/formalregress: Example of extraction of snippet from .litmus file")

Indeed, good catch!!! And here I -thought- that I proof-read this stuff...

Junchang, does Akira's approach look good to you?

Hi Paul,

Quoted 8 lines
Quoted 3 lines

Sorry for the late response. The new scheme is the right approach in comparison to hard-coding line numbers; Akira's approach looks good to me.

Very good! Unless you tell me otherwise, I will add your:

Got it. Thanks a lot.

--Junchang

Quoted 166 lines

This would indicate your approval of Akira's patch.

Thanx, Paul

Quoted 161 lines

@Akira Yokosawa Thanks a lot for pointing me to the right scheme, which looks nice. I believe we programmers tend to hard-coding line numbers/variables at the very beginning of drafting/coding; that's a nice tradeoff between efficiency and portability :-) . I can help check and apply the new scheme in reading through other chapters.

Thanks,
--Junchang

Quoted 149 lines

Thanx, Paul

Quoted 146 lines

Thanks. Akira

--

 .../formal/litmus/C-ISA2+o-r+a-r+a-r+a-o.litmus    | 22 ++++-----
 memorder/memorder.tex                              | 52 +++-------------------
 2 files changed, 19 insertions(+), 55 deletions(-)
CodeSamples/formal/litmus/C-ISA2+o-r+a-r+a-r+a-o.litmus +12 -10
index 343fded..b899369 100644
@@ -1,15 +1,16 @@
 C C-ISA2+o-r+a-r+a-r+a-o
+//\begin[snippet][labelbase=ln:formal:litmus:C-ISA2+o-r+a-r+a-r+a-o:whole,commandchars=\\\@\$]
 {
 }
 
-{
-#include "api.h"
-}
-
+{                            //\fcvexclude
+#include "api.h"             //\fcvexclude
+}                            //\fcvexclude
+                             //\fcvexclude
 P0(int *x0, int *x1)
 {
      WRITE_ONCE(*x0, 2);
-     smp_store_release(x1, 2);
+     smp_store_release(x1, 2);       //\lnlbl[P0:rel]
 }
 
 
@@ -17,16 +18,16 @@ P1(int *x1, int *x2)
 {
      int r2;
 
-     r2 = smp_load_acquire(x1);
-     smp_store_release(x2, 2);
+     r2 = smp_load_acquire(x1);      //\lnlbl[P1:acq]
+     smp_store_release(x2, 2);       //\lnlbl[P1:rel]
 }
 
 P2(int *x2, int *x3)
 {
      int r2;
 
-     r2 = smp_load_acquire(x2);
-     smp_store_release(x3, 2);
+     r2 = smp_load_acquire(x2);      //\lnlbl[P2:acq]
+     smp_store_release(x3, 2);       //\lnlbl[P2:rel]
 }
 
 P3(int *x3, int *x0)
@@ -34,8 +35,9 @@ P3(int *x3, int *x0)
      int r1;
      int r2;
 
-     r1 = smp_load_acquire(x3);
+     r1 = smp_load_acquire(x3);      //\lnlbl[P3:acq]
      r2 = READ_ONCE(*x0);
 }
 
+//\end[snippet]
 exists (1:r2=2 /\ 2:r2=2 /\ 3:r1=2 /\ 3:r2=0)
memorder/memorder.tex +7 -46
index 8e11e92..d92d1e5 100644
@@ -2841,49 +2841,7 @@ from the passage of time, so that no matter how many threads are
 involved, the corresponding \co{exists} clause cannot trigger.
 
 \begin{listing}[tbp]
-{ \scriptsize
-\begin{verbbox}[\LstLineNo]
-C C-ISA2+o-r+a-r+a-r+a-o
-{
-}
-
-P0(int *x0, int *x1)
-{
-  WRITE_ONCE(*x0, 2);
-  smp_store_release(x1, 2);
-}
-
-
-P1(int *x1, int *x2)
-{
-  int r2;
-
-  r2 = smp_load_acquire(x1);
-  smp_store_release(x2, 2);
-}
-
-P2(int *x2, int *x3)
-{
-  int r2;
-
-  r2 = smp_load_acquire(x2);
-  smp_store_release(x3, 2);
-}
-
-P3(int *x3, int *x0)
-{
-  int r1;
-  int r2;
-
-  r1 = smp_load_acquire(x3);
-  r2 = READ_ONCE(*x0);
-}
-
-exists (1:r2=2 /\ 2:r2=2 /\ 3:r1=2 /\ 3:r2=0)
-\end{verbbox}
-}
-\centering
-\theverbbox
+\input{CodeSamples/formal/litmus/[email protected]}
 \caption{Long ISA2 Release-Acquire Chain}
 \label{lst:memorder:Long ISA2 Release-Acquire Chain}
 \end{listing}
@@ -2899,16 +2857,20 @@ shows a three-step release-acquire chain, but where \co{P3()}'s
 final access is a \co{READ_ONCE()} from \co{x0}, which is
 accessed via \co{WRITE_ONCE()} by \co{P0()}, forming a non-temporal
 load-to-store link between these two processes.
-However, because \co{P0()}'s \co{smp_store_release()} (line~12)
+\begin{lineref}[ln:formal:litmus:C-ISA2+o-r+a-r+a-r+a-o:whole]
+However, because \co{P0()}'s \co{smp_store_release()} (line~\lnref{P0:rel})
 is cumulative, if \co{P3()}'s \co{READ_ONCE()} returns zero,
 this cumulativity will force the \co{READ_ONCE()} to be ordered
 before \co{P0()}'s \co{smp_store_release()}.
-In addition, the release-acquire chain (lines~12, 20, 21, 28, 29, and~37)
+In addition, the release-acquire chain
+(lines~\lnref{P0:rel}, \lnref{P1:acq}, \lnref{P1:rel}, \lnref{P2:acq},
+\lnref{P2:rel}, and~\lnref{P3:acq})
 forces \co{P3()}'s \co{READ_ONCE()} to be ordered after \co{P0()}'s
 \co{smp_store_release()}.
 Because \co{P3()}'s \co{READ_ONCE()} cannot be both before and after
 \co{P0()}'s \co{smp_store_release()}, either or both of two things must
 be true:
+\end{lineref}
 
 \begin{enumerate}
 \item        \co{P3()}'s \co{READ_ONCE()} came after \co{P0()}'s
--

2.7.4

#6 lore raw
Quoted 42 lines · Junchang Wang
Quoted 41 lines · Paul E. McKenney
Quoted 38 lines · Junchang Wang
Quoted 24 lines · Paul E. McKenney
Quoted 22 lines · Akira Yokosawa
Quoted 1 line

From 0e43c93660383b7560c55131754dbc4bfaf13052 Mon Sep 17 00:00:00 2001

From: Akira Yokosawa <[email protected]>
Date: Mon, 5 Nov 2018 20:27:02 +0900
Subject: [PATCH] memorder: Fix line numbers by applying new scheme to C-ISA2+o-r+a-r+a-r+a-o

Line numbers referring to Listing 15.23 don't match the line counts in the snippet. Fix this by putting labels in the source of the litmus test and referring them by \lnref{} macros.

---

Quoted 3 lines · Junchang Wang

This is the only patch for the second half of Chapter Memory Ordering. Please take a look. Thanks.

Good catch!

While we are here, why not apply the new scheme for snippets to this litmus test? Labeling lines in the source code can prevent such mismatches.

Quoted 7 lines
Quoted 3 lines

For the new scheme to support litmus tests, please see commit log of 69a75a84d7c3 ("future/formalregress: Example of extraction of snippet from .litmus file")

Indeed, good catch!!! And here I -thought- that I proof-read this stuff...

Junchang, does Akira's approach look good to you?

Hi Paul,

Sorry for the late response. The new scheme is the right approach in comparison to hard-coding line numbers; Akira's approach looks good to me.

Quoted 5 lines
Quoted 3 lines

Very good! Unless you tell me otherwise, I will add your:

Got it. Thanks a lot.

Queued and pushed, thank you both!

Thanx, Paul

Quoted 169 lines

--Junchang

Quoted 166 lines

This would indicate your approval of Akira's patch.

Thanx, Paul

Quoted 161 lines

@Akira Yokosawa Thanks a lot for pointing me to the right scheme, which looks nice. I believe we programmers tend to hard-coding line numbers/variables at the very beginning of drafting/coding; that's a nice tradeoff between efficiency and portability :-) . I can help check and apply the new scheme in reading through other chapters.

Thanks,
--Junchang

Quoted 149 lines

Thanx, Paul

Quoted 146 lines

Thanks. Akira

--

 .../formal/litmus/C-ISA2+o-r+a-r+a-r+a-o.litmus    | 22 ++++-----
 memorder/memorder.tex                              | 52 +++-------------------
 2 files changed, 19 insertions(+), 55 deletions(-)
CodeSamples/formal/litmus/C-ISA2+o-r+a-r+a-r+a-o.litmus +12 -10
index 343fded..b899369 100644
@@ -1,15 +1,16 @@
 C C-ISA2+o-r+a-r+a-r+a-o
+//\begin[snippet][labelbase=ln:formal:litmus:C-ISA2+o-r+a-r+a-r+a-o:whole,commandchars=\\\@\$]
 {
 }
 
-{
-#include "api.h"
-}
-
+{                            //\fcvexclude
+#include "api.h"             //\fcvexclude
+}                            //\fcvexclude
+                             //\fcvexclude
 P0(int *x0, int *x1)
 {
      WRITE_ONCE(*x0, 2);
-     smp_store_release(x1, 2);
+     smp_store_release(x1, 2);       //\lnlbl[P0:rel]
 }
 
 
@@ -17,16 +18,16 @@ P1(int *x1, int *x2)
 {
      int r2;
 
-     r2 = smp_load_acquire(x1);
-     smp_store_release(x2, 2);
+     r2 = smp_load_acquire(x1);      //\lnlbl[P1:acq]
+     smp_store_release(x2, 2);       //\lnlbl[P1:rel]
 }
 
 P2(int *x2, int *x3)
 {
      int r2;
 
-     r2 = smp_load_acquire(x2);
-     smp_store_release(x3, 2);
+     r2 = smp_load_acquire(x2);      //\lnlbl[P2:acq]
+     smp_store_release(x3, 2);       //\lnlbl[P2:rel]
 }
 
 P3(int *x3, int *x0)
@@ -34,8 +35,9 @@ P3(int *x3, int *x0)
      int r1;
      int r2;
 
-     r1 = smp_load_acquire(x3);
+     r1 = smp_load_acquire(x3);      //\lnlbl[P3:acq]
      r2 = READ_ONCE(*x0);
 }
 
+//\end[snippet]
 exists (1:r2=2 /\ 2:r2=2 /\ 3:r1=2 /\ 3:r2=0)
memorder/memorder.tex +7 -46
index 8e11e92..d92d1e5 100644
@@ -2841,49 +2841,7 @@ from the passage of time, so that no matter how many threads are
 involved, the corresponding \co{exists} clause cannot trigger.
 
 \begin{listing}[tbp]
-{ \scriptsize
-\begin{verbbox}[\LstLineNo]
-C C-ISA2+o-r+a-r+a-r+a-o
-{
-}
-
-P0(int *x0, int *x1)
-{
-  WRITE_ONCE(*x0, 2);
-  smp_store_release(x1, 2);
-}
-
-
-P1(int *x1, int *x2)
-{
-  int r2;
-
-  r2 = smp_load_acquire(x1);
-  smp_store_release(x2, 2);
-}
-
-P2(int *x2, int *x3)
-{
-  int r2;
-
-  r2 = smp_load_acquire(x2);
-  smp_store_release(x3, 2);
-}
-
-P3(int *x3, int *x0)
-{
-  int r1;
-  int r2;
-
-  r1 = smp_load_acquire(x3);
-  r2 = READ_ONCE(*x0);
-}
-
-exists (1:r2=2 /\ 2:r2=2 /\ 3:r1=2 /\ 3:r2=0)
-\end{verbbox}
-}
-\centering
-\theverbbox
+\input{CodeSamples/formal/litmus/[email protected]}
 \caption{Long ISA2 Release-Acquire Chain}
 \label{lst:memorder:Long ISA2 Release-Acquire Chain}
 \end{listing}
@@ -2899,16 +2857,20 @@ shows a three-step release-acquire chain, but where \co{P3()}'s
 final access is a \co{READ_ONCE()} from \co{x0}, which is
 accessed via \co{WRITE_ONCE()} by \co{P0()}, forming a non-temporal
 load-to-store link between these two processes.
-However, because \co{P0()}'s \co{smp_store_release()} (line~12)
+\begin{lineref}[ln:formal:litmus:C-ISA2+o-r+a-r+a-r+a-o:whole]
+However, because \co{P0()}'s \co{smp_store_release()} (line~\lnref{P0:rel})
 is cumulative, if \co{P3()}'s \co{READ_ONCE()} returns zero,
 this cumulativity will force the \co{READ_ONCE()} to be ordered
 before \co{P0()}'s \co{smp_store_release()}.
-In addition, the release-acquire chain (lines~12, 20, 21, 28, 29, and~37)
+In addition, the release-acquire chain
+(lines~\lnref{P0:rel}, \lnref{P1:acq}, \lnref{P1:rel}, \lnref{P2:acq},
+\lnref{P2:rel}, and~\lnref{P3:acq})
 forces \co{P3()}'s \co{READ_ONCE()} to be ordered after \co{P0()}'s
 \co{smp_store_release()}.
 Because \co{P3()}'s \co{READ_ONCE()} cannot be both before and after
 \co{P0()}'s \co{smp_store_release()}, either or both of two things must
 be true:
+\end{lineref}
 
 \begin{enumerate}
 \item        \co{P3()}'s \co{READ_ONCE()} came after \co{P0()}'s
--

2.7.4