Exemplo n.º 1
0
    void InitEventInvoker(Int32 size)
    {
        // allocate dictionary with pre-defined capacity
        _eventsTriggered = new Dictionary <Int32, HashSet <Int32>[]>(size);

        // init trigger set pool with empty hashsets
        TriggeredSetPool.Init(size);
    }
Exemplo n.º 2
0
    void InvokeEvents(Quantum.Frame f)
    {
        // store previous frame value so we can restore it
        var previousFrameValue = _frame;

        try {
            // set current frame we are invoking the events for
            _frame = f;

            HashSet <Int32>[] triggered;

            // grab or create new triggered set lookup
            if (_eventsTriggered.TryGetValue(f.Number, out triggered) == false)
            {
                _eventsTriggered.Add(f.Number, triggered = TriggeredSetPool.Alloc());
            }

            // grab event head
            var head = (IEventBaseInternal)(((IFrameInternal)f).EventHead);

            // step over each event
            while (head != null)
            {
                if (head.EventIsSynced)
                {
                    if (f.IsVerified)
                    {
                        RaiseEvent(head);
                    }
                }
                else
                {
                    // calculate hash code
                    var hash = head.GetHashCode();

                    // if this was already raised, do nothing
                    if (triggered[head.Id].Contains(hash) == false)
                    {
                        // dont trigger this again
                        triggered[head.Id].Add(hash);

                        // trigger event
                        RaiseEvent(head);
                    }
                }

                // next
                head = head.EventTail;
            }

            // frame is verified?
            if (f.IsVerified)
            {
                // remove triggered set
                _eventsTriggered.Remove(f.Number);

                // free it
                TriggeredSetPool.Free(triggered);
            }
        }
        finally {
            // restore frame value
            _frame = previousFrameValue;
        }
    }