Esempio n. 1
0
        public bool TryAdd(TKey key, object obj)
        {
            // prefer reader

            //var incr = Interlocked.Increment(ref _locker);
            //if (incr != 1L)
            {
                var sw = new SpinWait();
                while (true)
                {
                    var existing = Interlocked.CompareExchange(ref _locker, 1, 0);
                    if (existing == 0)
                    {
                        break;
                    }
                    sw.SpinOnce();
                    //if (sw.NextSpinWillYield)
                    //{
                    //    sw.Reset();
                    //}
                }
            }

            var h     = GCHandle.Alloc(obj, GCHandleType.Weak);
            var added = _inner.TryAdd(key, h);

            if (!added)
            {
                h.Free();
            }

            Volatile.Write(ref _locker, 0L);
            return(added);
        }