diff --git a/theories/utils/spin_lock.v b/theories/utils/spin_lock.v
index 75d65d871b314a537592a764efebd5d6d5a34283..6925075e63ed4ab2c5ecbe25dd409e431fd4e8d1 100644
--- a/theories/utils/spin_lock.v
+++ b/theories/utils/spin_lock.v
@@ -6,7 +6,7 @@ From iris.base_logic.lib Require Import cancelable_invariants.
 From iris.bi.lib Require Import fractional.
 Set Default Proof Using "Type".
 
-Definition newlock : val := λ: <>, ref #false.
+Definition new_lock : val := λ: <>, ref #false.
 Definition try_acquire : val := λ: "l", CAS "l" #false #true.
 Definition acquire : val :=
   rec: "acquire" "l" := if: try_acquire "l" then #() else "acquire" "l".
@@ -63,21 +63,33 @@ Section proof.
   Global Instance unlocked_timeless lk q : Timeless (unlocked lk q).
   Proof. apply _. Qed.
 
-  Lemma newlock_spec (R : iProp Σ):
-    {{{ R }}}
-      newlock #()
-    {{{ lk, RET #lk; is_lock lk R ∗ unlocked lk 1 }}}.
+  Lemma lock_cancel E lk R : ↑ N ⊆ E → is_lock lk R -∗ unlocked lk 1 ={E}=∗ ▷ R.
   Proof.
-    iIntros (Φ) "HR HΦ". rewrite -wp_fupd /newlock /=.
-    wp_lam. wp_apply (wp_alloc with "[//]"); iIntros (l) "[Hl Hm]".
+    intros. iDestruct 1 as (γ γi) "#[Hm Hinv]". iDestruct 1 as (γ' γi') "[Hm' Hq]".
+    iDestruct (meta_agree with "Hm Hm'") as %[= <- <-]; iClear "Hm'".
+    iMod (cinv_open_strong with "[$] [$]") as "(HR & Hq & Hclose)"; first done.
+    iDestruct "HR" as ([]) "[Hl HR]".
+    - iDestruct "HR" as (p) "[_ Hq']". iDestruct (cinv_own_1_l with "Hq Hq'") as ">[]".
+    - iDestruct "HR" as "[_ $]". iApply "Hclose"; auto.
+  Qed.
+
+  Lemma new_lock_spec :
+    {{{ True }}}
+      new_lock #()
+    {{{ lk, RET #lk; unlocked lk 1 ∗ (∀ R, R ={⊤}=∗ is_lock lk R) }}}.
+  Proof.
+    iIntros (Φ) "_ HΦ". iApply wp_fupd. wp_lam.
+    wp_apply (wp_alloc with "[//]"); iIntros (l) "[Hl Hm]".
     iDestruct (meta_token_difference _ (↑N) with "Hm") as "[Hm1 Hm2]"; first done.
     iMod (own_alloc (● None)) as (γ) "Hγ"; first by apply auth_auth_valid.
     iMod (cinv_alloc_strong (λ _, True))
       as (γi _) "[Hγi H]"; first by apply pred_infinite_True.
     iMod (meta_set _ _ (γ,γi) with "Hm1") as "#Hm1"; first done.
+    iApply "HΦ"; iSplitL "Hγi"; first by (iExists γ, γi; auto).
+    iIntros "!>" (R) "HR".
     iMod ("H" $! (lock_inv γ γi l R) with "[HR Hl Hγ]") as "#?".
     { iIntros "!>". iExists false. by iFrame. }
-    iModIntro. iApply "HΦ". iSplit; iExists γ, γi; auto.
+    iModIntro. iExists γ, γi; auto.
   Qed.
 
   Lemma try_acquire_spec lk R q :