use corundum::stm::Chaperon; use corundum::*; use corundum::open_flags::*; corundum::pool!(pool1); corundum::pool!(pool2); type P1 = pool1::Allocator; type P2 = pool2::Allocator; struct Root { val: PRefCell, idx: PRefCell, } impl Default for Root { fn default() -> Self { Root { val: PRefCell::new(0.0), idx: PRefCell::new(0), } } } fn main() { let n1 = P1::open::>("fibo1.pool", O_CFNE).unwrap(); let n2 = P2::open::>("fibo2.pool", O_CFNE).unwrap(); while !Chaperon::session("fibo.pool", || { let n1_val = 1f64.max(*n1.val.borrow()); let n1_idx = *n1.idx.borrow(); if n1_idx >= 100 { return true; } let n2_val = P2::transaction(|j| { let mut n2 = n2.val.borrow_mut(j); let old_n2 = *n2; *n2 = n1_val; old_n2 }).unwrap(); P1::transaction(|j| { let mut n1_idx = n1.idx.borrow_mut(j); let mut n1 = n1.val.borrow_mut(j); *n1 += n2_val; *n1_idx += 1; }).unwrap(); false }).unwrap() {} let n1 = n1.val.read(); let n2 = n2.val.read(); println!("n1 = {} (usage = {})", n1, P1::used()); println!("n2 = {} (usage = {})", n2, P2::used()); assert_eq!((n2, n1), calc(1.0, 1.0, n1)); fn calc(n1: f64, n2: f64, stop: f64) -> (f64, f64) { if n1 >= stop { return (n2, n1); } else { calc(n1 + n2, n1, stop) } } }