Library zoo_parabs.waiters
Require Import zoo.prelude.
Require Import zoo.base.
Require Export zoo_parabs.base.
Require Export zoo_parabs.waiters__code.
Require Import zoo_parabs.waiters__types.
Require Import zoo.options.
Implicit Type b : bool.
Implicit Type v t waiters queue : val.
Implicit Type π€πππ‘πππ ππ’ππ’π : list val.
Class WaitersG Ξ£ `{zooΫ°G : !ZooG Ξ£} :=
{ #[local] waitersΫ°GΫ°queueΫ°G :: QueueMpmc1G Ξ£
; #[local] waitersΫ°GΫ°waiterΫ°G :: WaiterG Ξ£
}.
Definition waitersΫ°Ξ£ :=
#[queue_mpmc_1Ϋ°Ξ£
; waiterΫ°Ξ£
].
#[global] Instance subGο½°ws_hub_Ξ£ Ξ£ `{zooΫ°G : !ZooG Ξ£} :
subG waitersΫ°Ξ£ Ξ£ β
WaitersG Ξ£.
Section waitersΫ°G.
Context `{waitersΫ°G : WaitersG Ξ£}.
#[local] Definition waitersΫ°invΫ°inner queue : iProp Ξ£ :=
β ππ’ππ’π,
queue_mpmc_1Ϋ°model queue ππ’ππ’π β
[β list] π€πππ‘ππ β ππ’ππ’π,
waiterΫ°inv π€πππ‘ππ.
#[local] Instance : CustomIpat "invΫ°inner" :=
" ( %ππ’ππ’π & >Hqueue_model & Hππ’ππ’π ) ".
Definition waitersΫ°inv t sz : iProp Ξ£ :=
β waiters π€πππ‘πππ queue,
βt = (waiters, queue)%Vβ β
arrayΫ°model waiters Discard π€πππ‘πππ β
βlength π€πππ‘πππ = szβ β
([β list] π€πππ‘ππ β π€πππ‘πππ , waiterΫ°inv π€πππ‘ππ) β
queue_mpmc_1Ϋ°inv queue (nroot.@"queue") β
inv (nroot.@"inv") (waitersΫ°invΫ°inner queue).
#[local] Instance : CustomIpat "inv" :=
" ( %waiters & %π€πππ‘πππ & %queue & -> & #Hwaiters & %Hπ€πππ‘ππs & #Hπ€πππ‘πππ & #Hqueue_inv & #Hinv ) ".
#[global] Instance waitersΫ°invο½°persistent t sz :
Persistent (waitersΫ°inv t sz).
Lemma waitersΩ createο½°spec sz :
(0 β€ sz)%Z β
{{{
True
}}}
waitersΩ create #sz
{{{
t
, RET t;
waitersΫ°inv t βsz
}}}.
Lemma waitersΩ notifyο½°spec t (sz : nat) i :
(0 β€ i < sz)%Z β
{{{
waitersΫ°inv t sz
}}}
waitersΩ notify t #i
{{{
RET ();
True
}}}.
Lemma waitersΩ notify_oneο½°spec t sz :
{{{
waitersΫ°inv t sz
}}}
waitersΩ notify_one t
{{{
RET ();
True
}}}.
Lemma waitersΩ notify_allο½°spec t sz :
{{{
waitersΫ°inv t sz
}}}
waitersΩ notify_all t
{{{
RET ();
True
}}}.
Lemma waitersΩ prepare_waitο½°spec t (sz : nat) i :
(0 β€ i < sz)%Z β
{{{
waitersΫ°inv t sz
}}}
waitersΩ prepare_wait t #i
{{{
RET ();
True
}}}.
Lemma waitersΩ cancel_waitο½°spec t (sz : nat) i :
(0 β€ i < sz)%Z β
{{{
waitersΫ°inv t sz
}}}
waitersΩ cancel_wait t #i
{{{
b
, RET #b;
True
}}}.
Lemma waitersΩ commit_waitο½°spec t (sz : nat) i :
(0 β€ i < sz)%Z β
{{{
waitersΫ°inv t sz
}}}
waitersΩ commit_wait t #i
{{{
RET ();
True
}}}.
End waitersΫ°G.
Require zoo_parabs.waiters__opaque.
#[global] Opaque waitersΫ°inv.
Require Import zoo.base.
Require Export zoo_parabs.base.
Require Export zoo_parabs.waiters__code.
Require Import zoo_parabs.waiters__types.
Require Import zoo.options.
Implicit Type b : bool.
Implicit Type v t waiters queue : val.
Implicit Type π€πππ‘πππ ππ’ππ’π : list val.
Class WaitersG Ξ£ `{zooΫ°G : !ZooG Ξ£} :=
{ #[local] waitersΫ°GΫ°queueΫ°G :: QueueMpmc1G Ξ£
; #[local] waitersΫ°GΫ°waiterΫ°G :: WaiterG Ξ£
}.
Definition waitersΫ°Ξ£ :=
#[queue_mpmc_1Ϋ°Ξ£
; waiterΫ°Ξ£
].
#[global] Instance subGο½°ws_hub_Ξ£ Ξ£ `{zooΫ°G : !ZooG Ξ£} :
subG waitersΫ°Ξ£ Ξ£ β
WaitersG Ξ£.
Section waitersΫ°G.
Context `{waitersΫ°G : WaitersG Ξ£}.
#[local] Definition waitersΫ°invΫ°inner queue : iProp Ξ£ :=
β ππ’ππ’π,
queue_mpmc_1Ϋ°model queue ππ’ππ’π β
[β list] π€πππ‘ππ β ππ’ππ’π,
waiterΫ°inv π€πππ‘ππ.
#[local] Instance : CustomIpat "invΫ°inner" :=
" ( %ππ’ππ’π & >Hqueue_model & Hππ’ππ’π ) ".
Definition waitersΫ°inv t sz : iProp Ξ£ :=
β waiters π€πππ‘πππ queue,
βt = (waiters, queue)%Vβ β
arrayΫ°model waiters Discard π€πππ‘πππ β
βlength π€πππ‘πππ = szβ β
([β list] π€πππ‘ππ β π€πππ‘πππ , waiterΫ°inv π€πππ‘ππ) β
queue_mpmc_1Ϋ°inv queue (nroot.@"queue") β
inv (nroot.@"inv") (waitersΫ°invΫ°inner queue).
#[local] Instance : CustomIpat "inv" :=
" ( %waiters & %π€πππ‘πππ & %queue & -> & #Hwaiters & %Hπ€πππ‘ππs & #Hπ€πππ‘πππ & #Hqueue_inv & #Hinv ) ".
#[global] Instance waitersΫ°invο½°persistent t sz :
Persistent (waitersΫ°inv t sz).
Lemma waitersΩ createο½°spec sz :
(0 β€ sz)%Z β
{{{
True
}}}
waitersΩ create #sz
{{{
t
, RET t;
waitersΫ°inv t βsz
}}}.
Lemma waitersΩ notifyο½°spec t (sz : nat) i :
(0 β€ i < sz)%Z β
{{{
waitersΫ°inv t sz
}}}
waitersΩ notify t #i
{{{
RET ();
True
}}}.
Lemma waitersΩ notify_oneο½°spec t sz :
{{{
waitersΫ°inv t sz
}}}
waitersΩ notify_one t
{{{
RET ();
True
}}}.
Lemma waitersΩ notify_allο½°spec t sz :
{{{
waitersΫ°inv t sz
}}}
waitersΩ notify_all t
{{{
RET ();
True
}}}.
Lemma waitersΩ prepare_waitο½°spec t (sz : nat) i :
(0 β€ i < sz)%Z β
{{{
waitersΫ°inv t sz
}}}
waitersΩ prepare_wait t #i
{{{
RET ();
True
}}}.
Lemma waitersΩ cancel_waitο½°spec t (sz : nat) i :
(0 β€ i < sz)%Z β
{{{
waitersΫ°inv t sz
}}}
waitersΩ cancel_wait t #i
{{{
b
, RET #b;
True
}}}.
Lemma waitersΩ commit_waitο½°spec t (sz : nat) i :
(0 β€ i < sz)%Z β
{{{
waitersΫ°inv t sz
}}}
waitersΩ commit_wait t #i
{{{
RET ();
True
}}}.
End waitersΫ°G.
Require zoo_parabs.waiters__opaque.
#[global] Opaque waitersΫ°inv.