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); } } }
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; } } } } } } }