pub enum PlaceKind {
Space {
buf: BufferId,
k: usize,
},
Data {
buf: BufferId,
k: usize,
},
Ready {
sem: SemId,
receiver: Site,
k: usize,
},
Valid {
sem: SemId,
receiver: Site,
k: usize,
},
McastData {
group: GroupId,
receiver: Site,
k: usize,
},
Pc {
site: Site,
engine: Engine,
k: usize,
},
Arrival {
sem: SemId,
at: Site,
k: usize,
},
}Variants§
Space
Data
Ready
Valid
McastData
Pc
Arrival
The k-th post landed at at on a RENDEZVOUS semaphore. A rendezvous is not a hand-off: a post is
not consumed by one reader, because every engine program at the site that waits reads the same
count. So this place has one producer (the post) and as many consumers as the site has waiters —
one for a gather (its root), every program at the site for a release — and a wait for c consumes
the first c posts at its own site. The liveness proof is the same DAG argument either way.
★ WHY NOT Ready. A ready counter is modelled per RECEIVER SITE and paired one round at a time
with the sender’s wait; a rendezvous is waited on by several engines of one site at once, and that
pairing does not describe it. Posts are keyed by the site they LAND on, which is exactly the
counter a wait there reads.
Trait Implementations§
Source§impl<'de> Deserialize<'de> for PlaceKind
impl<'de> Deserialize<'de> for PlaceKind
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl Ord for PlaceKind
impl Ord for PlaceKind
Source§impl PartialOrd for PlaceKind
impl PartialOrd for PlaceKind
impl Copy for PlaceKind
impl Eq for PlaceKind
impl StructuralPartialEq for PlaceKind
Auto Trait Implementations§
impl Freeze for PlaceKind
impl RefUnwindSafe for PlaceKind
impl Send for PlaceKind
impl Sync for PlaceKind
impl Unpin for PlaceKind
impl UnsafeUnpin for PlaceKind
impl UnwindSafe for PlaceKind
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.