Library zoo_parabs.waiter

From zoo Require Import
  prelude.
From zoo.language Require Import
  notations.
From zoo.diaframe Require Import
  diaframe.
From zoo_std Require Import
  condition
  mutex.
From zoo_saturn Require Import
  mpmc_queue_1.
From zoo_parabs Require Export
  base
  waiter__code.
From zoo_parabs Require Import
  base
  waiter__types.
From zoo Require Import
  options.

Implicit Types b : bool.
Implicit Types 𝑡 : location.
Implicit Types v t mtx cond : val.

Class WaiterG Σ `{zoo_G : !ZooG Σ} :=
  { #[local] waiter_G_mutex_G :: MutexG Σ
  }.

Definition waiter_Σ :=
  #[mutex_Σ
  ].
#[global] Instance subG_ws_hub_Σ Σ `{zoo_G : !ZooG Σ} :
  subG waiter_Σ Σ
  WaiterG Σ.

Section waiter_G.
  Context `{waiter_G : WaiterG Σ}.

  #[local] Definition inv_inner 𝑡 : iProp Σ :=
     b,
    𝑡.[flag] #b.
  #[local] Instance : CustomIpat "inv_inner" :=
    " ( %b & H𝑡_flag ) ".
  Definition waiter_inv t : iProp Σ :=
     𝑡 mtx cond,
    t = #𝑡
    𝑡.[mutex] mtx
    mutex_inv mtx (inv_inner 𝑡)
    𝑡.[condition] cond
    condition_inv cond.
  #[local] Instance : CustomIpat "inv" :=
    " ( %𝑡 & %mtx & %cond & -> & #H𝑡_mutex & #Hmtx_inv & #H𝑡_condition & #Hcond_inv ) ".

  #[global] Instance waiter_inv_persistent t :
    Persistent (waiter_inv t).

  Lemma waiter٠create𑁒spec :
    {{{
      True
    }}}
      waiter٠create ()
    {{{
      t
    , RET t;
      waiter_inv t
    }}}.

  Lemma waiter٠notify𑁒spec t :
    {{{
      waiter_inv t
    }}}
      waiter٠notify t
    {{{
      b
    , RET #b;
      True
    }}}.

  Lemma waiter٠prepare_wait𑁒spec t :
    {{{
      waiter_inv t
    }}}
      waiter٠prepare_wait t
    {{{
      RET ();
      True
    }}}.

  Lemma waiter٠cancel_wait𑁒spec t :
    {{{
      waiter_inv t
    }}}
      waiter٠cancel_wait t
    {{{
      b
    , RET #b;
      True
    }}}.

  Lemma waiter٠commit_wait𑁒spec t :
    {{{
      waiter_inv t
    }}}
      waiter٠commit_wait t
    {{{
      RET ();
      True
    }}}.
End waiter_G.

From zoo_parabs Require
  waiter__opaque.

#[global] Opaque waiter_inv.