public bool Close ()
{
int old, newRoot;
int c;
CSnziState s;
do {
old = root;
Decode (old, out c, out s);
if (s != CSnziState.Open)
return false;
newRoot = Encode (c, CSnziState.Closed);
} while (Interlocked.CompareExchange (ref root, newRoot, old) != old);
return c == 0;
}