public void Arrive() { bool succ = false; int undoArr = 0; while (!succ) { int x = var; short c, v; Decode(x, out c, out v); if (c >= 1) { if (Interlocked.CompareExchange(ref var, Encode((short)(c + 1), v), x) == x) { break; } } if (c == 0) { int temp = Encode(-1, (short)(v + 1)); if (Interlocked.CompareExchange(ref var, temp, x) == x) { succ = true; c = -1; v += 1; x = temp; } } if (c == -1) { parent.Arrive(); if (Interlocked.CompareExchange(ref var, Encode(1, v), x) != x) { undoArr += 1; } } } for (int i = 0; i < undoArr; i++) { parent.Depart(); } }
public void Depart() { int c = var--; if (c == 1) { parent.Depart(); } }
public void Decrement() { ISnziNode node = nodes[GetRandomIndex()]; node.Depart(); }