use super::*;
use error::*;
impl Slab {
pub fn new_memo_basic (&self, subject_id: Option<SubjectId>, parents: MemoRefHead, body: MemoBody) -> MemoRef {
self.new_memo(subject_id, parents, body)
}
pub fn new_memo_basic_noparent (&self, subject_id: Option<SubjectId>, body: MemoBody) -> MemoRef {
self.new_memo(subject_id, MemoRefHead::Null, body)
}
pub fn remotize_memo_ids( &self, memo_ids: &[MemoId] ) -> Result<(),StorageOpDeclined>{
let mut memorefs : Vec<MemoRef> = Vec::with_capacity(memo_ids.len());
{
let memorefs_by_id = self.memorefs_by_id.read().unwrap();
for memo_id in memo_ids.iter() {
if let Some(memoref) = memorefs_by_id.get(memo_id) {
memorefs.push( memoref.clone() )
}
}
}
for memoref in memorefs {
self.remotize_memoref(&memoref)?;
}
Ok(())
}
pub fn remotize_memo_ids_wait( &self, memo_ids: &[MemoId], ms: u64 ) -> Result<(),StorageOpDeclined> {
use std::time::{Instant,Duration};
let start = Instant::now();
let wait = Duration::from_millis(ms);
use std::thread;
loop {
if start.elapsed() > wait{
return Err(StorageOpDeclined::InsufficientPeering)
}
#[allow(unreachable_patterns)]
match self.remotize_memo_ids( memo_ids ) {
Ok(_) => {
return Ok(())
},
Err(StorageOpDeclined::InsufficientPeering) => {}
Err(e) => return Err(e)
}
thread::sleep(Duration::from_millis(50));
}
}
pub fn presence_for_origin (&self, origin_slabref: &SlabRef ) -> SlabPresence {
SlabPresence {
slab_id: self.id,
address: origin_slabref.get_return_address(),
lifetime: SlabAnticipatedLifetime::Unknown
}
}
pub fn slabref_from_local_slab(&self, peer_slab: &Self) -> SlabRef {
let presence = SlabPresence{
slab_id: peer_slab.id,
address: TransportAddress::Local,
lifetime: SlabAnticipatedLifetime::Unknown
};
self.assert_slabref(peer_slab.id, &vec![presence])
}
pub fn slabref_from_presence(&self, presence: &SlabPresence) -> Result<SlabRef,&str> {
match presence.address {
TransportAddress::Simulator => {
return Err("Invalid - Cannot create simulator slabref from presence")
}
TransportAddress::Local => {
return Err("Invalid - Cannot create local slabref from presence")
}
_ => { }
};
Ok(self.assert_slabref( presence.slab_id, &vec![presence.clone()] ))
}
}