Esempio n. 1
0
        static public Linkup <T> Update(ref Linkup <T> linkup, T value)
        {
            var _linkup = new Linkup <T>(value);

            while (true)
            {
                var _junction = linkup;
                if (_junction == null)
                {
                    _linkup.m_Count  = 1;
                    _linkup.m_Linkup = null;
                }
                else
                {
                    _linkup.m_Count  = _junction.m_Count + 1;
                    _linkup.m_Linkup = _junction;
                }
                if (object.ReferenceEquals(Interlocked.CompareExchange(ref linkup, _linkup, _junction), _junction))
                {
                    return(_linkup);
                }
            }
        }
Esempio n. 2
0
        private void Add <T>(Func <T> function)
            where T : class
        {
            var _container = Container.Lookup <T> .Buffer[this.m_Index];

            while (true)
            {
                var _instance = _container.Instance;
                if (_instance == Container.Store <T> .None)
                {
                    if (Interlocked.CompareExchange(ref _container.Instance, function, _instance) == _instance)
                    {
                        Linkup <Func <T> > .Update(ref _container.Linkup, function);

                        while (true)
                        {
                            var _enumerable = _container.Enumerable;
                            var _linkup     = _container.Linkup;
                            if (_linkup == null)
                            {
                                if (Interlocked.CompareExchange(ref _container.Enumerable, Container.Store <T> .Empty, _enumerable) == _enumerable)
                                {
                                    return;
                                }
                            }
                            else
                            {
                                if (Interlocked.CompareExchange(ref _container.Enumerable, Multiton <T> .Create(_linkup), _enumerable) == _enumerable)
                                {
                                    return;
                                }
                            }
                        }
                    }
                }
                else
                {
                    if (Interlocked.CompareExchange(ref _container.Instance, Container.Store <T> .Multiple, _instance) == _instance)
                    {
                        Linkup <Func <T> > .Update(ref _container.Linkup, function);

                        while (true)
                        {
                            var _enumerable = _container.Enumerable;
                            var _linkup     = _container.Linkup;
                            if (_linkup == null)
                            {
                                if (Interlocked.CompareExchange(ref _container.Enumerable, Container.Store <T> .Empty, _enumerable) == _enumerable)
                                {
                                    return;
                                }
                            }
                            else
                            {
                                if (Interlocked.CompareExchange(ref _container.Enumerable, Multiton <T> .Create(_linkup), _enumerable) == _enumerable)
                                {
                                    return;
                                }
                            }
                        }
                    }
                }
            }
        }