Skip to content
Snippets Groups Projects
Commit d9c8590e authored by Hai Dang's avatar Hai Dang
Browse files

complete mutex

parent cde6200e
No related branches found
No related tags found
No related merge requests found
...@@ -52,6 +52,7 @@ theories/typing/lib/swap.v ...@@ -52,6 +52,7 @@ theories/typing/lib/swap.v
theories/typing/lib/take_mut.v theories/typing/lib/take_mut.v
theories/typing/lib/rc/rc.v theories/typing/lib/rc/rc.v
theories/typing/lib/rc/weak.v theories/typing/lib/rc/weak.v
theories/typing/lib/mutex/mutex.v
theories/typing/lib/refcell/refcell_code.v theories/typing/lib/refcell/refcell_code.v
theories/typing/lib/refcell/refcell.v theories/typing/lib/refcell/refcell.v
theories/typing/lib/refcell/ref_code.v theories/typing/lib/refcell/ref_code.v
......
...@@ -42,6 +42,8 @@ Section proof. ...@@ -42,6 +42,8 @@ Section proof.
Global Instance lock_proto_inv_ne l γ: NonExpansive (lock_proto_inv l γ). Global Instance lock_proto_inv_ne l γ: NonExpansive (lock_proto_inv l γ).
Proof. rewrite /lock_proto_inv =>????. apply GPS_PPInv_ne. solve_proper. Qed. Proof. rewrite /lock_proto_inv =>????. apply GPS_PPInv_ne. solve_proper. Qed.
Global Instance lock_proto_lc_ne l γ R: NonExpansive (lock_proto_lc l γ R).
Proof. rewrite /lock_proto_lc =>????. solve_proper. Qed.
Global Instance lock_proto_lc_persistent: Persistent (lock_proto_lc l γ R0 R) := _. Global Instance lock_proto_lc_persistent: Persistent (lock_proto_lc l γ R0 R) := _.
......
From Coq.QArith Require Import Qcanon.
From iris.proofmode Require Import tactics. From iris.proofmode Require Import tactics.
From iris.algebra Require Import auth csum frac agree.
From iris.bi Require Import big_op.
From lrust.lang Require Import memcpy lock. From lrust.lang Require Import memcpy lock.
From lrust.lifetime Require Import at_borrow. From lrust.lifetime Require Import at_borrow.
From lrust.typing Require Export type. From lrust.typing Require Export type.
...@@ -11,7 +8,7 @@ Set Default Proof Using "Type". ...@@ -11,7 +8,7 @@ Set Default Proof Using "Type".
Definition mutexN := lrustN .@ "mutex". Definition mutexN := lrustN .@ "mutex".
Section mutex. Section mutex.
Context `{!typeG Σ, lockG Σ}. Context `{!typeG Σ, !lockG Σ}.
(* (*
pub struct Mutex<T: ?Sized> { pub struct Mutex<T: ?Sized> {
...@@ -80,17 +77,17 @@ Section mutex. ...@@ -80,17 +77,17 @@ Section mutex.
Global Instance mutex_wf ty `{!TyWf ty} : TyWf (mutex ty) := Global Instance mutex_wf ty `{!TyWf ty} : TyWf (mutex ty) :=
{ ty_lfts := ty.(ty_lfts); ty_wf_E := ty.(ty_wf_E) }. { ty_lfts := ty.(ty_lfts); ty_wf_E := ty.(ty_wf_E) }.
(* Global Instance mutex_type_ne : TypeNonExpansive mutex. Global Instance mutex_type_ne : TypeNonExpansive mutex.
Proof. Proof.
constructor; constructor;
solve_proper_core ltac:(fun _ => exact: type_dist2_S || solve_proper_core ltac:(fun _ => exact: type_dist2_S ||
f_type_equiv || f_contractive || f_equiv). f_type_equiv || f_contractive || f_equiv).
Qed. *) Qed.
(* Global Instance mutex_ne : NonExpansive mutex. Global Instance mutex_ne : NonExpansive mutex.
Proof. Proof.
constructor; solve_proper_core ltac:(fun _ => (eapply ty_size_ne; try reflexivity) || f_equiv). constructor; solve_proper_core ltac:(fun _ => (eapply ty_size_ne; try reflexivity) || f_equiv).
Qed. *) Qed.
Global Instance mutex_mono E L : Proper (eqtype E L ==> subtype E L) mutex. Global Instance mutex_mono E L : Proper (eqtype E L ==> subtype E L) mutex.
Proof. Proof.
...@@ -133,7 +130,7 @@ Section mutex. ...@@ -133,7 +130,7 @@ Section mutex.
End mutex. End mutex.
Section code. Section code.
Context `{!typeG Σ}. Context `{!typeG Σ, !lockG Σ}.
Definition mutex_new ty : val := Definition mutex_new ty : val :=
funrec: <> ["x"] := funrec: <> ["x"] :=
...@@ -156,13 +153,13 @@ Section code. ...@@ -156,13 +153,13 @@ Section code.
iIntros (tid) "#LFT #HE Hna HL Hk [Hm [Hx _]]". iIntros (tid) "#LFT #HE Hna HL Hk [Hm [Hx _]]".
rewrite !tctx_hasty_val /=. rewrite !tctx_hasty_val /=.
iDestruct (ownptr_uninit_own with "Hm") as (lm vlm) "(% & Hm & Hm†)". iDestruct (ownptr_uninit_own with "Hm") as (lm vlm) "(% & Hm & Hm†)".
subst m. inv_vec vlm=>m vlm. simpl. iDestruct (heap_mapsto_vec_cons with "Hm") as "[Hm0 Hm]". subst m. inv_vec vlm=>m vlm. simpl. iDestruct (own_loc_na_vec_cons with "Hm") as "[Hm0 Hm]".
destruct x as [[|lx|]|]; try done. iDestruct "Hx" as "[Hx Hx†]". destruct x as [[|lx|]|]; try done. iDestruct "Hx" as "[Hx Hx†]".
iDestruct (heap_mapsto_ty_own with "Hx") as (vl) "[>Hx Hxown]". iDestruct (own_loc_na_ty_own with "Hx") as (vl) "[>Hx Hxown]".
(* All right, we are done preparing our context. Let's get going. *) (* All right, we are done preparing our context. Let's get going. *)
wp_op. wp_apply (wp_memcpy with "[$Hm $Hx]"); [by rewrite vec_to_list_length..|]. wp_op. wp_apply (wp_memcpy with "[$Hm $Hx]"); [done|by rewrite vec_to_list_length..|].
iIntros "[Hm Hx]". wp_seq. wp_op. rewrite shift_loc_0. wp_lam. iIntros "[Hm Hx]". wp_seq. wp_op. rewrite shift_0. wp_lam.
wp_write. iApply (wp_hist_inv); [done|]. iIntros "#HINV". wp_write.
(* Switch back to typing mode. *) (* Switch back to typing mode. *)
iApply (type_type _ _ _ [ #lx box (uninit ty.(ty_size)); #lm box (mutex ty)] iApply (type_type _ _ _ [ #lx box (uninit ty.(ty_size)); #lm box (mutex ty)]
with "[] LFT HE Hna HL Hk"); last first. with "[] LFT HE Hna HL Hk"); last first.
...@@ -170,7 +167,8 @@ Section code. ...@@ -170,7 +167,8 @@ Section code.
{ rewrite tctx_interp_cons tctx_interp_singleton tctx_hasty_val' // tctx_hasty_val' //. { rewrite tctx_interp_cons tctx_interp_singleton tctx_hasty_val' // tctx_hasty_val' //.
iFrame. iSplitL "Hx". iFrame. iSplitL "Hx".
- iExists _. iFrame. by rewrite uninit_own vec_to_list_length. - iExists _. iFrame. by rewrite uninit_own vec_to_list_length.
- iExists (#false :: vl). rewrite heap_mapsto_vec_cons. iFrame; eauto. } - iExists (#false :: vl). rewrite own_loc_na_vec_cons.
iFrame "∗ HINV". eauto. }
iApply type_delete; [solve_typing..|]. iApply type_delete; [solve_typing..|].
iApply type_jump; solve_typing. iApply type_jump; solve_typing.
Qed. Qed.
...@@ -193,12 +191,12 @@ Section code. ...@@ -193,12 +191,12 @@ Section code.
iDestruct (ownptr_uninit_own with "Hx") as (lx vlx) "(% & Hx & Hx†)". iDestruct (ownptr_uninit_own with "Hx") as (lx vlx) "(% & Hx & Hx†)".
subst x. simpl. subst x. simpl.
destruct m as [[|lm|]|]; try done. iDestruct "Hm" as "[Hm Hm†]". destruct m as [[|lm|]|]; try done. iDestruct "Hm" as "[Hm Hm†]".
iDestruct (heap_mapsto_ty_own with "Hm") as (vlm) "[>Hm Hvlm]". iDestruct (own_loc_na_ty_own with "Hm") as (vlm) "[>Hm [#HINV Hvlm]]".
inv_vec vlm=>m vlm. destruct m as [[|m|]|]; try by iDestruct "Hvlm" as ">[]". inv_vec vlm=>m vlm. destruct m as [[|m|]|]; try by iDestruct "Hvlm" as ">[]".
simpl. iDestruct (heap_mapsto_vec_cons with "Hm") as "[Hm0 Hm]". simpl. iDestruct (own_loc_na_vec_cons with "Hm") as "[Hm0 Hm]".
iDestruct "Hvlm" as "[_ Hvlm]". iDestruct "Hvlm" as "[_ Hvlm]".
(* All right, we are done preparing our context. Let's get going. *) (* All right, we are done preparing our context. Let's get going. *)
wp_op. wp_apply (wp_memcpy with "[$Hx $Hm]"); [by rewrite vec_to_list_length..|]. wp_op. wp_apply (wp_memcpy with "[$Hx $Hm]"); [done|by rewrite vec_to_list_length..|].
(* FIXME: Swapping the order of $Hx and $Hm breaks. *) (* FIXME: Swapping the order of $Hx and $Hm breaks. *)
iIntros "[Hx Hm]". wp_seq. iIntros "[Hx Hm]". wp_seq.
(* Switch back to typing mode. *) (* Switch back to typing mode. *)
...@@ -208,7 +206,7 @@ Section code. ...@@ -208,7 +206,7 @@ Section code.
{ rewrite tctx_interp_cons tctx_interp_singleton tctx_hasty_val' // tctx_hasty_val' //. { rewrite tctx_interp_cons tctx_interp_singleton tctx_hasty_val' // tctx_hasty_val' //.
iFrame. iSplitR "Hm0 Hm". iFrame. iSplitR "Hm0 Hm".
- iExists _. iFrame. - iExists _. iFrame.
- iExists (_ :: _). rewrite heap_mapsto_vec_cons. iFrame. - iExists (_ :: _). rewrite own_loc_na_vec_cons. iFrame.
rewrite uninit_own. rewrite /= vec_to_list_length. eauto. } rewrite uninit_own. rewrite /= vec_to_list_length. eauto. }
iApply type_delete; [solve_typing..|]. iApply type_delete; [solve_typing..|].
iApply type_jump; solve_typing. iApply type_jump; solve_typing.
...@@ -233,17 +231,17 @@ Section code. ...@@ -233,17 +231,17 @@ Section code.
iMod (lctx_lft_alive_tok α with "HE HL") as () "(Hα & HL & Hclose1)"; iMod (lctx_lft_alive_tok α with "HE HL") as () "(Hα & HL & Hclose1)";
[solve_typing..|]. [solve_typing..|].
iMod (bor_acc_cons with "LFT Hm' Hα") as "[Hm' Hclose2]"; first done. iMod (bor_acc_cons with "LFT Hm' Hα") as "[Hm' Hclose2]"; first done.
wp_op. iDestruct "Hm'" as (vl) "[H↦ Hm']". wp_op. iDestruct "Hm'" as (vl) "[H↦ [#HINV Hm']]".
destruct vl as [|[[|m'|]|] vl]; try done. simpl. destruct vl as [|[[|m'|]|] vl]; try done. simpl.
iDestruct (heap_mapsto_vec_cons with "H↦") as "[H↦1 H↦2]". iDestruct (own_loc_na_vec_cons with "H↦") as "[H↦1 H↦2]".
iDestruct "Hm'" as "[% Hvl]". iDestruct "Hm'" as "[% Hvl]".
iMod ("Hclose2" $! ((lm' + 1) ↦∗: ty_own ty tid)%I with "[H↦1] [H↦2 Hvl]") as "[Hbor Hα]". iMod ("Hclose2" $! ((lm' >> 1) ↦∗: ty_own ty tid)%I with "[H↦1] [H↦2 Hvl]") as "[Hbor Hα]".
{ iIntros "!> Hlm' !>". iNext. clear vl. iDestruct "Hlm'" as (vl) "[H↦ Hlm']". { iIntros "!> Hlm' !>". iNext. clear vl. iDestruct "Hlm'" as (vl) "[H↦ Hlm']".
iExists (_ :: _). rewrite heap_mapsto_vec_cons. do 2 iFrame. done. } iExists (_ :: _). rewrite own_loc_na_vec_cons. do 2 iFrame. iFrame "HINV". eauto. }
{ iExists vl. iFrame. } { iExists vl. iFrame. }
iMod ("Hclose1" with "Hα HL") as "HL". iMod ("Hclose1" with "Hα HL") as "HL".
(* Switch back to typing mode. *) (* Switch back to typing mode. *)
iApply (type_type _ _ _ [ m own_ptr _ _; #(lm' + 1) &uniq{α} ty] iApply (type_type _ _ _ [ m own_ptr _ _; #(lm' >> 1) &uniq{α} ty]
with "[] LFT HE Hna HL Hk"); last first. with "[] LFT HE Hna HL Hk"); last first.
{ rewrite tctx_interp_cons tctx_interp_singleton tctx_hasty_val tctx_hasty_val' //. { rewrite tctx_interp_cons tctx_interp_singleton tctx_hasty_val tctx_hasty_val' //.
unlock. iFrame. } unlock. iFrame. }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment