From 75c9df6433780655c8bc4d0324a4caa961a93c8b Mon Sep 17 00:00:00 2001 From: Ralf Jung <jung@mpi-sws.org> Date: Wed, 3 Aug 2022 16:55:26 -0400 Subject: [PATCH] make tada_lock_state exclusive --- iris_heap_lang/lib/logatom_lock.v | 36 ++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/iris_heap_lang/lib/logatom_lock.v b/iris_heap_lang/lib/logatom_lock.v index 994607d31..3fd5d26ff 100644 --- a/iris_heap_lang/lib/logatom_lock.v +++ b/iris_heap_lang/lib/logatom_lock.v @@ -32,13 +32,26 @@ Section tada. }. Definition tada_lock_state (γ : tada_lock_name) (s : state) : iProp Σ := - ghost_var γ.(tada_lock_name_state) (1/2) s ∗ + ghost_var γ.(tada_lock_name_state) (3/4) s ∗ if s is Locked then - l.(locked) γ.(tada_lock_name_lock) ∗ ghost_var γ.(tada_lock_name_state) (1/2) Locked + l.(locked) γ.(tada_lock_name_lock) ∗ ghost_var γ.(tada_lock_name_state) (1/4) Locked else True. Definition tada_is_lock (γ : tada_lock_name) (lk : val) : iProp Σ := l.(is_lock) γ.(tada_lock_name_lock) lk - (ghost_var γ.(tada_lock_name_state) (1/2) Free). + (ghost_var γ.(tada_lock_name_state) (1/4) Free). + + Global Instance tada_is_lock_persistent γ lk : Persistent (tada_is_lock γ lk). + Proof. apply _. Qed. + Global Instance tada_lock_state_timeless γ s : Timeless (tada_lock_state γ s). + Proof. destruct s; apply _. Qed. + + Lemma tada_lock_state_exclusive γ s1 s2 : + tada_lock_state γ s1 -∗ tada_lock_state γ s2 -∗ False. + Proof. + iIntros "[Hvar1 _] [Hvar2 _]". + iDestruct (ghost_var_valid_2 with "Hvar1 Hvar2") as %[Hval _]. + exfalso. done. + Qed. Lemma newlock_tada_spec : {{{ True }}} @@ -46,7 +59,10 @@ Section tada. {{{ lk γ, RET lk; tada_is_lock γ lk ∗ tada_lock_state γ Free }}}. Proof. iIntros (Φ) "_ HΦ". - iMod (ghost_var_alloc Free) as (γvar) "[Hvar1 Hvar2]". + iMod (ghost_var_alloc Free) as (γvar) "Hvar". + replace 1%Qp with (3/4 + 1/4)%Qp; last first. + { rewrite Qp_three_quarter_quarter //. } + iDestruct "Hvar" as "[Hvar1 Hvar2]". wp_apply (l.(newlock_spec) with "Hvar2"). iIntros (lk γlock) "Hlock". iApply ("HΦ" $! lk (TadaLockName _ _)). @@ -64,7 +80,8 @@ Section tada. iIntros "[Hlocked Hvar1]". iMod "AU" as (s) "[[Hvar2 _] [_ Hclose]]". iDestruct (ghost_var_agree with "Hvar1 Hvar2") as %<-. - iMod (ghost_var_update_halves Locked with "Hvar1 Hvar2") as "[Hvar1 Hvar2]". + iMod (ghost_var_update_2 Locked with "Hvar1 Hvar2") as "[Hvar1 Hvar2]". + { rewrite Qp_quarter_three_quarter //. } iMod ("Hclose" with "[$Hvar2 $Hlocked $Hvar1]"). done. Qed. @@ -76,10 +93,13 @@ Section tada. Proof. iIntros "#Hislock %Φ AU". iApply fupd_wp. iMod "AU" as "[[Hvar1 [Hlocked Hvar2]] [_ Hclose]]". - iMod (ghost_var_update_halves Free with "Hvar1 Hvar2") as "[Hvar1 Hvar2]". - iMod ("Hclose" with "[$Hvar2]"). iModIntro. - wp_apply (l.(release_spec) with "[$Hislock $Hlocked $Hvar1]"). + iMod (ghost_var_update_2 Free with "Hvar1 Hvar2") as "[Hvar1 Hvar2]". + { rewrite Qp_three_quarter_quarter //. } + iMod ("Hclose" with "[$Hvar1]"). iModIntro. + wp_apply (l.(release_spec) with "[$Hislock $Hlocked $Hvar2]"). auto. Qed. End tada. + +Typeclasses Opaque tada_is_lock tada_lock_state. -- GitLab