From 8bf5d63b3fcd83a1e406a9fcc0250e3b36c48e95 Mon Sep 17 00:00:00 2001
From: Robbert Krebbers <mail@robbertkrebbers.nl>
Date: Thu, 4 Jul 2019 14:09:51 +0200
Subject: [PATCH] Make list_sort_elem prog fork a little less eagerly.

---
 theories/examples/list_sort_elem.v | 24 +++++++++++++++---------
 1 file changed, 15 insertions(+), 9 deletions(-)

diff --git a/theories/examples/list_sort_elem.v b/theories/examples/list_sort_elem.v
index 3b7d5d2..1393810 100644
--- a/theories/examples/list_sort_elem.v
+++ b/theories/examples/list_sort_elem.v
@@ -39,11 +39,14 @@ Definition list_sort_elem_service : val :=
     let: "x" := recv "c" in
     if: ~(recv "c") then send "c" #cont;; send "c" "x";; send "c" #stop else
     let: "y" := recv "c" in
-    let: "c1" := start_chan (λ: "c", "go" "cmp" "c") in
-    let: "c2" := start_chan (λ: "c", "go" "cmp" "c") in
+    let: "cc1" := new_chan #() in
+    let: "c1" := Fst "cc1" in let: "c1'" := Snd "cc1" in
+    let: "cc2" := new_chan #() in
+    let: "c2" := Fst "cc2" in let: "c2'" := Snd "cc2" in
     send "c1" #cont;; send "c1" "x";;
     send "c2" #cont;; send "c2" "y";;
     list_sort_elem_service_split "c" "c1" "c2";;
+    Fork ("go" "cmp" "c1'");; Fork ("go" "cmp" "c2'");;
     let: "x" := (if: recv "c1" then recv "c1" else assert #false) in
     list_sort_elem_service_merge "cmp" "c" "x" "c1" "c2".
 
@@ -194,16 +197,19 @@ Section list_sort_elem.
     wp_rec; wp_pures. wp_branch; wp_pures.
     - wp_recv (x1 v1) as "HIx1". wp_branch; wp_pures.
       + wp_recv (x2 v2) as "HIx2".
-        wp_apply (start_chan_proto_spec N (list_sort_elem_protocol <++> END)%proto).
-        { iIntros (cy) "Hcy". wp_apply ("IH" with "Hcy"). auto. }
-        iIntros (cy) "Hcy".
-        wp_apply (start_chan_proto_spec N (list_sort_elem_protocol <++> END)%proto).
-        { iIntros (cz) "Hcz". wp_apply ("IH" with "Hcz"); auto. }
-        iIntros (cz) "Hcz". rewrite !right_id.
+        wp_apply (new_chan_proto_spec N with "[//]"); iIntros (cy1 cy2) "Hcy".
+        wp_apply (new_chan_proto_spec N with "[//]"); iIntros (cz1 cz2) "Hcz".
+        iMod ("Hcy" $! (list_sort_elem_protocol <++> END)%proto) as "[Hcy1 Hcy2]".
+        iMod ("Hcz" $! (list_sort_elem_protocol <++> END)%proto) as "[Hcz1 Hcz2]".
+        iEval (rewrite right_id) in "Hcy1 Hcz1".
         wp_select. wp_send with "[$HIx1]".
         wp_select. wp_send with "[$HIx2]".
-        wp_apply (list_sort_elem_service_split_spec with "[$Hc $Hcy $Hcz]").
+        wp_apply (list_sort_elem_service_split_spec with "[$Hc $Hcy1 $Hcz1]").
         iIntros (xs' xs1' xs2'); iDestruct 1 as (Hxs') "(Hc & Hcy & Hcz) /=".
+        wp_apply (wp_fork with "[Hcy2]").
+        { iNext. wp_apply ("IH" with "Hcy2"); auto. }
+        wp_apply (wp_fork with "[Hcz2]").
+        { iNext. wp_apply ("IH" with "Hcz2"); auto. }
         wp_branch as %_ | %[]%Permutation_nil_cons.
         wp_recv (x v) as "[_ HIx]".
         wp_apply (list_sort_elem_service_merge_spec _ _ _ _ _ _ [] _ _ _ _ [] []
-- 
GitLab