Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Joseph Tassarotti
iris-coq-public
Commits
eacc4197
Commit
eacc4197
authored
Aug 24, 2016
by
Zhen Zhang
Browse files
Abstract lock interface
parent
a1171d02
Changes
4
Hide whitespace changes
Inline
Side-by-side
_CoqProject
View file @
eacc4197
...
...
@@ -97,6 +97,7 @@ heap_lang/lib/spawn.v
heap_lang/lib/par.v
heap_lang/lib/assert.v
heap_lang/lib/lock.v
heap_lang/lib/spin_lock.v
heap_lang/lib/ticket_lock.v
heap_lang/lib/counter.v
heap_lang/lib/barrier/barrier.v
...
...
heap_lang/lib/lock.v
View file @
eacc4197
From
iris
.
program_logic
Require
Export
weakestpre
.
From
iris
.
heap_lang
Require
Export
lang
.
From
iris
.
proofmode
Require
Import
invariants
tactics
.
From
iris
.
heap_lang
Require
Import
proofmode
notation
.
From
iris
.
algebra
Require
Import
excl
.
(
**
Abstract
Lock
Interface
**
)
From
iris
.
heap_lang
Require
Import
heap
notation
.
Structure
lock
Σ
`
{!
heapG
Σ
}
:=
Lock
{
(
*
--
operations
--
*
)
newlock
:
val
;
acquire
:
val
;
release
:
val
;
(
*
--
predicates
--
*
)
(
*
name
is
used
to
associate
locked
with
is_lock
*
)
name:
Type
;
is_lock
(
N
:
namespace
)
(
γ
:
name
)
(
lock
:
val
)
(
R
:
iProp
Σ
)
:
iProp
Σ
;
locked
(
γ
:
name
)
:
iProp
Σ
;
(
*
--
general
properties
--
*
)
is_lock_ne
N
γ
lk
n
:
Proper
(
dist
n
==>
dist
n
)
(
is_lock
N
γ
lk
);
is_lock_persistent
N
γ
lk
R
:
PersistentP
(
is_lock
N
γ
lk
R
);
locked_timeless
γ
:
TimelessP
(
locked
γ
);
locked_exclusive
γ
:
locked
γ
★
locked
γ
⊢
False
;
(
*
--
operation
specs
--
*
)
newlock_spec
N
(
R
:
iProp
Σ
)
Φ
:
heapN
⊥
N
→
heap_ctx
★
R
★
(
∀
l
γ
,
is_lock
N
γ
l
R
-
★
Φ
l
)
⊢
WP
newlock
#()
{{
Φ
}}
;
acquire_spec
N
γ
lk
R
(
Φ
:
val
→
iProp
Σ
)
:
is_lock
N
γ
lk
R
★
(
locked
γ
-
★
R
-
★
Φ
#())
⊢
WP
acquire
lk
{{
Φ
}}
;
release_spec
N
γ
lk
R
(
Φ
:
val
→
iProp
Σ
)
:
is_lock
N
γ
lk
R
★
locked
γ
★
R
★
Φ
#()
⊢
WP
release
lk
{{
Φ
}}
}
.
Arguments
newlock
{
_
_
}
_.
Arguments
acquire
{
_
_
}
_.
Arguments
release
{
_
_
}
_.
Arguments
is_lock
{
_
_
}
_
_
_
_
_.
Arguments
locked
{
_
_
}
_
_.
Existing
Instances
is_lock_ne
is_lock_persistent
locked_timeless
.
Instance
is_lock_proper
Σ
`
{!
heapG
Σ
}
(
L
:
lock
Σ
)
N
lk
R
:
Proper
((
≡
)
==>
(
≡
))
(
is_lock
L
N
lk
R
)
:=
ne_proper
_.
Definition
newlock
:
val
:=
λ
:
<>
,
ref
#
false
.
Definition
acquire
:
val
:=
rec:
"acquire"
"l"
:=
if:
CAS
"l"
#
false
#
true
then
#()
else
"acquire"
"l"
.
Definition
release
:
val
:=
λ
:
"l"
,
"l"
<-
#
false
.
Global
Opaque
newlock
acquire
release
.
(
**
The
CMRA
we
need
.
*
)
(
*
Not
bundling
heapG
,
as
it
may
be
shared
with
other
users
.
*
)
Class
lockG
Σ
:=
LockG
{
lock_tokG
:>
inG
Σ
(
exclR
unitC
)
}
.
Definition
lock
Σ
:
gFunctors
:=
#[
GFunctor
(
constRF
(
exclR
unitC
))].
Instance
subG_lock
Σ
{
Σ
}
:
subG
lock
Σ
Σ
→
lockG
Σ
.
Proof
.
intros
[
?%
subG_inG
_
]
%
subG_inv
.
split
;
apply
_.
Qed
.
Section
proof
.
Context
`
{!
heapG
Σ
,
!
lockG
Σ
}
(
N
:
namespace
).
Definition
lock_inv
(
γ
:
gname
)
(
l
:
loc
)
(
R
:
iProp
Σ
)
:
iProp
Σ
:=
(
∃
b
:
bool
,
l
↦
#
b
★
if
b
then
True
else
own
γ
(
Excl
())
★
R
)
%
I
.
Definition
is_lock
(
l
:
loc
)
(
R
:
iProp
Σ
)
:
iProp
Σ
:=
(
∃
γ
,
heapN
⊥
N
∧
heap_ctx
∧
inv
N
(
lock_inv
γ
l
R
))
%
I
.
Definition
locked
(
l
:
loc
)
(
R
:
iProp
Σ
)
:
iProp
Σ
:=
(
∃
γ
,
heapN
⊥
N
∧
heap_ctx
∧
inv
N
(
lock_inv
γ
l
R
)
∧
own
γ
(
Excl
()))
%
I
.
Global
Instance
lock_inv_ne
n
γ
l
:
Proper
(
dist
n
==>
dist
n
)
(
lock_inv
γ
l
).
Proof
.
solve_proper
.
Qed
.
Global
Instance
is_lock_ne
n
l
:
Proper
(
dist
n
==>
dist
n
)
(
is_lock
l
).
Proof
.
solve_proper
.
Qed
.
Global
Instance
locked_ne
n
l
:
Proper
(
dist
n
==>
dist
n
)
(
locked
l
).
Proof
.
solve_proper
.
Qed
.
(
**
The
main
proofs
.
*
)
Global
Instance
is_lock_persistent
l
R
:
PersistentP
(
is_lock
l
R
).
Proof
.
apply
_.
Qed
.
Lemma
locked_is_lock
l
R
:
locked
l
R
⊢
is_lock
l
R
.
Proof
.
rewrite
/
is_lock
.
iDestruct
1
as
(
γ
)
"(?&?&?&_)"
;
eauto
.
Qed
.
Lemma
newlock_spec
(
R
:
iProp
Σ
)
Φ
:
heapN
⊥
N
→
heap_ctx
★
R
★
(
∀
l
,
is_lock
l
R
-
★
Φ
#
l
)
⊢
WP
newlock
#()
{{
Φ
}}
.
Proof
.
iIntros
(
?
)
"(#Hh & HR & HΦ)"
.
rewrite
/
newlock
/=
.
wp_seq
.
wp_alloc
l
as
"Hl"
.
iVs
(
own_alloc
(
Excl
()))
as
(
γ
)
"Hγ"
;
first
done
.
iVs
(
inv_alloc
N
_
(
lock_inv
γ
l
R
)
with
"[-HΦ]"
)
as
"#?"
.
{
iIntros
"!>"
.
iExists
false
.
by
iFrame
.
}
iVsIntro
.
iApply
"HΦ"
.
iExists
γ
;
eauto
.
Qed
.
Lemma
acquire_spec
l
R
(
Φ
:
val
→
iProp
Σ
)
:
is_lock
l
R
★
(
locked
l
R
-
★
R
-
★
Φ
#())
⊢
WP
acquire
#
l
{{
Φ
}}
.
Proof
.
iIntros
"[Hl HΦ]"
.
iDestruct
"Hl"
as
(
γ
)
"(%&#?&#?)"
.
iL
ö
b
as
"IH"
.
wp_rec
.
wp_bind
(
CAS
_
_
_
)
%
E
.
iInv
N
as
([])
"[Hl HR]"
"Hclose"
.
-
wp_cas_fail
.
iVs
(
"Hclose"
with
"[Hl]"
);
first
(
iNext
;
iExists
true
;
eauto
).
iVsIntro
.
wp_if
.
by
iApply
"IH"
.
-
wp_cas_suc
.
iDestruct
"HR"
as
"[Hγ HR]"
.
iVs
(
"Hclose"
with
"[Hl]"
);
first
(
iNext
;
iExists
true
;
eauto
).
iVsIntro
.
wp_if
.
iApply
(
"HΦ"
with
"[-HR] HR"
).
iExists
γ
;
eauto
.
Qed
.
Lemma
release_spec
R
l
(
Φ
:
val
→
iProp
Σ
)
:
locked
l
R
★
R
★
Φ
#()
⊢
WP
release
#
l
{{
Φ
}}
.
Proof
.
iIntros
"(Hl&HR&HΦ)"
;
iDestruct
"Hl"
as
(
γ
)
"(% & #? & #? & Hγ)"
.
rewrite
/
release
/=
.
wp_let
.
iInv
N
as
(
b
)
"[Hl _]"
"Hclose"
.
wp_store
.
iFrame
"HΦ"
.
iApply
"Hclose"
.
iNext
.
iExists
false
.
by
iFrame
.
Qed
.
End
proof
.
heap_lang/lib/spin_lock.v
0 → 100644
View file @
eacc4197
From
iris
.
program_logic
Require
Export
weakestpre
.
From
iris
.
heap_lang
Require
Export
lang
.
From
iris
.
proofmode
Require
Import
invariants
tactics
.
From
iris
.
heap_lang
Require
Import
proofmode
notation
.
From
iris
.
algebra
Require
Import
excl
.
From
iris
.
heap_lang
.
lib
Require
Import
lock
.
Definition
newlock
:
val
:=
λ
:
<>
,
ref
#
false
.
Definition
acquire
:
val
:=
rec:
"acquire"
"l"
:=
if:
CAS
"l"
#
false
#
true
then
#()
else
"acquire"
"l"
.
Definition
release
:
val
:=
λ
:
"l"
,
"l"
<-
#
false
.
Global
Opaque
newlock
acquire
release
.
(
**
The
CMRA
we
need
.
*
)
(
*
Not
bundling
heapG
,
as
it
may
be
shared
with
other
users
.
*
)
Class
lockG
Σ
:=
LockG
{
lock_tokG
:>
inG
Σ
(
exclR
unitC
)
}
.
Definition
lock
Σ
:
gFunctors
:=
#[
GFunctor
(
constRF
(
exclR
unitC
))].
Instance
subG_lock
Σ
{
Σ
}
:
subG
lock
Σ
Σ
→
lockG
Σ
.
Proof
.
intros
[
?%
subG_inG
_
]
%
subG_inv
.
split
;
apply
_.
Qed
.
Section
proof
.
Context
`
{!
heapG
Σ
,
!
lockG
Σ
}
(
N
:
namespace
).
Definition
lock_inv
(
γ
:
gname
)
(
l
:
loc
)
(
R
:
iProp
Σ
)
:
iProp
Σ
:=
(
∃
b
:
bool
,
l
↦
#
b
★
if
b
then
True
else
own
γ
(
Excl
())
★
R
)
%
I
.
Definition
is_lock
(
γ
:
gname
)
(
lk
:
val
)
(
R
:
iProp
Σ
)
:
iProp
Σ
:=
(
∃
(
l
:
loc
),
heapN
⊥
N
∧
heap_ctx
∧
lk
=
#
l
∧
inv
N
(
lock_inv
γ
l
R
))
%
I
.
Definition
locked
(
γ
:
gname
)
:
iProp
Σ
:=
own
γ
(
Excl
())
%
I
.
Lemma
locked_exclusive
(
γ
:
gname
)
:
(
locked
γ
★
locked
γ
⊢
False
)
%
I
.
Proof
.
iIntros
"[Hl Hl']"
.
iCombine
"Hl"
"Hl'"
as
"Hl"
.
by
iDestruct
(
own_valid
with
"Hl"
)
as
%
[].
Qed
.
Global
Instance
lock_inv_ne
n
γ
l
:
Proper
(
dist
n
==>
dist
n
)
(
lock_inv
γ
l
).
Proof
.
solve_proper
.
Qed
.
Global
Instance
is_lock_ne
n
l
:
Proper
(
dist
n
==>
dist
n
)
(
is_lock
γ
l
).
Proof
.
solve_proper
.
Qed
.
(
*
Global
Instance
locked_ne
n
γ
:
Proper
(
dist
n
==>
dist
n
)
(
locked
γ
).
*
)
(
*
Proof
.
solve_proper
.
Qed
.
*
)
(
**
The
main
proofs
.
*
)
Global
Instance
is_lock_persistent
γ
l
R
:
PersistentP
(
is_lock
γ
l
R
).
Proof
.
apply
_.
Qed
.
(
*
Lemma
locked_is_lock
lk
R
:
locked
lk
R
⊢
is_lock
lk
R
.
*
)
(
*
Proof
.
rewrite
/
is_lock
.
iDestruct
1
as
(
γ
l
)
"(?&?&?&?&_)"
.
iExists
γ
,
l
.
auto
.
Qed
.
*
)
Global
Instance
locked_timeless
γ
:
TimelessP
(
locked
γ
).
Proof
.
apply
_.
Qed
.
Lemma
newlock_spec
(
R
:
iProp
Σ
)
Φ
:
heapN
⊥
N
→
heap_ctx
★
R
★
(
∀
lk
γ
,
is_lock
γ
lk
R
-
★
Φ
lk
)
⊢
WP
newlock
#()
{{
Φ
}}
.
Proof
.
iIntros
(
?
)
"(#Hh & HR & HΦ)"
.
rewrite
/
newlock
.
wp_seq
.
wp_alloc
l
as
"Hl"
.
iVs
(
own_alloc
(
Excl
()))
as
(
γ
)
"Hγ"
;
first
done
.
iVs
(
inv_alloc
N
_
(
lock_inv
γ
l
R
)
with
"[-HΦ]"
)
as
"#?"
.
{
iIntros
"!>"
.
iExists
false
.
by
iFrame
.
}
iVsIntro
.
iApply
"HΦ"
.
iExists
l
.
eauto
.
Qed
.
Lemma
acquire_spec
γ
lk
R
(
Φ
:
val
→
iProp
Σ
)
:
is_lock
γ
lk
R
★
(
locked
γ
-
★
R
-
★
Φ
#())
⊢
WP
acquire
lk
{{
Φ
}}
.
Proof
.
iIntros
"[Hl HΦ]"
.
iDestruct
"Hl"
as
(
l
)
"(% & #? & % & #?)"
.
subst
.
iL
ö
b
as
"IH"
.
wp_rec
.
wp_bind
(
CAS
_
_
_
)
%
E
.
iInv
N
as
([])
"[Hl HR]"
"Hclose"
.
-
wp_cas_fail
.
iVs
(
"Hclose"
with
"[Hl]"
);
first
(
iNext
;
iExists
true
;
eauto
).
iVsIntro
.
wp_if
.
by
iApply
"IH"
.
-
wp_cas_suc
.
iDestruct
"HR"
as
"[Hγ HR]"
.
iVs
(
"Hclose"
with
"[Hl]"
);
first
(
iNext
;
iExists
true
;
eauto
).
iVsIntro
.
wp_if
.
iApply
(
"HΦ"
with
"[-HR] HR"
).
by
iFrame
.
Qed
.
Lemma
release_spec
γ
lk
R
(
Φ
:
val
→
iProp
Σ
)
:
is_lock
γ
lk
R
★
locked
γ
★
R
★
Φ
#()
⊢
WP
release
lk
{{
Φ
}}
.
Proof
.
iIntros
"(Hlock & Hlocked & HR & HΦ)"
.
iDestruct
"Hlock"
as
(
l
)
"(% & #? & % & #?)"
.
subst
.
rewrite
/
release
.
wp_let
.
iInv
N
as
(
b
)
"[Hl _]"
"Hclose"
.
wp_store
.
iFrame
"HΦ"
.
iApply
"Hclose"
.
iNext
.
iExists
false
.
by
iFrame
.
Qed
.
End
proof
.
Definition
spin_lock
`
{!
heapG
Σ
,
!
lockG
Σ
}
:=
Lock
_
_
newlock
acquire
release
gname
is_lock
locked
_
_
_
locked_exclusive
newlock_spec
acquire_spec
release_spec
.
heap_lang/lib/ticket_lock.v
View file @
eacc4197
...
...
@@ -4,6 +4,7 @@ From iris.program_logic Require Import auth.
From
iris
.
proofmode
Require
Import
invariants
.
From
iris
.
heap_lang
Require
Import
proofmode
notation
.
From
iris
.
algebra
Require
Import
gset
.
From
iris
.
heap_lang
.
lib
Require
Import
lock
.
Import
uPred
.
Definition
wait_loop
:
val
:=
...
...
@@ -43,65 +44,70 @@ Instance subG_tlockΣ {Σ} : subG tlockΣ Σ → tlockG Σ.
Proof
.
intros
[
?
[
?%
subG_inG
_
]
%
subG_inv
]
%
subG_inv
.
split
;
apply
_.
Qed
.
Section
proof
.
Context
`
{!
heapG
Σ
,
!
tlockG
Σ
}
(
N
:
namespace
)
(
HN
:
heapN
⊥
N
)
.
Context
`
{!
heapG
Σ
,
!
tlockG
Σ
}
(
N
:
namespace
).
Definition
tickets_inv
(
n
:
nat
)
(
gs
:
gset_disjUR
nat
)
:
iProp
Σ
:=
(
gs
=
GSet
(
seq_set
0
n
))
%
I
.
Definition
tickets_inv
(
n
:
nat
)
(
gs
:
gset_disjUR
nat
)
:
iProp
Σ
:=
(
gs
=
GSet
(
seq_set
0
n
))
%
I
.
Definition
lock_inv
(
γ
1
γ
2
:
gname
)
(
lo
ln
:
loc
)
(
R
:
iProp
Σ
)
:
iProp
Σ
:=
(
∃
(
o
n
:
nat
),
Definition
lock_inv
(
γ
1
γ
2
:
gname
)
(
lo
ln
:
loc
)
(
R
:
iProp
Σ
)
:
iProp
Σ
:=
(
∃
(
o
n
:
nat
),
lo
↦
#
o
★
ln
↦
#
n
★
auth_inv
γ
1
(
tickets_inv
n
)
★
((
own
γ
2
(
Excl
())
★
R
)
∨
auth_own
γ
1
(
GSet
{
[
o
]
}
)))
%
I
.
Definition
is_lock
(
l
:
val
)
(
R
:
iProp
Σ
)
:
iProp
Σ
:=
(
∃
γ
1
γ
2
(
lo
ln
:
loc
),
heap_ctx
∧
l
=
(#
lo
,
#
ln
)
%
V
∧
inv
N
(
lock_inv
γ
1
γ
2
lo
ln
R
))
%
I
.
Definition
issued
(
l
:
val
)
(
x
:
nat
)
(
R
:
iProp
Σ
)
:
iProp
Σ
:=
(
∃
γ
1
γ
2
(
lo
ln
:
loc
),
heap_ctx
∧
l
=
(#
lo
,
#
ln
)
%
V
∧
inv
N
(
lock_inv
γ
1
γ
2
lo
ln
R
)
∧
auth_own
γ
1
(
GSet
{
[
x
]
}
))
%
I
.
Definition
locked
(
l
:
val
)
(
R
:
iProp
Σ
)
:
iProp
Σ
:=
(
∃
γ
1
γ
2
(
lo
ln
:
loc
),
heap_ctx
∧
l
=
(#
lo
,
#
ln
)
%
V
∧
inv
N
(
lock_inv
γ
1
γ
2
lo
ln
R
)
∧
own
γ
2
(
Excl
()))
%
I
.
Global
Instance
lock_inv_ne
n
γ
1
γ
2
lo
ln
:
Proper
(
dist
n
==>
dist
n
)
(
lock_inv
γ
1
γ
2
lo
ln
).
Proof
.
solve_proper
.
Qed
.
Global
Instance
is_lock_ne
n
l
:
Proper
(
dist
n
==>
dist
n
)
(
is_lock
l
).
Proof
.
solve_proper
.
Qed
.
Global
Instance
locked_ne
n
l
:
Proper
(
dist
n
==>
dist
n
)
(
locked
l
).
Proof
.
solve_proper
.
Qed
.
Global
Instance
is_lock_persistent
l
R
:
PersistentP
(
is_lock
l
R
).
Proof
.
apply
_.
Qed
.
Lemma
newlock_spec
(
R
:
iProp
Σ
)
Φ
:
heap_ctx
★
R
★
(
∀
l
,
is_lock
l
R
-
★
Φ
l
)
⊢
WP
newlock
#()
{{
Φ
}}
.
Definition
is_lock
(
γ
s
:
gname
*
gname
)
(
l
:
val
)
(
R
:
iProp
Σ
)
:
iProp
Σ
:=
(
∃
(
lo
ln
:
loc
),
heapN
⊥
N
∧
heap_ctx
∧
l
=
(#
lo
,
#
ln
)
%
V
∧
inv
N
(
lock_inv
(
fst
γ
s
)
(
snd
γ
s
)
lo
ln
R
))
%
I
.
Definition
issued
(
γ
s
:
gname
*
gname
)
(
l
:
val
)
(
x
:
nat
)
(
R
:
iProp
Σ
)
:
iProp
Σ
:=
(
∃
(
lo
ln
:
loc
),
heapN
⊥
N
∧
heap_ctx
∧
l
=
(#
lo
,
#
ln
)
%
V
∧
inv
N
(
lock_inv
(
fst
γ
s
)
(
snd
γ
s
)
lo
ln
R
)
∧
auth_own
(
fst
γ
s
)
(
GSet
{
[
x
]
}
))
%
I
.
Definition
locked
(
γ
s
:
gname
*
gname
)
:
iProp
Σ
:=
own
(
snd
γ
s
)
(
Excl
())
%
I
.
Global
Instance
lock_inv_ne
n
γ
1
γ
2
lo
ln
:
Proper
(
dist
n
==>
dist
n
)
(
lock_inv
γ
1
γ
2
lo
ln
).
Proof
.
solve_proper
.
Qed
.
Global
Instance
is_lock_ne
γ
s
n
l
:
Proper
(
dist
n
==>
dist
n
)
(
is_lock
γ
s
l
).
Proof
.
solve_proper
.
Qed
.
Global
Instance
is_lock_persistent
γ
s
l
R
:
PersistentP
(
is_lock
γ
s
l
R
).
Proof
.
apply
_.
Qed
.
Global
Instance
locked_timeless
γ
s
:
TimelessP
(
locked
γ
s
).
Proof
.
apply
_.
Qed
.
Lemma
locked_exclusive
(
γ
s
:
gname
*
gname
)
:
(
locked
γ
s
★
locked
γ
s
⊢
False
)
%
I
.
Proof
.
iIntros
"[Hl Hl']"
.
iCombine
"Hl"
"Hl'"
as
"Hl"
.
by
iDestruct
(
own_valid
with
"Hl"
)
as
%
[].
Qed
.
Lemma
newlock_spec
(
R
:
iProp
Σ
)
Φ
:
heapN
⊥
N
→
heap_ctx
★
R
★
(
∀
lk
γ
s
,
is_lock
γ
s
lk
R
-
★
Φ
lk
)
⊢
WP
newlock
#()
{{
Φ
}}
.
Proof
.
iIntros
(
HN
)
"(#Hh & HR & HΦ)"
.
rewrite
/
newlock
.
wp_seq
.
wp_alloc
lo
as
"Hlo"
.
wp_alloc
ln
as
"Hln"
.
iVs
(
own_alloc
(
Excl
()))
as
(
γ
2
)
"Hγ2"
;
first
done
.
iVs
(
own_alloc_strong
(
Auth
(
Excl
'
∅
)
∅
)
{
[
γ
2
]
}
)
as
(
γ
1
)
"[% Hγ1]"
;
first
done
.
iVs
(
inv_alloc
N
_
(
lock_inv
γ
1
γ
2
lo
ln
R
)
with
"[-HΦ]"
).
-
iNext
.
rewrite
/
lock_inv
.
iExists
0
%
nat
,
0
%
nat
.
iFrame
.
iSplitL
"Hγ1"
.
+
rewrite
/
auth_inv
.
iExists
(
GSet
∅
).
by
iFrame
.
+
iLeft
.
by
iFrame
.
-
iVsIntro
.
iSpecialize
(
"HΦ"
$
!
(#
lo
,
#
ln
)
%
V
(
γ
1
,
γ
2
)).
iApply
"HΦ"
.
iExists
lo
,
ln
.
iSplit
;
by
eauto
.
Qed
.
Lemma
wait_loop_spec
γ
s
l
x
R
(
Φ
:
val
→
iProp
Σ
)
:
issued
γ
s
l
x
R
★
(
locked
γ
s
-
★
R
-
★
Φ
#())
⊢
WP
wait_loop
#
x
l
{{
Φ
}}
.
Proof
.
iIntros
"(#Hh & HR & HΦ)"
.
rewrite
/
newlock
/=
.
wp_seq
.
wp_alloc
lo
as
"Hlo"
.
wp_alloc
ln
as
"Hln"
.
iVs
(
own_alloc
(
Excl
()))
as
(
γ
2
)
"Hγ2"
;
first
done
.
iVs
(
own_alloc_strong
(
Auth
(
Excl
'
∅
)
∅
)
{
[
γ
2
]
}
)
as
(
γ
1
)
"[% Hγ1]"
;
first
done
.
iVs
(
inv_alloc
N
_
(
lock_inv
γ
1
γ
2
lo
ln
R
)
with
"[-HΦ]"
).
{
iNext
.
rewrite
/
lock_inv
.
iExists
0
%
nat
,
0
%
nat
.
iFrame
.
iSplitL
"Hγ1"
.
{
rewrite
/
auth_inv
.
iExists
(
GSet
∅
).
by
iFrame
.
}
iLeft
.
by
iFrame
.
}
iVsIntro
.
iApply
"HΦ"
.
iExists
γ
1
,
γ
2
,
lo
,
ln
.
iSplit
;
by
auto
.
Qed
.
Lemma
wait_loop_spec
l
x
R
(
Φ
:
val
→
iProp
Σ
)
:
issued
l
x
R
★
(
∀
l
,
locked
l
R
-
★
R
-
★
Φ
#())
⊢
WP
wait_loop
#
x
l
{{
Φ
}}
.
Proof
.
iIntros
"[Hl HΦ]"
.
iDestruct
"Hl"
as
(
γ
1
γ
2
lo
ln
)
"(#? & % & #? & Ht)"
.
iIntros
"[Hl HΦ]"
.
iDestruct
"Hl"
as
(
lo
ln
)
"(% & #? & % & #? & Ht)"
.
iL
ö
b
as
"IH"
.
wp_rec
.
subst
.
wp_let
.
wp_proj
.
wp_bind
(
!
_
)
%
E
.
iInv
N
as
(
o
n
)
"[Hlo [Hln Ha]]"
"Hclose"
.
wp_load
.
destruct
(
decide
(
x
=
o
))
as
[
->|
Hneq
].
...
...
@@ -110,7 +116,7 @@ Proof.
{
iNext
.
iExists
o
,
n
.
iFrame
.
eauto
.
}
iVsIntro
.
wp_let
.
wp_op
=>
[
_
|
[]]
//.
wp_if
.
iVsIntro
.
iApply
(
"HΦ"
with
"[-HR] HR"
).
iExists
γ
1
,
γ
2
,
lo
,
ln
;
eauto
.
iApply
(
"HΦ"
with
"[-HR] HR"
).
eauto
.
+
iExFalso
.
iCombine
"Ht"
"Haown"
as
"Haown"
.
iDestruct
(
auth_own_valid
with
"Haown"
)
as
%
?%
gset_disj_valid_op
.
set_solver
.
...
...
@@ -120,10 +126,10 @@ Proof.
wp_if
.
iApply
(
"IH"
with
"Ht"
).
by
iExact
"HΦ"
.
Qed
.
Lemma
acquire_spec
l
R
(
Φ
:
val
→
iProp
Σ
)
:
is_lock
l
R
★
(
∀
l
,
locked
l
R
-
★
R
-
★
Φ
#())
⊢
WP
acquire
l
{{
Φ
}}
.
Lemma
acquire_spec
γ
s
l
R
(
Φ
:
val
→
iProp
Σ
)
:
is_lock
γ
s
l
R
★
(
locked
γ
s
-
★
R
-
★
Φ
#())
⊢
WP
acquire
l
{{
Φ
}}
.
Proof
.
iIntros
"[Hl HΦ]"
.
iDestruct
"Hl"
as
(
γ
1
γ
2
lo
ln
)
"(#? & % & #?)"
.
iIntros
"[Hl HΦ]"
.
iDestruct
"Hl"
as
(
lo
ln
)
"(
% &
#? & % & #?)"
.
iL
ö
b
as
"IH"
.
wp_rec
.
wp_bind
(
!
_
)
%
E
.
subst
.
wp_proj
.
iInv
N
as
(
o
n
)
"[Hlo [Hln Ha]]"
"Hclose"
.
wp_load
.
iVs
(
"Hclose"
with
"[Hlo Hln Ha]"
).
...
...
@@ -145,8 +151,8 @@ Proof.
rewrite
Nat2Z
.
inj_succ
-
Z
.
add_1_r
.
iFrame
.
iExists
(
GSet
(
seq_set
0
(
S
n
))).
by
iFrame
.
}
iVsIntro
.
wp_if
.
iApply
(
wait_loop_spec
(#
lo
,
#
ln
)).
iSplitR
"HΦ"
;
last
by
done
.
iApply
(
wait_loop_spec
γ
s
(#
lo
,
#
ln
)).
iSplitR
"HΦ"
;
last
by
auto
.
rewrite
/
issued
/
auth_own
;
eauto
10.
-
wp_cas_fail
.
iVs
(
"Hclose"
with
"[Hlo' Hln' Hainv Haown]"
).
...
...
@@ -154,10 +160,10 @@ Proof.
iVsIntro
.
wp_if
.
by
iApply
"IH"
.
Qed
.
Lemma
release_spec
R
l
(
Φ
:
val
→
iProp
Σ
)
:
lock
ed
l
R
★
R
★
Φ
#()
⊢
WP
release
l
{{
Φ
}}
.
Lemma
release_spec
γ
s
l
R
(
Φ
:
val
→
iProp
Σ
)
:
is_
lock
γ
s
l
R
★
locked
γ
s
★
R
★
Φ
#()
⊢
WP
release
l
{{
Φ
}}
.
Proof
.
iIntros
"(Hl & HR & HΦ)"
;
iDestruct
"Hl"
as
(
γ
1
γ
2
lo
ln
)
"(#? & % & #?
& Hγ
)"
.
iIntros
"(Hl &
Hγ &
HR & HΦ)"
.
iDestruct
"Hl"
as
(
lo
ln
)
"(
% &
#? & % & #?)"
.
iL
ö
b
as
"IH"
.
wp_rec
.
subst
.
wp_proj
.
wp_bind
(
!
_
)
%
E
.
iInv
N
as
(
o
n
)
"[Hlo [Hln Hr]]"
"Hclose"
.
wp_load
.
iVs
(
"Hclose"
with
"[Hlo Hln Hr]"
).
...
...
@@ -182,3 +188,6 @@ Qed.
End
proof
.
Typeclasses
Opaque
is_lock
issued
locked
.
Definition
ticket_lock
`
{!
heapG
Σ
,
!
tlockG
Σ
}
:=
Lock
_
_
newlock
acquire
release
(
gname
*
gname
)
is_lock
locked
_
_
_
locked_exclusive
newlock_spec
acquire_spec
release_spec
.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment