Esempio n. 1
0
        public static void RecycleId(int id)
        {
            if (id == IdNone)
            {
                return;
            }

            var priorIdDispenser = Volatile.Read(ref s_idDispenser);

            for (;;)
            {
                var updatedIdDispenser = s_idDispenser.RecycleId(id);
                var interlockedResult  = Interlocked.CompareExchange(ref s_idDispenser, updatedIdDispenser, priorIdDispenser);
                if (object.ReferenceEquals(priorIdDispenser, interlockedResult))
                {
                    break;
                }
                priorIdDispenser = interlockedResult; // we already have a volatile read that we can reuse for the next loop
            }
        }