public bool Arrive ()
{
bool arrivedAtParent = false;
int x;
do {
x = count;
if (x == 0 && !arrivedAtParent) {
if (parent.Arrive ())
arrivedAtParent = true;
else
return false;
}
} while (Interlocked.CompareExchange (ref count, x + 1, x) != x);
if (arrivedAtParent && x != 0)
parent.Depart ();
return true;
}