private bool RDCSS_ROOT(INode <K, V> ov, MainNode <K, V> expectedmain, INode <K, V> nv) { RDCSS_Descriptor <K, V> desc = new RDCSS_Descriptor <K, V>(ov, expectedmain, nv); if (CAS_ROOT(ov, desc)) { RDCSS_Complete(false); return /* READ */ (desc.committed); } else { return(false); } }
private INode <K, V> RDCSS_Complete(bool abort) { while (true) { Object v = /* READ */ root; if (v is INode <K, V> ) { return((INode <K, V>)v); } else if (v is RDCSS_Descriptor <K, V> ) { RDCSS_Descriptor <K, V> desc = (RDCSS_Descriptor <K, V>)v; INode <K, V> ov = desc.old; MainNode <K, V> exp = desc.expectedmain; INode <K, V> nv = desc.nv; if (abort) { if (CAS_ROOT(desc, ov)) { return(ov); } else { // return RDCSS_Complete (abort); // tailrec continue; } } else { MainNode <K, V> oldmain = ov.gcasRead(this); if (oldmain == exp) { if (CAS_ROOT(desc, nv)) { desc.committed = true; return(nv); } else { // return RDCSS_Complete (abort); // tailrec continue; } } else { if (CAS_ROOT(desc, ov)) { return(ov); } else { // return RDCSS_Complete (abort); // tailrec continue; } } } } throw new RuntimeException("Should not happen"); } }