Exemple #1
0
        public void TestAddRemove()
        {
            Assert.IsNull(_eventTypeIndex.Get(_typeOne));
            Assert.IsNull(_eventTypeIndex.Get(_typeTwo));

            var entryOne = _indexBuilder.Add(_valueSetOne, _callbackOne, _lockFactory);

            _indexBuilder.Add(_valueSetTwo, _callbackTwo, _lockFactory);

            Assert.IsTrue(_eventTypeIndex.Get(_typeOne) != null);
            Assert.IsTrue(_eventTypeIndex.Get(_typeTwo) != null);

            _indexBuilder.Remove(_callbackOne, entryOne);
            _indexBuilder.Add(_valueSetOne, _callbackOne, _lockFactory);
            _indexBuilder.Remove(_callbackOne, entryOne);
        }
        /// <summary>
        /// Add a filter to the event type index structure, and to the filter subtree.
        /// Throws an IllegalStateException exception if the callback is already registered.
        /// </summary>
        /// <param name="filterValueSet">is the filter information</param>
        /// <param name="filterCallback">is the callback</param>
        /// <param name="lockFactory">The lock factory.</param>
        /// <returns></returns>
        /// <exception cref="IllegalStateException">Callback for filter specification already exists in collection</exception>
        public FilterServiceEntry Add(FilterValueSet filterValueSet, FilterHandle filterCallback, FilterServiceGranularLockFactory lockFactory)
        {
            using (Instrument.With(
                       i => i.QFilterAdd(filterValueSet, filterCallback),
                       i => i.AFilterAdd()))
            {
                var eventType = filterValueSet.EventType;

                // Check if a filter tree exists for this event type
                var rootNode = _eventTypeIndex.Get(eventType);

                // Make sure we have a root node
                if (rootNode == null)
                {
                    using (_callbacksLock.Acquire())
                    {
                        rootNode = _eventTypeIndex.Get(eventType);
                        if (rootNode == null)
                        {
                            rootNode = new FilterHandleSetNode(lockFactory.ObtainNew());
                            _eventTypeIndex.Add(eventType, rootNode);
                        }
                    }
                }

                // GetInstance add to tree
                var path      = IndexTreeBuilder.Add(filterValueSet, filterCallback, rootNode, lockFactory);
                var pathArray = path.Select(p => p.ToArray()).ToArray();
                var pair      = new EventTypeIndexBuilderValueIndexesPair(filterValueSet, pathArray);

                // for non-isolatable callbacks the consumer keeps track of tree location
                if (_isolatableCallbacks == null)
                {
                    return(pair);
                }

                // for isolatable callbacks this class is keeping track of tree location
                using (_callbacksLock.Acquire()) {
                    _isolatableCallbacks.Put(filterCallback, pair);
                }

                return(null);
            }
        }
 public void TestGet()
 {
     Assert.AreEqual(_handleSetNode, _testIndex.Get(_testEventType));
 }