Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
E
examples
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
1
Issues
1
List
Boards
Labels
Milestones
Merge Requests
3
Merge Requests
3
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Iris
examples
Commits
637f31c7
Commit
637f31c7
authored
Sep 19, 2016
by
Zhen Zhang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
in revising doOp; MY HEAD IS BURNING
parent
15aeea0a
Changes
1
Hide whitespace changes
Inline
Sidebyside
Showing
1 changed file
with
34 additions
and
81 deletions
+34
81
srv.v
srv.v
+34
81
No files found.
srv.v
View file @
637f31c7
...
...
@@ 184,90 +184,43 @@ Section proof.
{
admit
.
}
iApply
(
"HΦ"
with
"Ho2 Ho3 Hfrag Hx2"
).
Admitted
.
Lemma
mk_srv_spec
(
f
:
val
)
Q
:
heapN
⊥
N
→
heap_ctx
★
□
(
∀
x
:
val
,
WP
f
x
{{
v
,
■
Q
x
v
}})
⊢
WP
mk_srv
f
{{
f'
,
□
(
∀
x
:
val
,
WP
f'
x
{{
v
,
■
Q
x
v
}})}}.
Definition
doOp_triple
(
f
:
val
)
p
γ
x
γ
1
γ
2
γ
3
γ
4
Q
:
iProp
Σ
:
=
atomic_triple
(
fun
_:
()
=>
p_inv
γ
x
γ
1
γ
2
γ
3
γ
4
p
Q
★
(
own
γ
2
(
Excl
())
∨
own
γ
1
(
Excl
()))
★
□
(
∀
x
:
val
,
WP
f
x
{{
v
,
■
Q
x
v
}}))%
I
(
fun
_
ret
=>
(
own
γ
2
(
Excl
())
∨
own
γ
1
(
Excl
()))
★
ret
=
#()
★
p_inv
γ
x
γ
1
γ
2
γ
3
γ
4
p
Q
)%
I
(
nclose
heapN
)
⊤
(
doOp
f
#
p
).
Lemma
doOp_spec
(
f
:
val
)
p
γ
x
γ
1
γ
2
γ
3
γ
4
R
:
heapN
⊥
N
→
heap_ctx
⊢
doOp_triple
f
p
γ
x
γ
1
γ
2
γ
3
γ
4
R
.
Proof
.
iIntros
(
HN
)
"[#Hh #Hf]"
.
wp_let
.
wp_alloc
p
as
"Hp"
.
iVs
(
own_alloc
(
Excl
()))
as
(
γ
1
)
"Ho1"
;
first
done
.
iVs
(
own_alloc
(
Excl
()))
as
(
γ
2
)
"Ho2"
;
first
done
.
iVs
(
own_alloc
(
Excl
()))
as
(
γ
3
)
"Ho3"
;
first
done
.
iVs
(
own_alloc
(
Excl
()))
as
(
γ
4
)
"Ho4"
;
first
done
.
iVs
(
own_alloc
(
1
%
Qp
,
DecAgree
#
0
))
as
(
γ
x
)
"Hx"
;
first
done
.
iVs
(
inv_alloc
N
_
(
srv_inv
γ
x
γ
1
γ
2
γ
3
γ
4
p
Q
)
with
"[Hp Ho1 Ho3]"
)
as
"#?"
.
{
iNext
.
rewrite
/
srv_inv
.
iLeft
.
iExists
#
0
.
by
iFrame
.
}
wp_let
.
wp_bind
(
newlock
_
).
iApply
newlock_spec
=>//.
iFrame
"Hh"
.
iAssert
(
∃
x
,
own
γ
x
(
1
%
Qp
,
DecAgree
x
)
★
own
γ
4
(
Excl
()))%
I
with
"[Ho4 Hx]"
as
"Hinv"
.
{
iExists
#
0
.
by
iFrame
.
}
iFrame
"Hinv"
.
iIntros
(
lk
γ
lk
)
"#Hlk"
.
wp_let
.
wp_apply
wp_fork
.
iSplitR
"Ho2"
.

(* client closure *)
iVsIntro
.
wp_seq
.
iVsIntro
.
iAlways
.
iIntros
(
x
).
wp_let
.
wp_bind
(
acquire
_
).
iApply
acquire_spec
.
iFrame
"Hlk"
.
iIntros
"Hlked Ho"
.
iDestruct
"Ho"
as
(
x'
)
"[Hx Ho4]"
.
wp_seq
.
wp_bind
(
_
<
_
)%
E
.
iInv
N
as
">Hinv"
"Hclose"
.
iDestruct
"Hinv"
as
"[Hinv[Hinv[HinvHinv]]]"
.
+
iDestruct
"Hinv"
as
(?)
"(Hp & Ho1 & Ho3)"
.
wp_store
.
iAssert
(=
r
=>
own
γ
x
(
1
%
Qp
,
DecAgree
x
))%
I
with
"[Hx]"
as
"==>Hx"
.
{
iDestruct
(
own_update
with
"Hx"
)
as
"Hx"
;
last
by
iAssumption
.
apply
cmra_update_exclusive
.
done
.
}
iAssert
(=
r
=>
own
γ
x
(((
1
/
2
)%
Qp
,
DecAgree
x
)
⋅
((
1
/
2
)%
Qp
,
DecAgree
x
)))%
I
with
"[Hx]"
as
"==>[Hx1 Hx2]"
.
{
iDestruct
(
own_update
with
"Hx"
)
as
"Hx"
;
last
by
iAssumption
.
by
apply
pair_l_frac_op_1'
.
}
iVs
(
"Hclose"
with
"[Hp Hx1 Ho1 Ho4]"
).
{
iNext
.
iRight
.
iLeft
.
iExists
x
.
by
iFrame
.
}
iVsIntro
.
wp_seq
.
wp_bind
(
wait
_
).
iApply
(
wait_spec
with
"[Hx2 Ho3 Hlked]"
)
;
first
by
done
.
iFrame
"Hh"
.
iFrame
"#"
.
iFrame
.
iIntros
(
y
)
"Ho4 Hx %"
.
wp_let
.
wp_bind
(
release
_
).
iApply
release_spec
.
iFrame
"Hlk Hlked"
.
iSplitL
.
*
iExists
x
.
by
iFrame
.
*
wp_seq
.
done
.
+
admit
.
+
admit
.
+
admit
.

(* server side *)
iL
ö
b
as
"IH"
.
wp_rec
.
wp_let
.
wp_bind
(!
_
)%
E
.
iInv
N
as
">[Hinv[Hinv[HinvHinv]]]"
"Hclose"
.
+
admit
.
+
iDestruct
"Hinv"
as
(
x
)
"(Hp & Hx & Ho1 & Ho4)"
.
iIntros
(
HN
)
"#Hh"
.
rewrite
/
doOp_triple
/
atomic_triple
.
iIntros
(
P
Q
)
"#Hvs"
.
iIntros
"!# HP"
.
wp_rec
.
wp_let
.
wp_bind
(!
_
)%
E
.
iVs
(
"Hvs"
with
"HP"
)
as
(
xs
)
"[[Hp [[Ho2  Ho1] #Hf]] Hvs']"
.

rewrite
/
p_inv
.
iDestruct
"Hp"
as
"[Hp  [Hp  [Hp  Hp]]]"
.
+
iDestruct
"Hp"
as
(
y
)
"(Hp & Ho1 & Ho3)"
.
wp_load
.
iDestruct
"Hvs'"
as
"[_ Hvs']"
.
iVs
(
"Hvs'"
$!
#()
with
"[]"
)
as
"HQ"
.
{
iSplitL
"Ho2"
;
first
by
iLeft
.
iSplitR
;
first
auto
.
iLeft
.
iExists
y
.
by
iFrame
.
}
iVsIntro
.
wp_match
.
eauto
.
+
iDestruct
"Hp"
as
(
x
)
"(Hp & Hx & Ho1 & Ho4)"
.
wp_load
.
iAssert
(=
r
=>
own
γ
x
(((
1
/
4
)%
Qp
,
DecAgree
x
)
⋅
((
1
/
4
)%
Qp
,
DecAgree
x
)))%
I
with
"[Hx]"
as
"==>[Hx1 Hx2]"
.
{
iDestruct
(
own_update
with
"Hx"
)
as
"Hx"
;
last
by
iAssumption
.
replace
((
1
/
2
)%
Qp
)
with
(
1
/
4
+
1
/
4
)%
Qp
;
last
by
apply
Qp_div_S
.
by
apply
pair_l_frac_op'
.
}
wp_load
.
iVs
(
"H
close"
with
"[Hp Hx1 Ho2 Ho4]"
)
.
{
i
Next
.
iRight
.
iRight
.
iLeft
.
iExists
x
.
by
iFrame
.
}
iDestruct
"Hvs'"
as
"[Hvs' _]"
.
iVs
(
"H
vs'"
with
"[]"
)
as
"HP"
.
{
i
SplitR
"Ho1"
;
last
auto
.
iRight
.
iRight
.
iLeft
.
iExists
x
.
by
iFrame
.
}
iVsIntro
.
wp_match
.
wp_bind
(
f
x
).
iApply
wp_wand_r
.
iSplitR
;
first
by
iApply
"Hf"
.
iIntros
(
y
)
"%"
.
wp_value
.
iVsIntro
.
wp_bind
(
_
<
_
)%
E
.
iInv
N
as
">[Hinv[Hinv[HinvHinv]]]"
"Hclose"
.
*
admit
.
*
admit
.
*
iDestruct
"Hinv"
as
(
x'
)
"(Hp & Hx' & Ho2 & Ho4)"
.
destruct
(
decide
(
x
=
x'
))
as
[>
Hneq
]
;
last
by
admit
.
wp_store
.
iCombine
"Hx2"
"Hx'"
as
"Hx"
.
iDestruct
(
own_update
with
"Hx"
)
as
"==>Hx"
;
first
by
apply
pair_l_frac_op
.
rewrite
Qp_div_S
.
iVs
(
"Hclose"
with
"[Hp Hx Ho1 Ho4]"
).
{
iNext
.
rewrite
/
srv_inv
.
iRight
.
iRight
.
iRight
.
iExists
x'
,
y
.
by
iFrame
.
}
iVsIntro
.
wp_seq
.
iApply
(
"IH"
with
"Ho2"
).
*
admit
.
+
admit
.
+
admit
.
Admitted
.
\ No newline at end of file
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